Sharp Long Range IR Sensor testing and calibrating

Dependencies:   mbed

main.cpp

Committer:
j_j205
Date:
2016-04-01
Revision:
0:d9f7e20a900f

File content as of revision 0:d9f7e20a900f:

#include "mbed.h"
#include <cmath> // pow

Serial pc(USBTX, USBRX);

DigitalOut led_red(LED_RED);
DigitalOut led_green(LED_GREEN);
AnalogIn sensor1(PTB2);
AnalogIn sensor2(PTB3);
float dist;

//float getDist(AnalogIn& sensor);
float distAdjL(double sensor_read);
float distAdjR(double sensor_read);

int main() 
{
    pc.baud(115200);
    
    float percent1 = 0.0;
    float voltage1 = 0.0;
    float percent2 = 0.0;
    float voltage2 = 0.0;
    int count;
    char choice;
    
    pc.printf("Enter 'c' for calibration mode or 't' for testing mode.\n");
    pc.printf("Press 'e' to exit.\n");
    choice = pc.getc();
    
    switch(choice)
    {
        case 'C':
        case 'c':    
            count = 5;
            led_red = 0;
            led_green = 1;
            pc.printf("\nMove target to listed distance and press space bar to measure\n");
            pc.printf("Press 'e' to exit.\n");
        
            pc.printf("\nDist  Perc1    Volt1    Perc2    Volt2");
            pc.printf("\n%*i", 4, count);
            choice = pc.getc();
            
            while(choice != 'q')
            {   
                led_red = 0;
                led_green = 1;
                for(int i = 0; i < 250; i++)
                {
                    percent1 += sensor1.read();
                    voltage1 += 3.3 * sensor1.read();
                    percent2 += sensor2.read();
                    voltage2 += 3.3 * sensor2.read();
                    wait(32e-3);
                }
                
                pc.printf(" %f %f %f %f", percent1/250.0, voltage1/250.0, percent2/250.0, voltage2/250.0 );
                percent1 = 0.0;
                voltage1 = 0.0;
                percent2 = 0.0;
                voltage2 = 0.0;
                count++;
                led_red = 1;
                led_green = 0;
                
                pc.printf("\n%*i", 4, count);
                choice = pc.getc();
            }
            break;
        
        case 'T':
        case 't':
            count = 5;
            pc.printf("\nMove target to distance and press space bar to measure\n");
            pc.printf("Press 'e' to exit.\n");
            
            pc.printf("\nDist  Meas1    AdjM1    Meas2    AdjM2");
            pc.printf("\n%*i", 4, count + 10);
            choice = pc.getc();
            
            while(choice != 'q')
            {
                led_red = 0;
                led_green = 1;
                for(int i = 0; i < 50; i++)
                {
                    percent1 += sensor1.read();
                    percent2 += sensor2.read();
                    wait(32e-3);
                }
                
                pc.printf(" %f %f %f %f", 3.5097*pow((percent1/50.0), -1.425), distAdjL(percent1/50.0), 3.4617*pow((percent2/50.0), -1.506), distAdjR(percent2/50.0) );
                percent1 = 0.0;
                percent2 = 0.0;
                count++;
                led_red = 1;
                led_green = 0; 
                
                pc.printf("\n%*i", 4, count);
                choice = pc.getc();              
            }
            break;
        
        case 'Q':
        case 'q':
            break;
        
        default:
            pc.printf("\nInvalid entry. You're fired.");
    }
}

float distAdjL(double sensor_read)
{
    double dist_meas = 3.5097*pow(sensor_read, -1.425);
    
    double read_error = (0.0052*pow(dist_meas, 2.0)) - (0.3218*dist_meas) 
                + 2.6653;
    
    return float(dist_meas + read_error);
}

float distAdjR(double sensor_read)
{
    double dist_meas = 3.4617*pow(sensor_read, -1.506);
    
    double read_error = (0.0062*pow(dist_meas, 2.0)) - (0.385*dist_meas)
                + 3.1692;
                
    return float(dist_meas + read_error);
}