40 Serial pc(USBTX,USBRX);
41 I2C primary_i2c (p9, p10);
42 InterruptIn gpio_interrupt (p12);
44 AnalogIn vin_current(p15);
45 AnalogIn vin_battery(p16);
47 PwmOut motor_left_f (p21);
48 PwmOut motor_left_r (p22);
49 PwmOut motor_right_f(p23);
50 PwmOut motor_right_r(p24);
51 PwmOut center_led_red(p25);
52 PwmOut center_led_green(p26);
53 DigitalOut mbed_led1(LED1);
54 DigitalOut mbed_led2(LED2);
55 DigitalOut mbed_led3(LED3);
56 DigitalOut mbed_led4(LED4);
59 float center_led_brightness;
60 float backlight_brightness;
64 Timeout pause_usercode_timeout;
65 Ticker ultrasonic_ticker;
66 Timeout ultrasonic_timeout;
67 int timer_minute_count;
70 float firmware_version;
77 char has_base_colour_sensor=0;
78 char has_top_colour_sensor=0;
79 char has_wheel_encoders=0;
81 char has_ultrasonic_sensor=0;
82 char has_temperature_sensor=0;
83 char has_recharging_circuit=0;
87 char previous_robot_id;
89 char wheel_encoder_byte;
90 char previous_wheel_encoder_byte;
91 signed int left_encoder;
92 signed int right_encoder;
94 char time_based_motor_action = 0;
96 char testing_voltage_regulators_flag = 1;
97 char power_good_motor_left = 2;
98 char power_good_motor_right = 2;
99 char power_good_infrared = 2;
100 char status_dc_in = 2;
101 char status_charging = 2;
104 char previous_switch_byte;
107 char use_motor_calibration = USE_MOTOR_CALIBRATION;
108 char motor_calibration_set;
109 float left_motor_calibration_value = 1.0;
110 float right_motor_calibration_value = 1.0;
112 char debug_mode = DEBUG_MODE;
113 char debug_output = DEBUG_OUTPUT_STREAM;
115 char firmware_bytes[21];
117 int base_colour_sensor_raw_values [4];
118 int top_colour_sensor_raw_values [4];
120 char waiting_for_ultrasonic = 0;
121 int ultrasonic_distance = 0;
122 char ultrasonic_distance_updated = 0;
125 float line_position = 0;
128 unsigned short background_ir_values [8];
129 unsigned short illuminated_ir_values [8];
130 float reflected_ir_distances [8];
131 char ir_values_stored = 0;
132 unsigned short background_base_ir_values [5];
133 unsigned short illuminated_base_ir_values [5];
134 char base_ir_values_stored = 0;
136 float motor_left_speed;
137 float motor_right_speed;
138 char motor_left_brake;
139 char motor_right_brake;
143 char change_id_event = 0;
144 char encoder_event = 0;
145 char switch_event = 0;
146 char user_code_running = 0;
147 char user_code_restore_mode = 0;
148 char system_warnings = 0;
151 vector<string> basic_filenames;
152 char psi_basic_file_count = 0;
153 char use_flash_basic = 0;
154 char file_transfer_mode = 0;
156 int ir_pulse_delay = DEFAULT_IR_PULSE_DELAY;
157 int base_ir_pulse_delay = DEFAULT_BASE_IR_PULSE_DELAY;
172 timer_minute_count = 0;
173 timer_ticker.attach(
this,&Psiswarm::IF_update_minutes, 300);
175 primary_i2c.frequency(400000);
177 debug(
"PsiSwarm Robot Library %1.2f\n\n",SOFTWARE_VERSION_CODE);
178 debug(
"- Setting up serial interface\n");
179 debug(
"- Reading firmware: ");
181 debug(
"Version %3.2f\n",firmware_version);
182 IF_get_hardware_description();
183 if(use_motor_calibration){
184 if(!motor_calibration_set){
185 if(firmware_version < 1.1){
186 debug(
"- WARNING: This firmware is incompatible with motor calibration");
187 debug(
"- WARNING: Please update the firmware to use this feature.");
188 use_motor_calibration = 0;
191 debug(
"- WARNING: Motor calibration values have not been stored in firmware");
192 debug(
"- WARNING: Run calibration routine to use this feature.");
193 use_motor_calibration = 0;
197 debug(
"- Motor calibration in use [LEFT:%0.4f RIGHT:%0.4f]",left_motor_calibration_value,right_motor_calibration_value);
202 debug(
"- WARNING: Check firmware to enable robot features");
204 if(ENABLE_BASIC == 1) {
206 if(psi_basic_file_count == 0) {
207 debug(
"- No PsiBasic files found\n");
208 }
else use_flash_basic = 1;
210 debug(
"- Setting up PIC microcontroller\n");
212 debug(
"- Setting up LED drivers\n");
214 if(i2c_setup.IF_setup_led_expansion_ic() != 0) {
215 debug(
"- WARNING: No I2C acknowledge for LED driver\n");
216 system_warnings += 1;
218 debug(
"- Setting up motor drivers\n");
220 debug(
"- Setting up GPIO expansion\n");
222 i2c_setup.IF_setup_gpio_expansion_ic();
223 if(has_temperature_sensor) {
224 debug(
"- Setting up temperature sensor\n");
225 i2c_setup.IF_setup_temperature_sensor();
227 if(has_base_colour_sensor) {
228 debug(
"- Setting up base colour sensor\n");
229 colour.IF_check_base_colour_sensor();
231 if(has_ultrasonic_sensor) {
232 debug(
"- Setting up ultrasonic sensor\n");
236 debug(
"- Robot ID: %d\n",robot_id);
237 char switchstate = i2c_setup.IF_get_switch_state();
238 debug(
"- Switch State : %d\n",switchstate);
242 if(has_temperature_sensor){
246 if(ENABLE_DEMO == 1 && switchstate > 0) demo_on=1;
247 display.init_display(demo_on);
248 event_handler.attach_us(
this,&Psiswarm::IF_handle_events, 1000);
250 debug(
"- Demo mode button is pressed\n");
252 demo_on = i2c_setup.IF_get_switch_state();
254 display.init_display(0);
258 void Psiswarm::IF_update_minutes()
261 timer_minute_count += 5;
264 void Psiswarm::IF_handle_events()
270 if(encoder_event == 1) {
272 IF_update_encoders();
276 if(switch_event == 1) {
281 if(change_id_event == 1) {
291 void Psiswarm::IF_update_encoders()
293 char rwep = previous_wheel_encoder_byte >> 2;
294 char rwe = wheel_encoder_byte >> 2;
295 char lwep = previous_wheel_encoder_byte % 4;
296 char lwe = wheel_encoder_byte % 4;
298 if(lwe == 0 && lwep==1) left_encoder++;
299 if(lwe == 0 && lwep==2) left_encoder--;
300 if(rwe == 0 && rwep==1) right_encoder++;
301 if(rwe == 0 && rwep==2) right_encoder--;
302 if(left_encoder % 100 == 0) pc.printf(
"L:%d\n",left_encoder);
305 void Psiswarm::IF_update_user_id()
309 void Psiswarm::IF_update_switch()
314 char positive_change = switch_byte - (switch_byte & previous_switch_byte);
315 if(demo_on) demo.demo_handle_switch_event(positive_change);
316 else handle_switch_event(positive_change);
330 va_start(vl, format);
331 vsprintf(buffer,format,vl);
332 if(debug_output & 2) bt.printf(
"%s", buffer);
333 if(debug_output & 1) pc.printf(
"%s", buffer);
334 if(debug_output & 4) display.debug_page(buffer,strlen(buffer));
341 return uptime.read() + (timer_minute_count * 60);
346 user_code_restore_mode = user_code_running;
347 user_code_running = 0;
348 pause_usercode_timeout.attach(
this,&Psiswarm::IF_end_pause_user_code, period);
351 void Psiswarm::IF_end_pause_user_code()
353 user_code_running = user_code_restore_mode;
356 void Psiswarm::IF_get_hardware_description()
358 debug(
"- Robot serial number %1.2f\n",serial_number);
359 debug(
"- PCB version %1.2f\n",pcb_version);
360 debug(
"- Hardware: ");
361 if(has_compass)
debug(
"COMPASS, ");
362 if(has_side_ir)
debug(
"SIDE IR, ");
363 if(has_base_ir)
debug(
"BASE IR, ");
364 if(has_base_colour_sensor)
debug(
"BASE COLOUR, ");
365 if(has_top_colour_sensor)
debug(
"TOP COLOUR, ");
366 if(has_wheel_encoders)
debug(
"WHEEL ENC., ");
367 if(has_audio_pic)
debug(
"AUDIO, ");
368 if(has_ultrasonic_sensor)
debug(
"ULTRASONIC, ");
369 if(has_temperature_sensor)
debug(
"TEMPERATURE, ");
370 if(has_recharging_circuit)
debug(
"RECHARGING, ");
371 if(has_433_radio)
debug(
"433 RADIO.");
void setup_serial_interfaces(void)
float get_dc_voltage(void)
float get_battery_voltage(void)
float get_temperature(void)
void read_list_of_file_names(void)
void pause_user_code(float period)
void debug(const char *format,...)
void reset_encoders(void)
void start_demo_mode(void)