Ultrasonic range finder
I can't believe it - I wrote the code, plugged it in, and it worked first try.
I also separated my main.cpp file into accelerometer.cpp, dist.cpp, main.cpp, and main.h.
After a few simple tests, it looks like the sensor is accurate to within 1-2% - excessive for avoiding obstacles.
(Distance from sensor to my ceiling is around 165 cms)
Single sensor:
Multiple sensors:
(They were too close together, the 3rd one reflected into the 2nd, so it didn't register an obstacle)
#include "main.h"
//----------------- distance sensors -----------------
I2C dist_i2c(p9, p10);
int address = 0xE0;
const int CTRL_REG = 0x00;
const int RANGE_H = 0x02;
const int RANGE_L = 0x03;
bool dist_write_reg(int regno, int value) { // write value into register regno, return success
char data[2] = {regno, value};
return dist_i2c.write(address, data, 2) == 0;
}
bool dist_read_reg(int regno, int *value) { // read value from register regno, return success
char data = regno;
if (dist_i2c.write(address, &data, 1) == 0 && dist_i2c.read(address, &data, 1) == 0){
*value = data;
return true;
}
return false;
}
int read_dist_reg(){
int low, high;
if ( dist_read_reg(RANGE_H, &high) && dist_read_reg(RANGE_L, &low) )
return (high << 8) | low;
else
return -1;
}
void start(){
dist_write_reg(CTRL_REG, 0x51); //burst, range results in cms
}
void burst(){
dist_write_reg(CTRL_REG, 0x5C); // do a burst
}
void start_noburst(){
dist_write_reg(CTRL_REG, 0x57); // start ranging, no burst
}
int dist_get(int num){
//set which sensor to read
switch(num){
case 1:
address = 0xE0;
break;
case 2:
address = 0xE2;
break;
case 3:
address = 0xE4;
default:
break;
}
start(); //do burst, start ranging
wait(0.07); //wait 70ms
return read_dist_reg(); //return register value
}
dist dist_get_all(){
dist dist = {-1,-1,-1}; //create array
// start each sensor
address = 0xE0; //right
start_noburst();
address = 0xE2; //left
start_noburst();
address = 0xE4; //mid
start();
wait(0.07);
// store register values to array
address = 0xE0;
dist.right = read_dist_reg();
address = 0xE2;
dist.left = read_dist_reg();
address = 0xE4;
dist.mid = read_dist_reg();
return dist; //return array
}
void dist_regset(){
/*
dist_write_reg(CTRL_REG, 0xA0); // set address sequence
dist_write_reg(CTRL_REG, 0xAA);
dist_write_reg(CTRL_REG, 0xA5);
dist_write_reg(CTRL_REG, 0xE4); //E4
*/
}
0 comments
You need to log in to post a comment
