
Retractable steering wheel
Dependencies: DebounceIn EthernetInterface PinDetect mbed-rtos mbed
main.cpp@5:bda4be356312, 2016-08-05 (annotated)
- Committer:
- awatt196
- Date:
- Fri Aug 05 10:42:10 2016 +0000
- Revision:
- 5:bda4be356312
- Parent:
- 4:9480e12a2e08
APM version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
awatt196 | 0:f0a73098a628 | 1 | #include "mbed.h" |
awatt196 | 0:f0a73098a628 | 2 | #include "PinDetect.h" |
awatt196 | 0:f0a73098a628 | 3 | #include "DebounceIn.h" |
awatt196 | 0:f0a73098a628 | 4 | #include "EthernetInterface.h" |
awatt196 | 0:f0a73098a628 | 5 | |
awatt196 | 0:f0a73098a628 | 6 | #define ECHO_SERVER_PORT 4547 |
awatt196 | 0:f0a73098a628 | 7 | |
awatt196 | 0:f0a73098a628 | 8 | DigitalOut myled(LED1); |
awatt196 | 0:f0a73098a628 | 9 | |
awatt196 | 0:f0a73098a628 | 10 | //**********FIRGELLI**********// |
awatt196 | 0:f0a73098a628 | 11 | DigitalOut extend(PTB9); //extends actuator |
awatt196 | 0:f0a73098a628 | 12 | DigitalOut retract(PTB2); //retracts actuator |
awatt196 | 0:f0a73098a628 | 13 | //AnalogIn ain(PTC10); //pot wiper (no longer needed) |
awatt196 | 0:f0a73098a628 | 14 | Timer extend_timer; |
awatt196 | 0:f0a73098a628 | 15 | Timer retract_timer; |
awatt196 | 0:f0a73098a628 | 16 | void extend_actuator(); //extends actuator |
awatt196 | 0:f0a73098a628 | 17 | void retract_actuator(); //retracts actuator |
awatt196 | 0:f0a73098a628 | 18 | //**********FIRGELLI**********// |
awatt196 | 0:f0a73098a628 | 19 | |
awatt196 | 0:f0a73098a628 | 20 | //**********SCREW**********// |
awatt196 | 5:bda4be356312 | 21 | DigitalOut dir(PTD2); |
awatt196 | 0:f0a73098a628 | 22 | DigitalOut step(PTD0); |
awatt196 | 5:bda4be356312 | 23 | DigitalOut motor_power(PTB3); |
awatt196 | 0:f0a73098a628 | 24 | DebounceIn switch_top(PTC3); //top limit switch |
awatt196 | 5:bda4be356312 | 25 | DebounceIn switch_bottom(PTC2); //bottom limit switch |
awatt196 | 0:f0a73098a628 | 26 | void motor_power_function(int on_off); //on=1, off=0 |
awatt196 | 0:f0a73098a628 | 27 | void stop_top(); |
awatt196 | 0:f0a73098a628 | 28 | void stop_bottom(); |
awatt196 | 0:f0a73098a628 | 29 | void move_up(); |
awatt196 | 0:f0a73098a628 | 30 | void move_down(); |
awatt196 | 0:f0a73098a628 | 31 | //**********SCREW**********// |
awatt196 | 0:f0a73098a628 | 32 | |
awatt196 | 0:f0a73098a628 | 33 | //**********SEAT**********// |
awatt196 | 0:f0a73098a628 | 34 | //AnalogIn ain(PTC10); //output from potential divider |
awatt196 | 0:f0a73098a628 | 35 | //bool sitting = false; |
awatt196 | 0:f0a73098a628 | 36 | //bool seat_state(); //Check state of seat. Returns boolean value for the state of the seat (sitting=true, not sitting=false) |
awatt196 | 0:f0a73098a628 | 37 | //void person_sitting(); //function called if person sits down |
awatt196 | 0:f0a73098a628 | 38 | //**********SEAT**********// |
awatt196 | 0:f0a73098a628 | 39 | |
awatt196 | 0:f0a73098a628 | 40 | //**********SYSTEM**********// |
awatt196 | 5:bda4be356312 | 41 | PinDetect reset_switch(PTC16); |
awatt196 | 0:f0a73098a628 | 42 | //void reset_system(); //resets system in case of fault |
awatt196 | 0:f0a73098a628 | 43 | //**********SYSTEM**********// |
awatt196 | 0:f0a73098a628 | 44 | |
awatt196 | 0:f0a73098a628 | 45 | Serial pc(USBTX, USBRX); // tx, rx |
awatt196 | 0:f0a73098a628 | 46 | |
awatt196 | 0:f0a73098a628 | 47 | //**********FIRGELLI**********// |
awatt196 | 0:f0a73098a628 | 48 | void extend_actuator() |
awatt196 | 0:f0a73098a628 | 49 | { |
awatt196 | 0:f0a73098a628 | 50 | pc.printf("extend\r\n"); |
awatt196 | 0:f0a73098a628 | 51 | extend_timer.start(); |
awatt196 | 5:bda4be356312 | 52 | while(extend_timer.read() < 6) |
awatt196 | 0:f0a73098a628 | 53 | { |
awatt196 | 0:f0a73098a628 | 54 | extend = 1; |
awatt196 | 0:f0a73098a628 | 55 | retract = 0; |
awatt196 | 0:f0a73098a628 | 56 | } |
awatt196 | 0:f0a73098a628 | 57 | extend = 0; |
awatt196 | 0:f0a73098a628 | 58 | retract = 0; |
awatt196 | 0:f0a73098a628 | 59 | |
awatt196 | 0:f0a73098a628 | 60 | extend_timer.stop(); |
awatt196 | 0:f0a73098a628 | 61 | extend_timer.reset(); |
awatt196 | 0:f0a73098a628 | 62 | } |
awatt196 | 0:f0a73098a628 | 63 | |
awatt196 | 0:f0a73098a628 | 64 | void retract_actuator() |
awatt196 | 0:f0a73098a628 | 65 | { |
awatt196 | 0:f0a73098a628 | 66 | pc.printf("retract\r\n"); |
awatt196 | 0:f0a73098a628 | 67 | retract_timer.start(); |
awatt196 | 5:bda4be356312 | 68 | while(retract_timer.read() < 6) |
awatt196 | 0:f0a73098a628 | 69 | { |
awatt196 | 0:f0a73098a628 | 70 | extend = 0; |
awatt196 | 0:f0a73098a628 | 71 | retract = 1; |
awatt196 | 0:f0a73098a628 | 72 | } |
awatt196 | 0:f0a73098a628 | 73 | extend = 0; |
awatt196 | 0:f0a73098a628 | 74 | retract = 0; |
awatt196 | 0:f0a73098a628 | 75 | |
awatt196 | 0:f0a73098a628 | 76 | retract_timer.stop(); |
awatt196 | 0:f0a73098a628 | 77 | retract_timer.reset(); |
awatt196 | 0:f0a73098a628 | 78 | } |
awatt196 | 0:f0a73098a628 | 79 | //**********FIRGELLI**********// |
awatt196 | 0:f0a73098a628 | 80 | |
awatt196 | 0:f0a73098a628 | 81 | //**********SEAT**********// |
awatt196 | 0:f0a73098a628 | 82 | /* |
awatt196 | 0:f0a73098a628 | 83 | bool seat_state() |
awatt196 | 0:f0a73098a628 | 84 | { |
awatt196 | 0:f0a73098a628 | 85 | double sitting_feedback = ain.read(); |
awatt196 | 0:f0a73098a628 | 86 | // 0.01 < sitting_feedback < 0.99 = person sitting |
awatt196 | 0:f0a73098a628 | 87 | // 0.01 > sitting_feedback > 0.99 = person not sitting |
awatt196 | 0:f0a73098a628 | 88 | if(sitting_feedback > 0.99 || sitting_feedback < 0.01) //(problem with occassionally jumping to 0.00....) |
awatt196 | 0:f0a73098a628 | 89 | { |
awatt196 | 0:f0a73098a628 | 90 | sitting = false; //no one is sitting, therefore continue as normal |
awatt196 | 0:f0a73098a628 | 91 | } |
awatt196 | 0:f0a73098a628 | 92 | else |
awatt196 | 0:f0a73098a628 | 93 | { |
awatt196 | 5:bda4be356312 | 94 | sitting = false; //person is sitting, therefore stop movement of steering wheel |
awatt196 | 0:f0a73098a628 | 95 | //change to true |
awatt196 | 0:f0a73098a628 | 96 | } |
awatt196 | 0:f0a73098a628 | 97 | |
awatt196 | 0:f0a73098a628 | 98 | return sitting; |
awatt196 | 0:f0a73098a628 | 99 | } |
awatt196 | 0:f0a73098a628 | 100 | |
awatt196 | 0:f0a73098a628 | 101 | void person_sitting() |
awatt196 | 0:f0a73098a628 | 102 | { |
awatt196 | 0:f0a73098a628 | 103 | //stop movement of both actuators and add a wait |
awatt196 | 0:f0a73098a628 | 104 | pc.printf("person_sitting\r\n"); |
awatt196 | 0:f0a73098a628 | 105 | step=0; |
awatt196 | 0:f0a73098a628 | 106 | motor_power_function(0); |
awatt196 | 0:f0a73098a628 | 107 | wait(3); //delay before starting to move again |
awatt196 | 0:f0a73098a628 | 108 | } |
awatt196 | 0:f0a73098a628 | 109 | */ |
awatt196 | 0:f0a73098a628 | 110 | //**********SEAT**********// |
awatt196 | 0:f0a73098a628 | 111 | |
awatt196 | 0:f0a73098a628 | 112 | //**********SCREW**********// |
awatt196 | 0:f0a73098a628 | 113 | void motor_power_function(int on_off) //on=1, off=0 |
awatt196 | 0:f0a73098a628 | 114 | { |
awatt196 | 0:f0a73098a628 | 115 | pc.printf("motor_power=%i\r\n", on_off); |
awatt196 | 0:f0a73098a628 | 116 | motor_power = on_off; |
awatt196 | 0:f0a73098a628 | 117 | } |
awatt196 | 0:f0a73098a628 | 118 | |
awatt196 | 0:f0a73098a628 | 119 | void stop_top() |
awatt196 | 0:f0a73098a628 | 120 | { |
awatt196 | 0:f0a73098a628 | 121 | pc.printf("stop_top\r\n"); |
awatt196 | 0:f0a73098a628 | 122 | step=0; |
awatt196 | 0:f0a73098a628 | 123 | motor_power_function(0); |
awatt196 | 5:bda4be356312 | 124 | wait(0.5); |
awatt196 | 0:f0a73098a628 | 125 | extend_actuator(); //extend actuator once the gantry reaches the top |
awatt196 | 0:f0a73098a628 | 126 | } |
awatt196 | 0:f0a73098a628 | 127 | |
awatt196 | 0:f0a73098a628 | 128 | void stop_bottom() |
awatt196 | 0:f0a73098a628 | 129 | { |
awatt196 | 0:f0a73098a628 | 130 | pc.printf("stop_bottom\r\n"); |
awatt196 | 0:f0a73098a628 | 131 | step=0; |
awatt196 | 0:f0a73098a628 | 132 | wait(0.1); |
awatt196 | 0:f0a73098a628 | 133 | motor_power_function(0); |
awatt196 | 0:f0a73098a628 | 134 | } |
awatt196 | 0:f0a73098a628 | 135 | |
awatt196 | 0:f0a73098a628 | 136 | void move_up() |
awatt196 | 0:f0a73098a628 | 137 | { |
awatt196 | 0:f0a73098a628 | 138 | pc.printf("move_up\r\n"); |
awatt196 | 0:f0a73098a628 | 139 | motor_power_function(1); |
awatt196 | 0:f0a73098a628 | 140 | wait(0.1); |
awatt196 | 0:f0a73098a628 | 141 | |
awatt196 | 0:f0a73098a628 | 142 | //if (seat_state()==false) //seat free |
awatt196 | 0:f0a73098a628 | 143 | //{ |
awatt196 | 0:f0a73098a628 | 144 | while(switch_top != 1) |
awatt196 | 0:f0a73098a628 | 145 | { |
awatt196 | 0:f0a73098a628 | 146 | //if (seat_state()==false) //check initial state before moving |
awatt196 | 0:f0a73098a628 | 147 | //{ |
awatt196 | 0:f0a73098a628 | 148 | dir=0; //0 is up |
awatt196 | 0:f0a73098a628 | 149 | step=1; |
awatt196 | 0:f0a73098a628 | 150 | wait(0.0009); //0.0009 is min. wait |
awatt196 | 0:f0a73098a628 | 151 | step=0; |
awatt196 | 0:f0a73098a628 | 152 | wait(0.0009); |
awatt196 | 0:f0a73098a628 | 153 | //} |
awatt196 | 0:f0a73098a628 | 154 | //else |
awatt196 | 0:f0a73098a628 | 155 | //{ |
awatt196 | 0:f0a73098a628 | 156 | // person_sitting(); //stop movement |
awatt196 | 0:f0a73098a628 | 157 | //} |
awatt196 | 0:f0a73098a628 | 158 | } |
awatt196 | 0:f0a73098a628 | 159 | //} |
awatt196 | 0:f0a73098a628 | 160 | stop_top(); |
awatt196 | 0:f0a73098a628 | 161 | } |
awatt196 | 0:f0a73098a628 | 162 | |
awatt196 | 0:f0a73098a628 | 163 | void move_down() |
awatt196 | 0:f0a73098a628 | 164 | { |
awatt196 | 0:f0a73098a628 | 165 | pc.printf("move_down\r\n"); |
awatt196 | 0:f0a73098a628 | 166 | retract_actuator(); //retract actuator before gantry moves down |
awatt196 | 0:f0a73098a628 | 167 | motor_power_function(1); |
awatt196 | 0:f0a73098a628 | 168 | wait(0.1); |
awatt196 | 0:f0a73098a628 | 169 | |
awatt196 | 0:f0a73098a628 | 170 | //if (seat_state()==false) //seat free |
awatt196 | 0:f0a73098a628 | 171 | //{ |
awatt196 | 0:f0a73098a628 | 172 | while(switch_bottom != 1) |
awatt196 | 0:f0a73098a628 | 173 | { |
awatt196 | 0:f0a73098a628 | 174 | //if (seat_state()==false) //check initial state before moving |
awatt196 | 0:f0a73098a628 | 175 | //{ |
awatt196 | 0:f0a73098a628 | 176 | dir=1; //1 is down |
awatt196 | 0:f0a73098a628 | 177 | step=1; |
awatt196 | 0:f0a73098a628 | 178 | wait(0.0009); |
awatt196 | 0:f0a73098a628 | 179 | step=0; |
awatt196 | 0:f0a73098a628 | 180 | wait(0.0009); |
awatt196 | 0:f0a73098a628 | 181 | //} |
awatt196 | 0:f0a73098a628 | 182 | //} |
awatt196 | 0:f0a73098a628 | 183 | } |
awatt196 | 0:f0a73098a628 | 184 | stop_bottom(); |
awatt196 | 0:f0a73098a628 | 185 | } |
awatt196 | 0:f0a73098a628 | 186 | |
awatt196 | 0:f0a73098a628 | 187 | //**********SCREW**********// |
awatt196 | 0:f0a73098a628 | 188 | |
awatt196 | 0:f0a73098a628 | 189 | int main() { |
awatt196 | 1:fa873fbcf141 | 190 | reset_switch.mode(PullDown); |
awatt196 | 1:fa873fbcf141 | 191 | reset_switch.attach_asserted(&NVIC_SystemReset); |
awatt196 | 1:fa873fbcf141 | 192 | reset_switch.setSampleFrequency(); |
awatt196 | 0:f0a73098a628 | 193 | |
awatt196 | 0:f0a73098a628 | 194 | switch_top.mode(PullDown); |
awatt196 | 0:f0a73098a628 | 195 | switch_bottom.mode(PullDown); |
awatt196 | 0:f0a73098a628 | 196 | |
awatt196 | 0:f0a73098a628 | 197 | wait(0.01);//delay for pullups |
awatt196 | 0:f0a73098a628 | 198 | |
awatt196 | 0:f0a73098a628 | 199 | motor_power_function(0); //start off with motor off |
awatt196 | 0:f0a73098a628 | 200 | |
awatt196 | 0:f0a73098a628 | 201 | EthernetInterface eth; |
awatt196 | 0:f0a73098a628 | 202 | eth.init(); //Use DHCP |
awatt196 | 0:f0a73098a628 | 203 | eth.connect(); |
awatt196 | 0:f0a73098a628 | 204 | printf("\nServer IP Address is %s\n", eth.getIPAddress()); |
awatt196 | 0:f0a73098a628 | 205 | |
awatt196 | 0:f0a73098a628 | 206 | UDPSocket server; |
awatt196 | 0:f0a73098a628 | 207 | server.bind(ECHO_SERVER_PORT); |
awatt196 | 0:f0a73098a628 | 208 | |
awatt196 | 0:f0a73098a628 | 209 | Endpoint client; |
awatt196 | 0:f0a73098a628 | 210 | char buffer[256]; |
awatt196 | 0:f0a73098a628 | 211 | char state_buffer[] = "{\"name\":\"steering\"}"; |
awatt196 | 0:f0a73098a628 | 212 | int state_buffer_size = strlen(state_buffer); |
awatt196 | 0:f0a73098a628 | 213 | char deploy_buffer[] = "{\"name\":\"steering\",\"state\":\"deployed\"}"; |
awatt196 | 0:f0a73098a628 | 214 | int deploy_buffer_size = strlen(deploy_buffer); |
awatt196 | 0:f0a73098a628 | 215 | char retract_buffer[] = "{\"name\":\"steering\",\"state\":\"retracted\"}"; |
awatt196 | 0:f0a73098a628 | 216 | int retract_buffer_size = strlen(retract_buffer); |
awatt196 | 0:f0a73098a628 | 217 | |
awatt196 | 0:f0a73098a628 | 218 | printf("switch_top = %d\r\n", switch_top.read()); |
awatt196 | 0:f0a73098a628 | 219 | printf("switch_bottom = %d\r\n", switch_bottom.read()); |
awatt196 | 0:f0a73098a628 | 220 | |
awatt196 | 5:bda4be356312 | 221 | //initial check to put steering wheel in deployed position |
awatt196 | 0:f0a73098a628 | 222 | printf("Checking initial state...\r\n"); |
awatt196 | 0:f0a73098a628 | 223 | printf("Initial state is "); |
awatt196 | 0:f0a73098a628 | 224 | if (switch_top == 1) |
awatt196 | 0:f0a73098a628 | 225 | { |
awatt196 | 0:f0a73098a628 | 226 | printf("deployed\n"); |
awatt196 | 0:f0a73098a628 | 227 | extend_actuator(); //Already at the top. Extend firgelli if need be |
awatt196 | 0:f0a73098a628 | 228 | } |
awatt196 | 0:f0a73098a628 | 229 | else if (switch_bottom == 1) |
awatt196 | 0:f0a73098a628 | 230 | { |
awatt196 | 0:f0a73098a628 | 231 | printf("retracted\n"); |
awatt196 | 0:f0a73098a628 | 232 | move_up(); //move up to top for the starting position |
awatt196 | 0:f0a73098a628 | 233 | } |
awatt196 | 0:f0a73098a628 | 234 | else //neither switch is pressed - midway between states |
awatt196 | 0:f0a73098a628 | 235 | { |
awatt196 | 0:f0a73098a628 | 236 | printf("midway. Deploying...\n"); |
awatt196 | 0:f0a73098a628 | 237 | move_up(); //move up to top (reset) |
awatt196 | 0:f0a73098a628 | 238 | } |
awatt196 | 0:f0a73098a628 | 239 | |
awatt196 | 0:f0a73098a628 | 240 | while(1) { |
awatt196 | 0:f0a73098a628 | 241 | myled = !myled; |
awatt196 | 0:f0a73098a628 | 242 | |
awatt196 | 0:f0a73098a628 | 243 | printf("\nWaiting for UDP packet...\n"); |
awatt196 | 0:f0a73098a628 | 244 | int n = server.receiveFrom(client, buffer, sizeof(buffer)); |
awatt196 | 0:f0a73098a628 | 245 | buffer[n] = '\0'; |
awatt196 | 0:f0a73098a628 | 246 | |
awatt196 | 0:f0a73098a628 | 247 | printf("Received packet from: %s\n", client.get_address()); |
awatt196 | 0:f0a73098a628 | 248 | printf("Packet contents : '%s'\n",buffer); |
awatt196 | 0:f0a73098a628 | 249 | |
awatt196 | 0:f0a73098a628 | 250 | if (strcmp(buffer, state_buffer) == 0) //queries current state |
awatt196 | 0:f0a73098a628 | 251 | { |
awatt196 | 0:f0a73098a628 | 252 | //return 'deployed' or 'retracted' depending on the limit switches |
awatt196 | 0:f0a73098a628 | 253 | if (switch_top == 1) |
awatt196 | 0:f0a73098a628 | 254 | { |
awatt196 | 0:f0a73098a628 | 255 | printf("Sending state (deployed) packet back to client\n"); |
awatt196 | 0:f0a73098a628 | 256 | server.sendTo(client, deploy_buffer, deploy_buffer_size); |
awatt196 | 0:f0a73098a628 | 257 | } |
awatt196 | 0:f0a73098a628 | 258 | else if (switch_bottom == 1) |
awatt196 | 0:f0a73098a628 | 259 | { |
awatt196 | 0:f0a73098a628 | 260 | printf("Sending state (retracted) packet back to client\n"); |
awatt196 | 0:f0a73098a628 | 261 | server.sendTo(client, retract_buffer, retract_buffer_size); |
awatt196 | 0:f0a73098a628 | 262 | } |
awatt196 | 0:f0a73098a628 | 263 | else //nothing |
awatt196 | 0:f0a73098a628 | 264 | { |
awatt196 | 0:f0a73098a628 | 265 | } |
awatt196 | 0:f0a73098a628 | 266 | } |
awatt196 | 0:f0a73098a628 | 267 | else if (strcmp(buffer, deploy_buffer) == 0) //deploy request |
awatt196 | 0:f0a73098a628 | 268 | { |
awatt196 | 0:f0a73098a628 | 269 | move_up(); |
awatt196 | 0:f0a73098a628 | 270 | printf("Sending deployed packet back to client\n"); |
awatt196 | 0:f0a73098a628 | 271 | server.sendTo(client, buffer, n); |
awatt196 | 0:f0a73098a628 | 272 | } |
awatt196 | 0:f0a73098a628 | 273 | else if (strcmp(buffer, retract_buffer) == 0) //retract request |
awatt196 | 0:f0a73098a628 | 274 | { |
awatt196 | 0:f0a73098a628 | 275 | move_down(); |
awatt196 | 0:f0a73098a628 | 276 | printf("Sending retracted packet back to client\n"); |
awatt196 | 0:f0a73098a628 | 277 | server.sendTo(client, buffer, n); |
awatt196 | 0:f0a73098a628 | 278 | } |
awatt196 | 0:f0a73098a628 | 279 | else //invalid request |
awatt196 | 0:f0a73098a628 | 280 | { |
awatt196 | 0:f0a73098a628 | 281 | printf("Invalid request. Error.\n"); |
awatt196 | 0:f0a73098a628 | 282 | } |
awatt196 | 0:f0a73098a628 | 283 | } |
awatt196 | 0:f0a73098a628 | 284 | } |