39 ultrasonic_ticker.detach();
44 if(waiting_for_ultrasonic == 0) {
45 waiting_for_ultrasonic = 1;
46 if(has_ultrasonic_sensor) {
50 primary_i2c.write(ULTRASONIC_ADDRESS, command, 2);
52 ultrasonic_timeout.attach_us(
this,&Sensors::IF_read_ultrasonic_measure,70000);
54 psi.
debug(
"WARNING: Ultrasonic sensor called too frequently.\n");
58 void Sensors::IF_read_ultrasonic_measure()
60 if(has_ultrasonic_sensor) {
64 primary_i2c.write(ULTRASONIC_ADDRESS, command, 1, 1);
65 primary_i2c.read(ULTRASONIC_ADDRESS, result, 2);
66 ultrasonic_distance = (result[0]<<8)+result[1];
67 }
else ultrasonic_distance = 0;
68 ultrasonic_distance_updated = 1;
69 waiting_for_ultrasonic = 0;
79 if(has_temperature_sensor)
return i2c_setup.IF_read_from_temperature_sensor();
89 float raw_value = vin_battery.read();
90 return raw_value * 4.95;
97 float raw_value = vin_current.read();
98 return raw_value * 3.3;
103 float raw_value = vin_dc.read();
104 return raw_value * 6.6;
115 float Sensors::read_reflected_ir_distance (
char index )
118 if(index>7)
return 0.0;
121 background_ir_values [index] = i2c_setup.IF_read_IR_adc_value(1, index );
129 i2c_setup.IF_set_IR_emitter_output(0, 1);
135 i2c_setup.IF_set_IR_emitter_output(1, 1);
138 wait_us(ir_pulse_delay);
141 illuminated_ir_values [index] = i2c_setup.IF_read_IR_adc_value (1, index );
149 i2c_setup.IF_set_IR_emitter_output(0, 0);
155 i2c_setup.IF_set_IR_emitter_output(1, 0);
160 reflected_ir_distances [index] = calculate_reflected_distance( background_ir_values [index], illuminated_ir_values [index]);
161 ir_values_stored = 1;
162 return reflected_ir_distances [index];
167 float Sensors::get_reflected_ir_distance (
char index )
170 if (index>7 || ir_values_stored == 0)
return 0.0;
171 return reflected_ir_distances[index];
178 if (index>7 || ir_values_stored == 0)
return 0.0;
179 return background_ir_values[index];
186 if (index>7 || ir_values_stored == 0)
return 0.0;
187 return illuminated_ir_values[index];
191 void Sensors::store_reflected_ir_distances (
void )
194 for(
int i=0; i<8; i++) {
195 reflected_ir_distances [i] = calculate_reflected_distance( background_ir_values [i], illuminated_ir_values [i]);
209 ir_values_stored = 1;
210 for(
int i=0; i<8; i++) {
211 background_ir_values [i] = i2c_setup.IF_read_IR_adc_value(1,i);
219 i2c_setup.IF_set_IR_emitter_output(0, 1);
220 wait_us(ir_pulse_delay);
221 illuminated_ir_values [0] = i2c_setup.IF_read_IR_adc_value(1,0);
222 illuminated_ir_values [1] = i2c_setup.IF_read_IR_adc_value(1,1);
223 illuminated_ir_values [6] = i2c_setup.IF_read_IR_adc_value(1,6);
224 illuminated_ir_values [7] = i2c_setup.IF_read_IR_adc_value(1,7);
225 i2c_setup.IF_set_IR_emitter_output(0, 0);
228 i2c_setup.IF_set_IR_emitter_output(1, 1);
229 wait_us(ir_pulse_delay);
230 illuminated_ir_values [2] = i2c_setup.IF_read_IR_adc_value(1,2);
231 illuminated_ir_values [3] = i2c_setup.IF_read_IR_adc_value(1,3);
232 illuminated_ir_values [4] = i2c_setup.IF_read_IR_adc_value(1,4);
233 illuminated_ir_values [5] = i2c_setup.IF_read_IR_adc_value(1,5);
234 i2c_setup.IF_set_IR_emitter_output(1, 0);
238 float Sensors::calculate_reflected_distance (
unsigned short background_value,
unsigned short illuminated_value )
240 float approximate_distance = 4000 + background_value - illuminated_value;
241 if(approximate_distance < 0) approximate_distance = 0;
244 approximate_distance = sqrt (approximate_distance) / 2.0;
247 if(approximate_distance > 27) {
248 float shift = pow(approximate_distance - 27,3);
249 approximate_distance += shift;
251 if(approximate_distance > 90) approximate_distance = 100.0;
252 return approximate_distance;
265 i2c_setup.IF_set_IR_emitter_output(0, 1);
271 i2c_setup.IF_set_IR_emitter_output(1, 1);
274 wait_us(ir_pulse_delay);
276 unsigned short strong_value = i2c_setup.IF_read_IR_adc_value( 1,index );
283 i2c_setup.IF_set_IR_emitter_output(0, 0);
289 i2c_setup.IF_set_IR_emitter_output(1, 0);
302 if (index>4 || base_ir_values_stored == 0)
return 0.0;
303 return background_base_ir_values[index];
310 if (index>4 || base_ir_values_stored == 0)
return 0.0;
311 return illuminated_base_ir_values[index];
327 base_ir_values_stored = 1;
328 for(
int i=0; i<5; i++) {
329 background_base_ir_values [i] = i2c_setup.IF_read_IR_adc_value(2,i);
337 i2c_setup.IF_set_IR_emitter_output(2, 1);
338 wait_us(base_ir_pulse_delay);
339 for(
int i=0; i<5; i++) {
340 illuminated_base_ir_values [i] = i2c_setup.IF_read_IR_adc_value(2,i);
343 i2c_setup.IF_set_IR_emitter_output(2, 0);
347 void Sensors::store_line_position ( )
352 int line_threshold = 1000;
353 int line_threshold_hi = 2000;
357 for(
int i=0; i<5; i++) {
360 if(h_value[i] < line_threshold) count++;
364 if(h_value[0] < line_threshold) {
366 if(h_value[1] < line_threshold_hi) line_position = -0.8;
369 if (h_value[1] < line_threshold) {
370 line_position = -0.5 + (0.00005 * h_value[0]) - (0.0001 * h_value[2]);;
372 if(h_value[2] < line_threshold) {
373 line_position = (0.00005 * h_value[1]) - (0.0001 * h_value[3]);
375 if(h_value[3] < line_threshold) {
376 line_position = 0.5 + (0.00005 * h_value[2]) - (0.0001 * h_value[4]);;
378 if(h_value[4] < line_threshold) {
380 if(h_value[3] < line_threshold_hi) line_position = 0.8;
384 if(h_value[0] && h_value[1] < line_threshold) {
386 line_position = -0.6;
389 if(h_value[1] && h_value[2] < line_threshold) {
391 line_position = -0.4;
394 if(h_value[2] && h_value[3] < line_threshold) {
399 if(h_value[3] && h_value[4] < line_threshold) {
409 if (index>4 || base_ir_values_stored == 0)
return 0.0;
411 if(illuminated_base_ir_values[index] > background_base_ir_values[index]){
412 return illuminated_base_ir_values[index] - background_base_ir_values[index];
422 if (index>7 || ir_values_stored == 0)
return 0.0;
424 if(illuminated_ir_values[index] > background_ir_values[index]){
425 return illuminated_ir_values[index] - background_ir_values[index];
432 void Sensors::calibrate_base_ir_sensors (
void)
434 short white_background[5];
435 short white_active[5];
436 short black_background[5];
437 short black_active[5];
438 for(
int k=0; k<5; k++) {
439 white_background[k]=0;
440 black_background[k]=0;
444 pc.printf(
"Base IR Calibration\n");
460 pc.printf(
"\nWhite Background Results:\n");
462 for(
int i=0; i<5; i++) {
470 for(
int k=0; k<5; k++) {
474 pc.printf(
"Sample %d 1: %04d-%04d 2: %04d-%04d 3: %04d-%04d 4: %04d-%04d 5: %04d-%04d\n", (i+1),
481 for(
int k=0; k<5; k++) {
482 white_background[k]/=5;
485 pc.printf(
"Mean results 1: %04d-%04d 2: %04d-%04d 3: %04d-%04d 4: %04d-%04d 5: %04d-%04d\n",
486 white_background[0], white_active[0],
487 white_background[1], white_active[1],
488 white_background[2], white_active[2],
489 white_background[3], white_active[3],
490 white_background[4], white_active[4]);
503 pc.printf(
"\nBlack Background Results:\n");
505 for(
int i=0; i<5; i++) {
513 for(
int k=0; k<5; k++) {
517 pc.printf(
"Sample %d 1: %04d-%04d 2: %04d-%04d 3: %04d-%04d 4: %04d-%04d 5: %04d-%04d\n", (i+1),
524 for(
int k=0; k<5; k++) {
525 black_background[k]/=5;
528 pc.printf(
"Mean results 1: %04d-%04d 2: %04d-%04d 3: %04d-%04d 4: %04d-%04d 5: %04d-%04d\n",
529 black_background[0], black_active[0],
530 black_background[1], black_active[1],
531 black_background[2], black_active[2],
532 black_background[3], black_active[3],
533 black_background[4], black_active[4]);
538 int Sensors::get_bearing_from_ir_array (
unsigned short * ir_sensor_readings)
542 float degrees_per_radian = 57.295779513;
545 float ir_sensor_sin[8] = {0.382683432, 0.923879533, 0.923879533, 0.382683432, -0.382683432, -0.923879533, -0.923879533, -0.382683432};
546 float ir_sensor_cos[8] = {0.923879533, 0.382683432, -0.382683432, -0.923879533, -0.923879533, -0.382683432, 0.382683432, 0.923879533};
551 for(
int i = 0; i < 8; i++) {
553 sin_sum += ir_sensor_sin[i] * ir_sensor_readings[i];
554 cos_sum += ir_sensor_cos[i] * ir_sensor_readings[i];
557 float bearing = atan2(sin_sum, cos_sum);
558 bearing *= degrees_per_radian;
562 return (
int) bearing;
void write_string(char *message)
void store_illuminated_raw_ir_values(void)
unsigned short read_illuminated_raw_ir_value(char index)
void store_background_raw_ir_values(void)
unsigned short calculate_side_ir_value(char index)
unsigned short calculate_base_ir_value(char index)
void set_position(char row, char column)
void store_ir_values(void)
void update_ultrasonic_measure(void)
unsigned short get_background_base_ir_value(char index)
float get_dc_voltage(void)
void store_background_base_ir_values(void)
void enable_ultrasonic_ticker(void)
float get_battery_voltage(void)
unsigned short get_illuminated_base_ir_value(char index)
float get_temperature(void)
unsigned short get_background_raw_ir_value(char index)
void store_base_ir_values(void)
void store_illuminated_base_ir_values(void)
void debug(const char *format,...)
void disable_ultrasonic_ticker(void)
unsigned short get_illuminated_raw_ir_value(char index)