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