Project 2 - Measuring distance of an object using ultrasonic sensor (HC-SR04)
1)
Aim:
To implement code for “Measuring distance of an object using ultrasonic distance sensor (HC-SR04).
Objective:
- Measuring the distance of an object using Ultrasonic Distance Sensor (HC-SR04)
- Usage of Input Capture Mode
Highlights:
- Measuring the distance travelled by the wave to the object and gets bounced back from the object to sensor.
- Measuring Pulse width using Input Capture Mode
Deliverables:
- The distance travelled by a wave to the object for which we want to measure the distance using Ultrasonic Distance Sensor (HC-SR04).
- Measuring Pulse width using Input Capture Mode of Timer 1
Detail view about ULtrasonic sensor HC-SRO4:
CODE:-
#include <avr/io.h>
#define F_CPU 16000000ul
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdlib.h>
#define lcd_data_dir DDRD // define lcd data port direction
#define lcd_command_dir DDRC // define lcd command port direction
#define lcd_data_port PORTD //define lcd data port
#define lcd_command_port PORTC // define lcd data port
#define EN PC2 // define enable
#define RW PC3 // define read/write
#define RS PC4 // define register select
void lcd_command(char); // lcd command write function
void lcd_char(char); // lcd data write function
void lcd_init(void); // lcd initialize function
void lcd_string(char*); // send dtring to lcd
void lcd_string_xy (char,char,char*); // send row postion
void lcd_command (char cmd) // lcd command write function
{
lcd_data_port = cmd; // write command to lcd data port
lcd_command_port&=~((1<<RS)|(1<<RW)); // make RS low and RW low
lcd_command_port|= (1<<EN); // high to low transition on EN
_delay_ms(1);
lcd_command_port&=~(1<<EN);
_delay_ms(2); // delay provided
}
void lcd_char(char char_data) // lcd data write function
{
lcd_data_port= char_data; // write data to lcd data port
lcd_command_port&=~(1<<RW); // make RW low(write)
lcd_command_port|=((1<<EN)|(1<<RS)); // make RS high and high to low tnasition
_delay_ms(1);
lcd_command_port&=~(1<<EN);
_delay_ms(1);
}
void lcd_init(void) // lcd initialize function
{
lcd_command_dir|= (1<<RS)|(1<<RW)|(1<<EN); // lcd command port direction as output
lcd_data_dir = 0xff; //make lcd data port direction as output
_delay_ms(20); // wait
lcd_command(0x38); // 16x2 lcd 8 bit
lcd_command(0x0C); // display On
lcd_command(0x06); // auto increment cursor
lcd_command(0x01); // clear lcd command
lcd_command(0x80); // 8 is the line and 0 is oth position
}
void lcd_string(char *str) // send string to lcd function
{
int i;
for(i=0;str[i]!=0;i++) // sending each char string till tje null
{
lcd_char (str[i]); // call lcd data write
}
}
void lcd_string_xy(char row,char pos,char *str) // send string to lcd function
{
if (row == 1)
lcd_command((pos & 0x0f)|0x80);
else if (row == 2)
lcd_command((pos & 0x0f)|(0xC0));
lcd_string(str); // call lcd string function
}
#define trigger_pin PA0 // trigger pin
int TimerOverFlow = 0;
ISR(TIMER1_OVF_vect)
{
TimerOverFlow++; // increment timer overflow count
}
int main (void)
{
char string[10];
long count;
double distance;
DDRA = 0x01; // make trigger pin as output
PORTB = 0xff; // pull-up turn on
lcd_init();
lcd_string_xy(1,0,"ultrasonic");
sei(); // enable global interrupt
TIMSK = (1<< TOIE1); // enable timer 1 overflow interrupt
TCCR1A = 0; // set all bit to zero normal position
while(1)
{
PORTA |= (1<< trigger_pin);
_delay_ms(10);
PORTA &=(~(1<< trigger_pin));
TCNT1 = 0; //clear timer counter
TCCR1B = 0x41; // capture on rising edge,no pre scaler
TIFR = 1<<ICF1; // clear ICP flag
TIFR = 1<<TOV1; // clear timer overflow flag
while ((TIFR & (1<<ICF1)) == 0); // wait for rising edge
TCNT1 = 0; //clear timer counter
TCCR1B = 0x01; // capture on falling edge , no pre scaler
TIFR = 1<<ICF1; // clear ICP flag
TIFR = 1<<TOV1; // clear timer overflow flag
TimerOverFlow = 0; // clear timer overflow count
while ((TIFR & (1<< ICF1))== 0); // wait for falling edge
count = ICR1 +(65535 * TimerOverFlow); // take count
distance = (double)count/466.47;
dtostrf(distance,2,2,string); // distance to string
strcat(string,"cm"); // count unit
lcd_string_xy(2,0,"dist= ");
lcd_string_xy(2,7,string); // print distance
_delay_ms(200);
}
}

CIRCUIT DIAGRAM:-

OUTPUT:-

- 60.38 cm is distance of an object obtained.
RESULT:- Thus the implementation of code for "measuring distance of an object using ultrasonic distance sensor(HC-SR04) is done.
DESCRIPTION:-
The project is In this project, the implementation of code for “Measuring distance of an object using ultrasonic distance sensor (HC-SR04).We took the atemga 32, oscillator, HD-44780 and Ultrasonic distance sensor (HC-SR04). All comoponents are connecte to the show in above diagram.After the connections we write the code in above the diagram. Now we coming to the code four header files like avr/io.h,utill/delay.h,string.h and stdlib.h. After the write the header file we took the data direction, command direction and data port , command port.Also use the enable pin,RW,RS, pin.First write the command port .After the command port write a data port after the data port we took the init (intialize) it is nothing but the port pins . After the write a statement about count we took the ICR1+(65535*Timer over flow) and also write the distance=(double)/count/466.47; It is nothing but a formula of distance of ultrasonic distance sensor. Finally print the ultrasonic distcance value. The output is shown in the above and below the diagram.Sloved the problem.
