Retractable steering wheel

Dependencies:   DebounceIn EthernetInterface PinDetect mbed-rtos mbed

Revision:
0:f0a73098a628
Child:
1:fa873fbcf141
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jul 01 13:49:53 2016 +0000
@@ -0,0 +1,284 @@
+#include "mbed.h"
+#include "PinDetect.h"
+#include "DebounceIn.h"
+#include "EthernetInterface.h"
+
+#define ECHO_SERVER_PORT   4547
+
+DigitalOut myled(LED1);
+
+//**********FIRGELLI**********//
+DigitalOut extend(PTB9); //extends actuator
+DigitalOut retract(PTB2); //retracts actuator
+//AnalogIn   ain(PTC10); //pot wiper (no longer needed)
+Timer extend_timer;
+Timer retract_timer;
+void extend_actuator(); //extends actuator
+void retract_actuator(); //retracts actuator
+//**********FIRGELLI**********//
+
+//**********SCREW**********//
+DigitalOut dir(PTE24);
+DigitalOut step(PTD0);
+DigitalOut motor_power(PTB20);
+DebounceIn   switch_top(PTC3);       //top limit switch
+DebounceIn   switch_bottom(PTC5);    //bottom limit switch
+void motor_power_function(int on_off); //on=1, off=0
+void stop_top();
+void stop_bottom();
+void move_up();
+void move_down();
+//**********SCREW**********// 
+
+//**********SEAT**********//
+//AnalogIn   ain(PTC10); //output from potential divider
+//bool sitting = false;
+//bool seat_state(); //Check state of seat.  Returns boolean value for the state of the seat (sitting=true, not sitting=false)
+//void person_sitting(); //function called if person sits down
+//**********SEAT**********//
+
+//**********SYSTEM**********// 
+//PinDetect reset_switch(PTB18);
+//void reset_system(); //resets system in case of fault
+//**********SYSTEM**********//
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+//**********FIRGELLI**********//
+void extend_actuator()
+{
+    pc.printf("extend\r\n");
+    extend_timer.start();
+    while(extend_timer.read() < 7)
+    {
+        extend = 1;
+        retract = 0;
+    }
+    extend = 0;
+    retract = 0;
+    
+    extend_timer.stop();
+    extend_timer.reset();
+}
+
+void retract_actuator()
+{
+    pc.printf("retract\r\n");
+    retract_timer.start();
+    while(retract_timer.read() < 7)
+    {
+        extend = 0;
+        retract = 1;
+    }
+    extend = 0;
+    retract = 0;
+    
+    retract_timer.stop();
+    retract_timer.reset();
+}
+//**********FIRGELLI**********//
+
+//**********SEAT**********//
+/*
+bool seat_state()
+{
+    double sitting_feedback = ain.read();
+    // 0.01 < sitting_feedback < 0.99 = person sitting
+    // 0.01 > sitting_feedback > 0.99 = person not sitting
+    if(sitting_feedback > 0.99 || sitting_feedback < 0.01) //(problem with occassionally jumping to 0.00....)
+    {
+        sitting = false; //no one is sitting, therefore continue as normal
+    }
+    else
+    {
+        sitting = false; //person is sitting, therfore stop movement of steering wheel
+        //change to true
+    }
+    
+    return sitting;
+}
+
+void person_sitting() 
+{
+    //stop movement of both actuators and add a wait
+    pc.printf("person_sitting\r\n");
+    step=0;
+    motor_power_function(0);
+    wait(3); //delay before starting to move again
+}
+*/
+//**********SEAT**********//
+
+//**********SCREW**********// 
+void motor_power_function(int on_off) //on=1, off=0
+{
+    pc.printf("motor_power=%i\r\n", on_off);
+    motor_power = on_off;
+}
+
+void stop_top()
+{
+    pc.printf("stop_top\r\n");
+    step=0;
+    motor_power_function(0);
+    wait(2);
+    extend_actuator(); //extend actuator once the gantry reaches the top
+}
+
+void stop_bottom()
+{
+    pc.printf("stop_bottom\r\n");
+    step=0;
+    wait(0.1);
+    motor_power_function(0);
+}
+
+void move_up()
+{
+    pc.printf("move_up\r\n");
+    motor_power_function(1);
+    wait(0.1);
+    
+    //if (seat_state()==false) //seat free
+    //{
+    while(switch_top != 1)
+    {
+            //if (seat_state()==false) //check initial state before moving
+            //{
+        dir=0; //0 is up
+        step=1;
+        wait(0.0009); //0.0009 is min. wait
+        step=0;
+        wait(0.0009);
+            //}
+            //else
+            //{
+            //    person_sitting(); //stop movement
+            //}
+    }
+    //}
+    stop_top();
+}
+
+void move_down()
+{
+    pc.printf("move_down\r\n");
+    retract_actuator(); //retract actuator before gantry moves down
+    motor_power_function(1);
+    wait(0.1);
+    
+    //if (seat_state()==false) //seat free
+    //{
+    while(switch_bottom != 1)
+    {
+            //if (seat_state()==false) //check initial state before moving
+            //{
+        dir=1; //1 is down
+        step=1;
+        wait(0.0009); 
+        step=0;
+        wait(0.0009);
+            //}
+        //}
+    }
+    stop_bottom();
+}
+
+//**********SCREW**********// 
+
+int main() {
+    //reset_switch.mode(PullDown);
+    //reset_switch.attach_asserted(&NVIC_SystemReset);
+    //reset_switch.setSampleFrequency();
+    
+    switch_top.mode(PullDown);
+    switch_bottom.mode(PullDown);
+      
+    wait(0.01);//delay for pullups
+    
+    motor_power_function(0); //start off with motor off
+
+    EthernetInterface eth;
+    eth.init(); //Use DHCP
+    eth.connect();
+    printf("\nServer IP Address is %s\n", eth.getIPAddress());
+    
+    UDPSocket server;
+    server.bind(ECHO_SERVER_PORT);
+    
+    Endpoint client;
+    char buffer[256];
+    char state_buffer[] = "{\"name\":\"steering\"}";
+    int state_buffer_size = strlen(state_buffer);
+    char deploy_buffer[] = "{\"name\":\"steering\",\"state\":\"deployed\"}";
+    int deploy_buffer_size = strlen(deploy_buffer);
+    char retract_buffer[] = "{\"name\":\"steering\",\"state\":\"retracted\"}";
+    int retract_buffer_size = strlen(retract_buffer);
+    
+    printf("switch_top = %d\r\n", switch_top.read());
+    printf("switch_bottom = %d\r\n", switch_bottom.read());
+    
+    //initial check to put steering wheel in retracted position
+    printf("Checking initial state...\r\n");
+    printf("Initial state is ");
+    if (switch_top == 1)
+    {
+        printf("deployed\n");
+        extend_actuator(); //Already at the top.  Extend firgelli if need be
+    }
+    else if (switch_bottom == 1)
+    {
+        printf("retracted\n"); 
+        move_up(); //move up to top for the starting position
+    }
+    else //neither switch is pressed - midway between states
+    {
+        printf("midway.  Deploying...\n");
+        move_up(); //move up to top (reset)
+    }
+
+    while(1) {
+        myled = !myled;
+        
+        printf("\nWaiting for UDP packet...\n");
+        int n = server.receiveFrom(client, buffer, sizeof(buffer));
+        buffer[n] = '\0';
+        
+        printf("Received packet from: %s\n", client.get_address());
+        printf("Packet contents : '%s'\n",buffer);
+        
+        if (strcmp(buffer, state_buffer) == 0) //queries current state
+        {
+            //return 'deployed' or 'retracted' depending on the limit switches
+            if (switch_top == 1)
+            {
+                printf("Sending state (deployed) packet back to client\n");
+                server.sendTo(client, deploy_buffer, deploy_buffer_size);
+            }
+            else if (switch_bottom == 1)
+            {
+                printf("Sending state (retracted) packet back to client\n");
+                server.sendTo(client, retract_buffer, retract_buffer_size);
+            }
+            else //nothing
+            {
+            }
+        }
+        else if (strcmp(buffer, deploy_buffer) == 0) //deploy request
+        {
+            move_up();
+            printf("Sending deployed packet back to client\n");
+            server.sendTo(client, buffer, n);
+        }
+        else if (strcmp(buffer, retract_buffer) == 0) //retract request
+        {
+            move_down();
+            printf("Sending retracted packet back to client\n");
+            server.sendTo(client, buffer, n);
+        }
+        else //invalid request
+        {
+            printf("Invalid request.  Error.\n");
+        }
+    }
+}