Ultrasonic ranging
From Mech
Original Assignment
In this project you will demonstrate that you can measure distances using an ultrasonic transmitter and receiver, at distances up to a few meters. While you could build from components (see, for example, this website), in this project you will use this pre-packaged PING))) ultrasonic sensor. Your results can be displayed on an LCD screen (see, e.g., C Example: Serial LCD or C Example: Parallel Interfacing with LCDs) or on a PC using the USB/RS-232 cable (see PIC RS232).
Overview
Circuit
Code
#include <18f4520.h> #fuses HS,NOLVP,NOWDT,NOPROTECT #use delay(clock=40000000) #use rs232(baud=19200, UART1) // hardware UART; uses RC6/TX and RC7/RX int16 timer; float distance; #INT_EXT // designates that this is the routine to call when pin RB0/INTO changes state void INT0isr() { SET_TIMER1(0); // initialize timer 1 to 0 } #INT_EXT1 // designates that this is the routine to call when pin RB1/INT1 changes state void INT1isr() { timer=GET_TIMER1(); // records timer 1 value distance=timer*.0000004*343; //scale timer, .0000004 represents the .8 //microsecond increments of Timer 1, 2 is to divide the distance by half, 343 //is the speed of sound in meters, which can be changed if(distance >.01) { printf("%f meters\n",distance); //print out the Value in meters } } void main() { enable_interrupts(INT_EXT); enable_interrupts(INT_EXT1); enable_interrupts(GLOBAL); ext_int_edge(0, L_TO_H); // interrupt on INT0/RB0 pin, low to high transition ext_int_edge(1, H_TO_L); // interrupt on INT1/RB1 pin, high to low transition setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // start timer T1, which counts in .8 microsecond increments while(true) { output_high(PIN_C5); //send signal to Ultrasonic Sensor for 5 microseconds delay_us(5); output_low(PIN_C5); input(PIN_C5); // set pin to input, since the sensor has one pin for I/O, pin c5 can not be outputting a signal delay_ms(200); //changeable delay }