Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of PsiSwarm-Headstart by
Diff: sensors.cpp
- Revision:
- 1:060690a934a9
- Parent:
- 0:d6269d17c8cf
- Child:
- 2:c6986ee3c7c5
--- a/sensors.cpp Thu Feb 04 21:48:54 2016 +0000
+++ b/sensors.cpp Thu Mar 03 23:21:47 2016 +0000
@@ -1,5 +1,5 @@
/* University of York Robotics Laboratory PsiSwarm Library: Sensor Functions Source File
- *
+ *
* File: sensors.cpp
*
* (C) Dept. Electronics & Computer Science, University of York
@@ -21,109 +21,133 @@
// The ultrasonic sensor needs a start command to be sent: this is done by calling update_ultrasonic_measure().
// It can be set to automatically refresh at 10Hz by called enable_ultrasonic_ticker and disable with disabled_ultrasonic_ticker
-void enable_ultrasonic_ticker(){
- ultrasonic_ticker.attach_us(update_ultrasonic_measure,100000);
+void enable_ultrasonic_ticker()
+{
+ ultrasonic_ticker.attach_us(update_ultrasonic_measure,100000);
}
-void disable_ultrasonic_ticker(){
- ultrasonic_ticker.detach();
+void disable_ultrasonic_ticker()
+{
+ ultrasonic_ticker.detach();
}
-void update_ultrasonic_measure(){
- if(waiting_for_ultrasonic == 0){
+void update_ultrasonic_measure()
+{
+ if(waiting_for_ultrasonic == 0) {
waiting_for_ultrasonic = 1;
-
- char command[2];
- command[0] = 0x00; // Set the command register
+ if(has_ultrasonic_sensor) {
+ char command[2];
+ command[0] = 0x00; // Set the command register
command[1] = 0x51; // Get result is centimeters
- primary_i2c.write(ULTRASONIC_ADDRESS, command, 2); // Send the command to start a ranging burst
-
- ultrasonic_timeout.attach_us(IF_read_ultrasonic_measure,70000);
- }else{
- debug("WARNING: Ultrasonic sensor called too frequently.\n");
+ primary_i2c.write(ULTRASONIC_ADDRESS, command, 2); // Send the command to start a ranging burst
+ }
+ ultrasonic_timeout.attach_us(IF_read_ultrasonic_measure,70000);
+ } else {
+ debug("WARNING: Ultrasonic sensor called too frequently.\n");
}
}
-void IF_read_ultrasonic_measure(){
- char command[1];
- char result[2];
- command[0] = 0x02; // The start address of measure result
- primary_i2c.write(ULTRASONIC_ADDRESS, command, 1, 1); // Send address to read a measure
- primary_i2c.read(ULTRASONIC_ADDRESS, result, 2); // Read two byte of measure
- ultrasonic_distance = (result[0]<<8)+result[1];
+void IF_read_ultrasonic_measure()
+{
+ if(has_ultrasonic_sensor) {
+ char command[1];
+ char result[2];
+ command[0] = 0x02; // The start address of measure result
+ primary_i2c.write(ULTRASONIC_ADDRESS, command, 1, 1); // Send address to read a measure
+ primary_i2c.read(ULTRASONIC_ADDRESS, result, 2); // Read two byte of measure
+ ultrasonic_distance = (result[0]<<8)+result[1];
+ } else ultrasonic_distance = 0;
ultrasonic_distance_updated = 1;
waiting_for_ultrasonic = 0;
- debug("US:%d cm\n",ultrasonic_distance);
+ //debug("US:%d cm\n",ultrasonic_distance);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Additional Sensing Functions
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-float get_temperature(){
- return IF_read_from_temperature_sensor();
+float get_temperature()
+{
+ if(has_temperature_sensor)return IF_read_from_temperature_sensor();
+ return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Voltage Sensing Functions
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-float get_battery_voltage (){
+float get_battery_voltage ()
+{
float raw_value = vin_battery.read();
return raw_value * 4.95;
}
-float get_current (){
+float get_current ()
+{
// Device uses a INA211 current sense monitor measuring voltage drop across a 2mOhm resistor
// Device gain = 500
float raw_value = vin_current.read();
return raw_value * 3.3;
}
-float get_dc_voltage (){
+float get_dc_voltage ()
+{
float raw_value = vin_dc.read();
- return raw_value * 6.6;
+ return raw_value * 6.6;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// IR Sensor Functions
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-// Estimates the distance to an obstacle from one of the IR sensors, defined by index (range 0-7).
+// Estimates the distance to an obstacle from one of the IR sensors, defined by index (range 0-7).
// The value is converted to an approximate distance in millimetres, or 100.0 if no obstacle found.
// NB This function is preserved for code-compatability and cases where only a single reading is needed
// In many cases it is preferable to call store_reflected_ir_distances() to save all 8 values then read using get_reflected_ir_distance()
-float read_reflected_ir_distance ( char index ){
+float read_reflected_ir_distance ( char index )
+{
// Sanity check
if(index>7) return 0.0;
-
+
//1. Read the ADC value without IR emitter on; store in the background_ir_values[] array
background_ir_values [index] = IF_read_IR_adc_value(1, index );
-
+
//2. Enable the relevant IR emitter by turning on its pulse output
- switch(index){
- case 0: case 1: case 6: case 7:
- IF_set_IR_emitter_output(0, 1);
- break;
- case 2: case 3: case 4: case 5:
- IF_set_IR_emitter_output(1, 1);
- break;
+ switch(index) {
+ case 0:
+ case 1:
+ case 6:
+ case 7:
+ IF_set_IR_emitter_output(0, 1);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ IF_set_IR_emitter_output(1, 1);
+ break;
}
- wait_us(ir_pulse_delay);
-
+ wait_us(ir_pulse_delay);
+
//3. Read the ADC value now IR emitter is on; store in the illuminated_ir_values[] array
illuminated_ir_values [index] = IF_read_IR_adc_value (1, index );
-
+
//4. Turn off IR emitter
- switch(index){
- case 0: case 1: case 6: case 7:
- IF_set_IR_emitter_output(0, 0);
- break;
- case 2: case 3: case 4: case 5:
- IF_set_IR_emitter_output(1, 0);
- break;
+ switch(index) {
+ case 0:
+ case 1:
+ case 6:
+ case 7:
+ IF_set_IR_emitter_output(0, 0);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ IF_set_IR_emitter_output(1, 0);
+ break;
}
-
+
//5. Estimate distance based on 2 values using calculate_reflected_distances(); store in reflected_ir_distances()
reflected_ir_distances [index] = calculate_reflected_distance( background_ir_values [index], illuminated_ir_values [index]);
ir_values_stored = 1;
@@ -132,109 +156,130 @@
// Returns the stored value of the reflected obstacle based on last call of either read_reflected_ir_distance or store_reflected_distances
-float get_reflected_ir_distance ( char index ){
+float get_reflected_ir_distance ( char index )
+{
// Sanity check: check range of index and that values have been stored
if (index>7 || ir_values_stored == 0) return 0.0;
- return reflected_ir_distances[index];
+ return reflected_ir_distances[index];
}
// Returns the stored value of the non-illuminated sensor based on last call of store_background_raw_ir_values
-unsigned short get_background_raw_ir_value ( char index ){
- // Sanity check: check range of index and that values have been stored
- if (index>7 || ir_values_stored == 0) return 0.0;
- return background_ir_values[index];
-}
-
-// Returns the stored value of the illuminated sensor based on last call of store_illuminated_raw_ir_values
-unsigned short get_illuminated_raw_ir_value ( char index ){
+unsigned short get_background_raw_ir_value ( char index )
+{
// Sanity check: check range of index and that values have been stored
if (index>7 || ir_values_stored == 0) return 0.0;
- return illuminated_ir_values[index];
+ return background_ir_values[index];
}
-
+
+// Returns the stored value of the illuminated sensor based on last call of store_illuminated_raw_ir_values
+unsigned short get_illuminated_raw_ir_value ( char index )
+{
+ // Sanity check: check range of index and that values have been stored
+ if (index>7 || ir_values_stored == 0) return 0.0;
+ return illuminated_ir_values[index];
+}
+
// Stores the reflected distances for all 8 IR sensors
-void store_reflected_ir_distances ( void ){
+void store_reflected_ir_distances ( void )
+{
store_ir_values();
- for(int i=0;i<8;i++){
- reflected_ir_distances [i] = calculate_reflected_distance( background_ir_values [i], illuminated_ir_values [i]);
- }
+ for(int i=0; i<8; i++) {
+ reflected_ir_distances [i] = calculate_reflected_distance( background_ir_values [i], illuminated_ir_values [i]);
+ }
}
// Stores the rbackground and illuminated values for all 8 IR sensors
-void store_ir_values ( void ){
+void store_ir_values ( void )
+{
store_background_raw_ir_values();
store_illuminated_raw_ir_values();
}
-
+
// Stores the raw ADC values for all 8 IR sensors without enabling IR emitters
-void store_background_raw_ir_values ( void ){
+void store_background_raw_ir_values ( void )
+{
ir_values_stored = 1;
- for(int i=0;i<8;i++){
+ for(int i=0; i<8; i++) {
background_ir_values [i] = IF_read_IR_adc_value(1,i);
}
}
-
+
// Stores the raw ADC values for all 8 IR sensors with a 500us emitter pulse
-void store_illuminated_raw_ir_values ( void ){
- //1. Enable the front IR emitters and store the values
+void store_illuminated_raw_ir_values ( void )
+{
+ //1. Enable the front IR emitters and store the values
IF_set_IR_emitter_output(0, 1);
- wait_us(ir_pulse_delay);
+ wait_us(ir_pulse_delay);
illuminated_ir_values [0] = IF_read_IR_adc_value(1,0);
illuminated_ir_values [1] = IF_read_IR_adc_value(1,1);
illuminated_ir_values [6] = IF_read_IR_adc_value(1,6);
illuminated_ir_values [7] = IF_read_IR_adc_value(1,7);
IF_set_IR_emitter_output(0, 0);
-
- //2. Enable the rear+side IR emitters and store the values
+
+ //2. Enable the rear+side IR emitters and store the values
IF_set_IR_emitter_output(1, 1);
- wait_us(ir_pulse_delay);
+ wait_us(ir_pulse_delay);
illuminated_ir_values [2] = IF_read_IR_adc_value(1,2);
illuminated_ir_values [3] = IF_read_IR_adc_value(1,3);
illuminated_ir_values [4] = IF_read_IR_adc_value(1,4);
illuminated_ir_values [5] = IF_read_IR_adc_value(1,5);
IF_set_IR_emitter_output(1, 0);
}
-
+
// Converts a background and illuminated value into a distance
-float calculate_reflected_distance ( unsigned short background_value, unsigned short illuminated_value ){
+float calculate_reflected_distance ( unsigned short background_value, unsigned short illuminated_value )
+{
float approximate_distance = 4000 + background_value - illuminated_value;
if(approximate_distance < 0) approximate_distance = 0;
-
+
// Very approximate: root value, divide by 2, approx distance in mm
approximate_distance = sqrt (approximate_distance) / 2.0;
-
+
// Then add adjustment value if value >27
if(approximate_distance > 27) {
float shift = pow(approximate_distance - 27,3);
approximate_distance += shift;
}
if(approximate_distance > 90) approximate_distance = 100.0;
- return approximate_distance;
+ return approximate_distance;
}
// Returns the illuminated raw sensor value for the IR sensor defined by index (range 0-7); turns on the emitters for a 500us pulse
-unsigned short read_illuminated_raw_ir_value ( char index ){
+unsigned short read_illuminated_raw_ir_value ( char index )
+{
//This function reads the IR strength when illuminated - used for PC system debugging purposes
//1. Enable the relevant IR emitter by turning on its pulse output
- switch(index){
- case 0: case 1: case 6: case 7:
- IF_set_IR_emitter_output(0, 1);
- break;
- case 2: case 3: case 4: case 5:
- IF_set_IR_emitter_output(1, 1);
- break;
+ switch(index) {
+ case 0:
+ case 1:
+ case 6:
+ case 7:
+ IF_set_IR_emitter_output(0, 1);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ IF_set_IR_emitter_output(1, 1);
+ break;
}
- wait_us(ir_pulse_delay);
+ wait_us(ir_pulse_delay);
//2. Read the ADC value now IR emitter is on
unsigned short strong_value = IF_read_IR_adc_value( 1,index );
//3. Turn off IR emitter
- switch(index){
- case 0: case 1: case 6: case 7:
- IF_set_IR_emitter_output(0, 0);
- break;
- case 2: case 3: case 4: case 5:
- IF_set_IR_emitter_output(1, 0);
- break;
+ switch(index) {
+ case 0:
+ case 1:
+ case 6:
+ case 7:
+ IF_set_IR_emitter_output(0, 0);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ IF_set_IR_emitter_output(1, 0);
+ break;
}
return strong_value;
}
@@ -243,50 +288,56 @@
// Returns the stored value of the non-illuminated sensor based on last call of store_background_base_ir_values
-unsigned short get_background_base_ir_value ( char index ){
+unsigned short get_background_base_ir_value ( char index )
+{
// Sanity check: check range of index and that values have been stored
if (index>4 || base_ir_values_stored == 0) return 0.0;
- return background_base_ir_values[index];
+ return background_base_ir_values[index];
}
-
+
// Returns the stored value of the illuminated sensor based on last call of store_illuminated_base_ir_values
-unsigned short get_illuminated_base_ir_value ( char index ){
+unsigned short get_illuminated_base_ir_value ( char index )
+{
// Sanity check: check range of index and that values have been stored
if (index>4 || base_ir_values_stored == 0) return 0.0;
- return illuminated_base_ir_values[index];
+ return illuminated_base_ir_values[index];
}
-
+
// Stores the reflected distances for all 5 base IR sensors
-void store_base_ir_values ( void ){
+void store_base_ir_values ( void )
+{
store_background_base_ir_values();
store_illuminated_base_ir_values();
//for(int i=0;i<5;i++){
- // reflected_ir_distances [i] = calculate_reflected_distance( background_base_ir_values [i], illuminated_base_ir_values [i]);
- //}
+ // reflected_ir_distances [i] = calculate_reflected_distance( background_base_ir_values [i], illuminated_base_ir_values [i]);
+ //}
}
-
+
// Stores the raw ADC values for all 5 base IR sensors without enabling IR emitters
-void store_background_base_ir_values ( void ){
+void store_background_base_ir_values ( void )
+{
base_ir_values_stored = 1;
- for(int i=0;i<5;i++){
+ for(int i=0; i<5; i++) {
background_base_ir_values [i] = IF_read_IR_adc_value(2,i);
}
}
-
+
// Stores the raw ADC values for all 5 base IR sensors with a 500us emitter pulse
-void store_illuminated_base_ir_values ( void ){
- //1. Enable the base IR emitters and store the values
+void store_illuminated_base_ir_values ( void )
+{
+ //1. Enable the base IR emitters and store the values
IF_set_IR_emitter_output(2, 1);
- wait_us(base_ir_pulse_delay);
- for(int i=0;i<5;i++){
- illuminated_base_ir_values [i] = IF_read_IR_adc_value(2,i);
+ wait_us(base_ir_pulse_delay);
+ for(int i=0; i<5; i++) {
+ illuminated_base_ir_values [i] = IF_read_IR_adc_value(2,i);
}
-
+
IF_set_IR_emitter_output(2, 0);
}
-
+
// Routine to store detected line position in a similar format to the used on 3Pi\m3Pi\PiSwarm
-void store_line_position ( ){
+void store_line_position ( )
+{
// Store background and reflected base IR values
store_base_ir_values();
int h_value[5];
@@ -295,49 +346,49 @@
char count = 0;
line_found = 0;
line_position = 0;
- for(int i=0;i<5;i++){
+ for(int i=0; i<5; i++) {
if(get_background_base_ir_value(i) > get_illuminated_base_ir_value(i)) h_value[i]=0;
else h_value[i] = get_illuminated_base_ir_value(i) - get_background_base_ir_value(i);
if(h_value[i] < line_threshold) count++;
- }
- if(count == 1){
- line_found = 1;
- if(h_value[0] < line_threshold) {
- line_position = -1;
- if(h_value[1] < line_threshold_hi) line_position = -0.8;
- }
-
- if (h_value[1] < line_threshold) {
- line_position = -0.5 + (0.00005 * h_value[0]) - (0.0001 * h_value[2]);;
- }
- if(h_value[2] < line_threshold) {
+ }
+ if(count == 1) {
+ line_found = 1;
+ if(h_value[0] < line_threshold) {
+ line_position = -1;
+ if(h_value[1] < line_threshold_hi) line_position = -0.8;
+ }
+
+ if (h_value[1] < line_threshold) {
+ line_position = -0.5 + (0.00005 * h_value[0]) - (0.0001 * h_value[2]);;
+ }
+ if(h_value[2] < line_threshold) {
line_position = (0.00005 * h_value[1]) - (0.0001 * h_value[3]);
- }
- if(h_value[3] < line_threshold) {
- line_position = 0.5 + (0.00005 * h_value[2]) - (0.0001 * h_value[4]);;
- }
- if(h_value[4] < line_threshold) {
- line_position = 1;
- if(h_value[3] < line_threshold_hi) line_position = 0.8;
- }
+ }
+ if(h_value[3] < line_threshold) {
+ line_position = 0.5 + (0.00005 * h_value[2]) - (0.0001 * h_value[4]);;
+ }
+ if(h_value[4] < line_threshold) {
+ line_position = 1;
+ if(h_value[3] < line_threshold_hi) line_position = 0.8;
+ }
}
- if(count == 2){
- if(h_value[0] && h_value[1] < line_threshold){
+ if(count == 2) {
+ if(h_value[0] && h_value[1] < line_threshold) {
line_found = 1;
line_position = -0.6;
}
-
- if(h_value[1] && h_value[2] < line_threshold){
+
+ if(h_value[1] && h_value[2] < line_threshold) {
line_found = 1;
line_position = -0.4;
}
-
- if(h_value[2] && h_value[3] < line_threshold){
+
+ if(h_value[2] && h_value[3] < line_threshold) {
line_found = 1;
line_position = 0.4;
}
-
- if(h_value[3] && h_value[4] < line_threshold){
+
+ if(h_value[3] && h_value[4] < line_threshold) {
line_found = 1;
line_position = 0.6;
}
@@ -346,17 +397,18 @@
-void calibrate_base_ir_sensors (void) {
+void calibrate_base_ir_sensors (void)
+{
short white_background[5];
short white_active[5];
short black_background[5];
short black_active[5];
- for(int k=0;k<5;k++){
+ for(int k=0; k<5; k++) {
white_background[k]=0;
black_background[k]=0;
white_active[k]=0;
- black_active[k]=0;
- }
+ black_active[k]=0;
+ }
pc.printf("Base IR Calibration\n");
display.clear_display();
display.write_string("Calibrating base");
@@ -374,107 +426,107 @@
display.write_string("IR sensor");
wait(0.5);
pc.printf("\nWhite Background Results:\n");
-
- for(int i=0;i<5;i++){
- wait(0.2);
- store_background_base_ir_values();
-
- display.set_position(1,9);
- display.write_string(".");
- wait(0.2);
- store_illuminated_base_ir_values();
- for(int k=0;k<5;k++){
- white_background[k]+= get_background_base_ir_value(k);
- white_active[k] += get_illuminated_base_ir_value(k);
- }
- pc.printf("Sample %d 1: %04d-%04d 2: %04d-%04d 3: %04d-%04d 4: %04d-%04d 5: %04d-%04d\n", (i+1),
- get_background_base_ir_value(0), get_illuminated_base_ir_value(0),
- get_background_base_ir_value(1), get_illuminated_base_ir_value(1),
- get_background_base_ir_value(2), get_illuminated_base_ir_value(2),
- get_background_base_ir_value(3), get_illuminated_base_ir_value(3),
- get_background_base_ir_value(4), get_illuminated_base_ir_value(4));
+
+ for(int i=0; i<5; i++) {
+ wait(0.2);
+ store_background_base_ir_values();
+
+ display.set_position(1,9);
+ display.write_string(".");
+ wait(0.2);
+ store_illuminated_base_ir_values();
+ for(int k=0; k<5; k++) {
+ white_background[k]+= get_background_base_ir_value(k);
+ white_active[k] += get_illuminated_base_ir_value(k);
+ }
+ pc.printf("Sample %d 1: %04d-%04d 2: %04d-%04d 3: %04d-%04d 4: %04d-%04d 5: %04d-%04d\n", (i+1),
+ get_background_base_ir_value(0), get_illuminated_base_ir_value(0),
+ get_background_base_ir_value(1), get_illuminated_base_ir_value(1),
+ get_background_base_ir_value(2), get_illuminated_base_ir_value(2),
+ get_background_base_ir_value(3), get_illuminated_base_ir_value(3),
+ get_background_base_ir_value(4), get_illuminated_base_ir_value(4));
}
- for(int k=0;k<5;k++){
+ for(int k=0; k<5; k++) {
white_background[k]/=5;
white_active[k]/=5;
}
pc.printf("Mean results 1: %04d-%04d 2: %04d-%04d 3: %04d-%04d 4: %04d-%04d 5: %04d-%04d\n",
- white_background[0], white_active[0],
- white_background[1], white_active[1],
- white_background[2], white_active[2],
- white_background[3], white_active[3],
- white_background[4], white_active[4]);
-
+ white_background[0], white_active[0],
+ white_background[1], white_active[1],
+ white_background[2], white_active[2],
+ white_background[3], white_active[3],
+ white_background[4], white_active[4]);
+
display.clear_display();
display.write_string("Place robot on");
display.set_position(1,0);
display.write_string("black surface");
- wait(3);
-
+ wait(3);
+
display.clear_display();
display.write_string("Calibrating base");
display.set_position(1,0);
display.write_string("IR sensor");
wait(0.5);
pc.printf("\nBlack Background Results:\n");
-
- for(int i=0;i<5;i++){
- wait(0.2);
+
+ for(int i=0; i<5; i++) {
+ wait(0.2);
- store_background_base_ir_values();
- display.set_position(1,9);
- display.write_string(".");
- wait(0.2);
- store_illuminated_base_ir_values();
- for(int k=0;k<5;k++){
- black_background[k]+= get_background_base_ir_value(k);
- black_active[k] += get_illuminated_base_ir_value(k);
- }
- pc.printf("Sample %d 1: %04d-%04d 2: %04d-%04d 3: %04d-%04d 4: %04d-%04d 5: %04d-%04d\n", (i+1),
- get_background_base_ir_value(0), get_illuminated_base_ir_value(0),
- get_background_base_ir_value(1), get_illuminated_base_ir_value(1),
- get_background_base_ir_value(2), get_illuminated_base_ir_value(2),
- get_background_base_ir_value(3), get_illuminated_base_ir_value(3),
- get_background_base_ir_value(4), get_illuminated_base_ir_value(4));
- }
- for(int k=0;k<5;k++){
+ store_background_base_ir_values();
+ display.set_position(1,9);
+ display.write_string(".");
+ wait(0.2);
+ store_illuminated_base_ir_values();
+ for(int k=0; k<5; k++) {
+ black_background[k]+= get_background_base_ir_value(k);
+ black_active[k] += get_illuminated_base_ir_value(k);
+ }
+ pc.printf("Sample %d 1: %04d-%04d 2: %04d-%04d 3: %04d-%04d 4: %04d-%04d 5: %04d-%04d\n", (i+1),
+ get_background_base_ir_value(0), get_illuminated_base_ir_value(0),
+ get_background_base_ir_value(1), get_illuminated_base_ir_value(1),
+ get_background_base_ir_value(2), get_illuminated_base_ir_value(2),
+ get_background_base_ir_value(3), get_illuminated_base_ir_value(3),
+ get_background_base_ir_value(4), get_illuminated_base_ir_value(4));
+ }
+ for(int k=0; k<5; k++) {
black_background[k]/=5;
black_active[k]/=5;
}
- pc.printf("Mean results 1: %04d-%04d 2: %04d-%04d 3: %04d-%04d 4: %04d-%04d 5: %04d-%04d\n",
- black_background[0], black_active[0],
- black_background[1], black_active[1],
- black_background[2], black_active[2],
- black_background[3], black_active[3],
- black_background[4], black_active[4]);
-
+ pc.printf("Mean results 1: %04d-%04d 2: %04d-%04d 3: %04d-%04d 4: %04d-%04d 5: %04d-%04d\n",
+ black_background[0], black_active[0],
+ black_background[1], black_active[1],
+ black_background[2], black_active[2],
+ black_background[3], black_active[3],
+ black_background[4], black_active[4]);
+
}
-int get_bearing_from_ir_array (unsigned short * ir_sensor_readings){
+int get_bearing_from_ir_array (unsigned short * ir_sensor_readings)
+{
//out("Getting bearing from array: [%d][%d][%d][%d][%d][%d][%d][%d]\n",ir_sensor_readings[0],ir_sensor_readings[1],ir_sensor_readings[2],ir_sensor_readings[3],ir_sensor_readings[4],ir_sensor_readings[5],ir_sensor_readings[6],ir_sensor_readings[7]);
-
+
float degrees_per_radian = 57.295779513;
-
+
// sin(IR sensor angle) and cos(IR sensor angle) LUT, for all 8 sensors
float ir_sensor_sin[8] = {0.382683432, 0.923879533, 0.923879533, 0.382683432, -0.382683432, -0.923879533, -0.923879533, -0.382683432};
float ir_sensor_cos[8] = {0.923879533, 0.382683432, -0.382683432, -0.923879533, -0.923879533, -0.382683432, 0.382683432, 0.923879533};
-
+
float sin_sum = 0;
float cos_sum = 0;
-
- for(int i = 0; i < 8; i++)
- {
+
+ for(int i = 0; i < 8; i++) {
// Use IR sensor reading to weight bearing vector
sin_sum += ir_sensor_sin[i] * ir_sensor_readings[i];
cos_sum += ir_sensor_cos[i] * ir_sensor_readings[i];
}
-
- float bearing = atan2(sin_sum, cos_sum); // Calculate vector towards IR light source
+
+ float bearing = atan2(sin_sum, cos_sum); // Calculate vector towards IR light source
bearing *= degrees_per_radian; // Convert to degrees
//out("Sin sum:%f Cos sum:%f Bearing:%f\n",sin_sum,cos_sum,bearing);
return (int) bearing;
-}
+}
