Retractable steering wheel

Dependencies:   DebounceIn EthernetInterface PinDetect mbed-rtos mbed

Committer:
awatt196
Date:
Thu Jul 21 13:50:25 2016 +0000
Revision:
3:b72259b5cc7a
Parent:
1:fa873fbcf141
Child:
4:9480e12a2e08
Pins changed to fit protoshield

Who changed what in which revision?

UserRevisionLine numberNew 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 3:b72259b5cc7a 21 DigitalOut dir(PTC17); //PTE24 not on shield
awatt196 0:f0a73098a628 22 DigitalOut step(PTD0);
awatt196 3:b72259b5cc7a 23 DigitalOut motor_power(PTB3); //PTB20 not on shield
awatt196 0:f0a73098a628 24 DebounceIn switch_top(PTC3); //top limit switch
awatt196 3:b72259b5cc7a 25 DebounceIn switch_bottom(PTC2); //bottom limit switch - PTC5 not on shield
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 3:b72259b5cc7a 41 PinDetect reset_switch(PTB18); //PTB18 not on shield
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 0:f0a73098a628 52 while(extend_timer.read() < 7)
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 0:f0a73098a628 68 while(retract_timer.read() < 7)
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 0:f0a73098a628 94 sitting = false; //person is sitting, therfore 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 0:f0a73098a628 124 wait(2);
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 0:f0a73098a628 221 //initial check to put steering wheel in retracted 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 }