Table controller for piswarm-office
Fork of PiSwarmTableController by
main.cpp@2:c81f4ef63132, 2014-05-22 (annotated)
- Committer:
- jah128
- Date:
- Thu May 22 14:25:10 2014 +0000
- Revision:
- 2:c81f4ef63132
- Parent:
- 1:e4a0d424ac8d
- Child:
- 3:bc7a0f14b28a
Added RF stack to source; turned on IR LEDs
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jah128 | 0:d88fd55a27a6 | 1 | /* University of York Robot Lab |
jah128 | 0:d88fd55a27a6 | 2 | * |
jah128 | 1:e4a0d424ac8d | 3 | * Pi Swarm Table Controller Demo Code |
jah128 | 0:d88fd55a27a6 | 4 | * |
jah128 | 1:e4a0d424ac8d | 5 | * This file is intended for use exclusively with the Pi Swarm Table Controller (PCB 1.0) |
jah128 | 0:d88fd55a27a6 | 6 | * |
jah128 | 0:d88fd55a27a6 | 7 | * (C) Dr James Hilder, Dept. Electronics & Computer Science, University of York |
jah128 | 0:d88fd55a27a6 | 8 | * |
jah128 | 1:e4a0d424ac8d | 9 | * May 2014 |
jah128 | 0:d88fd55a27a6 | 10 | * |
jah128 | 0:d88fd55a27a6 | 11 | */ |
jah128 | 0:d88fd55a27a6 | 12 | |
jah128 | 0:d88fd55a27a6 | 13 | #include "mbed.h" |
jah128 | 2:c81f4ef63132 | 14 | #include "main.h" |
jah128 | 2:c81f4ef63132 | 15 | #include "communications.h" |
jah128 | 0:d88fd55a27a6 | 16 | #include "display.h" //Display driver for the Midas 16x2 I2C Display |
jah128 | 0:d88fd55a27a6 | 17 | |
jah128 | 2:c81f4ef63132 | 18 | |
jah128 | 1:e4a0d424ac8d | 19 | PwmOut ir_pwm_out(p21); //PWM Output for the IR LED driver |
jah128 | 1:e4a0d424ac8d | 20 | DigitalOut ir_led(LED1); |
jah128 | 2:c81f4ef63132 | 21 | DigitalOut tx_led(LED3); |
jah128 | 1:e4a0d424ac8d | 22 | DigitalOut pir_led(LED4); |
jah128 | 1:e4a0d424ac8d | 23 | AnalogIn input_1(p20); |
jah128 | 1:e4a0d424ac8d | 24 | AnalogIn input_2(p19); |
jah128 | 1:e4a0d424ac8d | 25 | DigitalIn input_3(p18); |
jah128 | 1:e4a0d424ac8d | 26 | DigitalIn input_4(p17); |
jah128 | 1:e4a0d424ac8d | 27 | DigitalIn input_5(p16); |
jah128 | 1:e4a0d424ac8d | 28 | DigitalIn input_6(p15); |
jah128 | 2:c81f4ef63132 | 29 | Serial pc (USBTX, USBRX); |
jah128 | 0:d88fd55a27a6 | 30 | |
jah128 | 0:d88fd55a27a6 | 31 | Display display; |
jah128 | 2:c81f4ef63132 | 32 | Alpha433 rf; |
jah128 | 0:d88fd55a27a6 | 33 | Timer system_timer; //System timer is used for timer the on-off periods for the LEDs |
jah128 | 1:e4a0d424ac8d | 34 | Ticker polling_ticker; //Ticker for polling the input sensors |
jah128 | 0:d88fd55a27a6 | 35 | |
jah128 | 1:e4a0d424ac8d | 36 | int off_period = 950000; //Off-period for the IR LEDs in microseconds |
jah128 | 1:e4a0d424ac8d | 37 | int on_period = 50000; //On-period for the IR LEDs in microseconds |
jah128 | 2:c81f4ef63132 | 38 | char power = 1; //Output power for the IR LEDs : 0=25%, 1=50%, 2=75%, 3=100% (700mA) [NB The LEDs are rated 20mA and are in parallel runs of 20, so a maximum power of 50% is recommended for long term use] |
jah128 | 2:c81f4ef63132 | 39 | char use_ir_leds = 1; //Set to 0 to disable IR LEDs, 1 to enable |
jah128 | 2:c81f4ef63132 | 40 | |
jah128 | 2:c81f4ef63132 | 41 | char input_3_active = 0; |
jah128 | 2:c81f4ef63132 | 42 | char input_4_active = 0; |
jah128 | 2:c81f4ef63132 | 43 | char input_5_active = 0; |
jah128 | 2:c81f4ef63132 | 44 | char input_6_active = 0; |
jah128 | 2:c81f4ef63132 | 45 | |
jah128 | 2:c81f4ef63132 | 46 | int input_3_window = 0; |
jah128 | 2:c81f4ef63132 | 47 | int input_4_window = 0; |
jah128 | 2:c81f4ef63132 | 48 | int input_5_window = 0; |
jah128 | 2:c81f4ef63132 | 49 | int input_6_window = 0; |
jah128 | 2:c81f4ef63132 | 50 | |
jah128 | 2:c81f4ef63132 | 51 | float polling_rate = 0.1; // Period in seconds to poll sensors |
jah128 | 2:c81f4ef63132 | 52 | int polling_decay = 300; // Number of polls to decrement counters |
jah128 | 2:c81f4ef63132 | 53 | int polling_count = 0; |
jah128 | 0:d88fd55a27a6 | 54 | |
jah128 | 0:d88fd55a27a6 | 55 | void init() |
jah128 | 0:d88fd55a27a6 | 56 | { |
jah128 | 0:d88fd55a27a6 | 57 | display.init_display(); |
jah128 | 0:d88fd55a27a6 | 58 | display.set_position(0,2); |
jah128 | 0:d88fd55a27a6 | 59 | display.write_string("YORK ROBOTICS",13); |
jah128 | 0:d88fd55a27a6 | 60 | display.set_position(1,3); |
jah128 | 0:d88fd55a27a6 | 61 | display.write_string("LABORATORY",10); |
jah128 | 0:d88fd55a27a6 | 62 | wait(0.45); |
jah128 | 0:d88fd55a27a6 | 63 | display.clear_display(); |
jah128 | 1:e4a0d424ac8d | 64 | display.set_position(0,1); |
jah128 | 1:e4a0d424ac8d | 65 | display.write_string("Pi Swarm Table",14); |
jah128 | 0:d88fd55a27a6 | 66 | display.set_position(1,3); |
jah128 | 1:e4a0d424ac8d | 67 | display.write_string("Controller",10); |
jah128 | 0:d88fd55a27a6 | 68 | wait(0.45); |
jah128 | 0:d88fd55a27a6 | 69 | } |
jah128 | 0:d88fd55a27a6 | 70 | |
jah128 | 1:e4a0d424ac8d | 71 | int get_output_power(){ |
jah128 | 1:e4a0d424ac8d | 72 | switch(power){ |
jah128 | 1:e4a0d424ac8d | 73 | case 1: return 500; |
jah128 | 1:e4a0d424ac8d | 74 | case 2: return 750; |
jah128 | 1:e4a0d424ac8d | 75 | case 3: return 1000; |
jah128 | 1:e4a0d424ac8d | 76 | } |
jah128 | 1:e4a0d424ac8d | 77 | return 250; |
jah128 | 0:d88fd55a27a6 | 78 | } |
jah128 | 0:d88fd55a27a6 | 79 | |
jah128 | 1:e4a0d424ac8d | 80 | void polling(){ |
jah128 | 2:c81f4ef63132 | 81 | polling_count ++; |
jah128 | 2:c81f4ef63132 | 82 | char pir_active = 0; |
jah128 | 2:c81f4ef63132 | 83 | char state_changed = 0; |
jah128 | 2:c81f4ef63132 | 84 | if(input_3.read()==1){ |
jah128 | 2:c81f4ef63132 | 85 | pir_active = 1; |
jah128 | 2:c81f4ef63132 | 86 | if(input_3_active == 0){ |
jah128 | 2:c81f4ef63132 | 87 | state_changed = 1; |
jah128 | 2:c81f4ef63132 | 88 | input_3_active = 1; |
jah128 | 2:c81f4ef63132 | 89 | input_3_window ++; |
jah128 | 2:c81f4ef63132 | 90 | } |
jah128 | 2:c81f4ef63132 | 91 | }else { |
jah128 | 2:c81f4ef63132 | 92 | input_3_active = 0; |
jah128 | 2:c81f4ef63132 | 93 | if(polling_count == polling_decay){ |
jah128 | 2:c81f4ef63132 | 94 | input_3_window --; |
jah128 | 2:c81f4ef63132 | 95 | if(input_3_window < 0) input_3_window = 0; |
jah128 | 2:c81f4ef63132 | 96 | } |
jah128 | 2:c81f4ef63132 | 97 | } |
jah128 | 2:c81f4ef63132 | 98 | |
jah128 | 2:c81f4ef63132 | 99 | if(input_4.read()==1){ |
jah128 | 2:c81f4ef63132 | 100 | pir_active = 1; |
jah128 | 2:c81f4ef63132 | 101 | if(input_4_active == 0){ |
jah128 | 2:c81f4ef63132 | 102 | state_changed = 1; |
jah128 | 2:c81f4ef63132 | 103 | input_4_active = 1; |
jah128 | 2:c81f4ef63132 | 104 | input_4_window ++; |
jah128 | 2:c81f4ef63132 | 105 | } |
jah128 | 2:c81f4ef63132 | 106 | }else { |
jah128 | 2:c81f4ef63132 | 107 | input_4_active = 0; |
jah128 | 2:c81f4ef63132 | 108 | if(polling_count == polling_decay){ |
jah128 | 2:c81f4ef63132 | 109 | input_4_window --; |
jah128 | 2:c81f4ef63132 | 110 | if(input_4_window < 0) input_4_window = 0; |
jah128 | 2:c81f4ef63132 | 111 | } |
jah128 | 2:c81f4ef63132 | 112 | } |
jah128 | 2:c81f4ef63132 | 113 | |
jah128 | 2:c81f4ef63132 | 114 | if(input_5.read()==1){ |
jah128 | 2:c81f4ef63132 | 115 | pir_active = 1; |
jah128 | 2:c81f4ef63132 | 116 | if(input_5_active == 0){ |
jah128 | 2:c81f4ef63132 | 117 | state_changed = 1; |
jah128 | 2:c81f4ef63132 | 118 | input_5_active = 1; |
jah128 | 2:c81f4ef63132 | 119 | input_5_window ++; |
jah128 | 2:c81f4ef63132 | 120 | } |
jah128 | 2:c81f4ef63132 | 121 | }else { |
jah128 | 2:c81f4ef63132 | 122 | input_5_active = 0; |
jah128 | 2:c81f4ef63132 | 123 | if(polling_count == polling_decay){ |
jah128 | 2:c81f4ef63132 | 124 | input_5_window --; |
jah128 | 2:c81f4ef63132 | 125 | if(input_5_window < 0) input_5_window = 0; |
jah128 | 2:c81f4ef63132 | 126 | } |
jah128 | 2:c81f4ef63132 | 127 | } |
jah128 | 2:c81f4ef63132 | 128 | |
jah128 | 2:c81f4ef63132 | 129 | if(input_6.read()==1){ |
jah128 | 2:c81f4ef63132 | 130 | pir_active = 1; |
jah128 | 2:c81f4ef63132 | 131 | if(input_6_active == 0){ |
jah128 | 2:c81f4ef63132 | 132 | state_changed = 1; |
jah128 | 2:c81f4ef63132 | 133 | input_6_active = 1; |
jah128 | 2:c81f4ef63132 | 134 | input_6_window ++; |
jah128 | 2:c81f4ef63132 | 135 | } |
jah128 | 2:c81f4ef63132 | 136 | }else { |
jah128 | 2:c81f4ef63132 | 137 | input_6_active = 0; |
jah128 | 2:c81f4ef63132 | 138 | if(polling_count == polling_decay){ |
jah128 | 2:c81f4ef63132 | 139 | input_6_window --; |
jah128 | 2:c81f4ef63132 | 140 | if(input_6_window < 0) input_6_window = 0; |
jah128 | 2:c81f4ef63132 | 141 | } |
jah128 | 2:c81f4ef63132 | 142 | } |
jah128 | 2:c81f4ef63132 | 143 | |
jah128 | 2:c81f4ef63132 | 144 | pir_led=pir_active; |
jah128 | 2:c81f4ef63132 | 145 | if(polling_count == polling_decay) { |
jah128 | 2:c81f4ef63132 | 146 | polling_count = 0; |
jah128 | 2:c81f4ef63132 | 147 | state_changed = 1; |
jah128 | 2:c81f4ef63132 | 148 | } |
jah128 | 2:c81f4ef63132 | 149 | if(state_changed == 1){ |
jah128 | 2:c81f4ef63132 | 150 | display.clear_display(); |
jah128 | 2:c81f4ef63132 | 151 | display.set_position(0,0); |
jah128 | 2:c81f4ef63132 | 152 | char text [17]; |
jah128 | 2:c81f4ef63132 | 153 | snprintf(text,17,"3:%i 4:%i 5:%i 6:%i",input_3_window,input_4_window,input_5_window,input_6_window); |
jah128 | 2:c81f4ef63132 | 154 | display.write_string(text,16); |
jah128 | 2:c81f4ef63132 | 155 | } |
jah128 | 0:d88fd55a27a6 | 156 | } |
jah128 | 0:d88fd55a27a6 | 157 | |
jah128 | 0:d88fd55a27a6 | 158 | int main() |
jah128 | 0:d88fd55a27a6 | 159 | { |
jah128 | 0:d88fd55a27a6 | 160 | init(); |
jah128 | 1:e4a0d424ac8d | 161 | char phase = 0; |
jah128 | 0:d88fd55a27a6 | 162 | system_timer.start(); |
jah128 | 1:e4a0d424ac8d | 163 | ir_pwm_out.period_us(1000); |
jah128 | 1:e4a0d424ac8d | 164 | ir_pwm_out.pulsewidth_us(0); |
jah128 | 1:e4a0d424ac8d | 165 | polling_ticker.attach(&polling,0.1); |
jah128 | 1:e4a0d424ac8d | 166 | |
jah128 | 0:d88fd55a27a6 | 167 | |
jah128 | 0:d88fd55a27a6 | 168 | while(1) { |
jah128 | 0:d88fd55a27a6 | 169 | if(phase==0){ |
jah128 | 1:e4a0d424ac8d | 170 | if(system_timer.read_us() >= off_period){ |
jah128 | 0:d88fd55a27a6 | 171 | system_timer.reset(); |
jah128 | 1:e4a0d424ac8d | 172 | int pw = get_output_power(); |
jah128 | 1:e4a0d424ac8d | 173 | if(use_ir_leds) ir_pwm_out.pulsewidth_us(pw); |
jah128 | 1:e4a0d424ac8d | 174 | ir_led=1; |
jah128 | 0:d88fd55a27a6 | 175 | phase = 1; |
jah128 | 0:d88fd55a27a6 | 176 | } |
jah128 | 0:d88fd55a27a6 | 177 | }else{ |
jah128 | 1:e4a0d424ac8d | 178 | if(system_timer.read_us() >= on_period){ |
jah128 | 0:d88fd55a27a6 | 179 | system_timer.reset(); |
jah128 | 1:e4a0d424ac8d | 180 | ir_pwm_out.pulsewidth_us(0); |
jah128 | 1:e4a0d424ac8d | 181 | ir_led=0; |
jah128 | 0:d88fd55a27a6 | 182 | phase = 0; |
jah128 | 0:d88fd55a27a6 | 183 | } |
jah128 | 0:d88fd55a27a6 | 184 | } |
jah128 | 0:d88fd55a27a6 | 185 | } |
jah128 | 2:c81f4ef63132 | 186 | } |
jah128 | 2:c81f4ef63132 | 187 | |
jah128 | 2:c81f4ef63132 | 188 | |
jah128 | 2:c81f4ef63132 | 189 | void handleUserRFCommand(char sender, char broadcast_message, char request_response, char id, char is_command, char function, char * data, char length){ |
jah128 | 2:c81f4ef63132 | 190 | } |
jah128 | 2:c81f4ef63132 | 191 | |
jah128 | 2:c81f4ef63132 | 192 | void handleUserRFResponse(char sender, char broadcast_message, char success, char id, char is_command, char function, char * data, char length){ |
jah128 | 2:c81f4ef63132 | 193 | } |
jah128 | 2:c81f4ef63132 | 194 | |
jah128 | 2:c81f4ef63132 | 195 | void processRawRFData(char * rstring, char cCount){ |
jah128 | 2:c81f4ef63132 | 196 | } |
jah128 | 2:c81f4ef63132 | 197 | |
jah128 | 2:c81f4ef63132 | 198 | |
jah128 | 2:c81f4ef63132 | 199 | void handleData(char * data, char length) |
jah128 | 2:c81f4ef63132 | 200 | { |
jah128 | 2:c81f4ef63132 | 201 | display.set_position(1,1); |
jah128 | 2:c81f4ef63132 | 202 | display.write_string(data,length); |
jah128 | 2:c81f4ef63132 | 203 | } |