MBed program for TR1 functions

Dependencies:   mbed Servo ros_lib_melodic DC_Stepper_Controller_Lib

Revision:
2:e570143bf35e
Parent:
1:fbdbf4ac12c6
Child:
3:2441bcef5885
--- a/main.cpp	Wed Jun 02 13:53:04 2021 +0000
+++ b/main.cpp	Wed Jun 09 02:39:27 2021 +0000
@@ -1,4 +1,3 @@
-    // Hello World to sweep a servo through its full range
 // ROS Connect Baud Rate 
 #define BAUD_RATE 115200
 
@@ -8,33 +7,310 @@
 #include <std_msgs/Int8.h>
 #include <std_msgs/String.h>
 #include <std_msgs/Int16MultiArray.h>
-ros::NodeHandle nh;
-DigitalOut myled(LED1);
+#include "DC_Motor_Controller.h"
+
+// Declare Functions
 void msgCb_joystick(const std_msgs::Int16MultiArray &joystick_msg);
 void msgCb_button(const std_msgs::Int8 &button_msg);
+void itoa(int num, char *str, int radix);
 
+// Define ros variables
+ros::NodeHandle nh;
+// Subs
 ros::Subscriber<std_msgs::Int16MultiArray> sub_joystick("joystick", msgCb_joystick);
 ros::Subscriber<std_msgs::Int8> sub_button("button", msgCb_button);
-
+// Pubs
 std_msgs::String str_msg;
 ros::Publisher responser("display", &str_msg);
 
-char msg[200] = {0};
+// ============  Define IOs  =============
 
+// External Button
 DigitalIn button(USER_BUTTON);
-
-DigitalOut up = D12; // pin 1 of faulhaber
+// LED
+DigitalOut myled(LED1);
+// Faulhaber pins
+DigitalOut up = A3;  // pin 1 of faulhaber
 DigitalOut down = A5; // pin 2 of faulhaber
-DigitalOut left = D2; // DC motor 1 (via L298N control pin 1)
-DigitalOut right = D4; // DC motor 2 (via L298N control pin 2)
-//AnalogOut left = A0; // DC motor 1 (via L298N control pin 1)
-//AnalogOut right = A1; // DC motor 2 (via L298N control pin 2)
-DigitalOut lock = D14; // 電磁石
 DigitalOut back = A4; // pin 3 of faulhaber
-DigitalOut eject_1 = D10; // valve 1
-DigitalOut eject_2 = D5; // valve 2
-//DigitalOut savePos = D0; savepos by back=1 & up=1 & down=1
-DigitalIn firing = D3;
+// Electromagnet
+DigitalOut lock = D14; 
+// Firing pin
+DigitalIn firing1 = D3; // Reset Faulhaber
+DigitalIn firing2 = D15; // Load 1 arrow
+DigitalIn firing3 = D2; // Pick, small
+// Valves
+DigitalOut eject_1 = A1; // valve 1
+DigitalOut eject_2 = A2;  // valve 2
+// DC motors
+DC_Motor_PID dc_motor1(D6, D5, D9, D8, 792); //M1, M2, INA, INB, PPR; 轉夾
+DC_Motor_PID dc_motor2(D12,D13,D4,D7,792); //M1, M2, INA, INB, PPR; load 1 arrow
+
+// Global Control variable
+char msg[200] = {0}; // msg for responser
+int stage_pick = 0;  // stage of picking up arrows from the rack
+int n_loaded = 0;  // number of arrows. 
+int faul_reset = 0;
+int load_manual = 1; // tune the loading 1 arrow manually
+
+// button_msg: Int8
+void msgCb_button(const std_msgs::Int8 &button_msg)
+{
+    memset(msg, 0, sizeof(msg));
+    strcpy(msg, "Received ");
+    itoa(button_msg.data, msg + 9, 10);
+    int len = strlen(msg);
+    msg[len++] = ';';
+    msg[len++] = ' ';
+    
+    switch (button_msg.data)
+    {
+    case 1:
+        eject_1 = 1 - eject_1;
+        eject_2 = 1 - eject_2;
+        strcpy(msg + len, "x is pressed, eject_1 is ");
+        msg[strlen(msg)] = '0' + int(eject_1);
+        break;
+    case -1:
+        strcpy(msg + len, "x is released, eject_2 is ");
+        msg[strlen(msg)] = '0' + int(eject_2);
+        break;
+    case 2:
+        lock = 1 - lock;
+        strcpy(msg + len, "o is pressed, lock is: ");
+        msg[strlen(msg)] = '0' + int(lock);
+        
+        break;
+    case -2:
+        strcpy(msg + len, "o is released");
+        break;
+    case 3:
+        back  = 1;
+        strcpy(msg + len, "triangle is pressed, back is ");
+        msg[strlen(msg)] = '0' + int(back);
+        break;
+    case -3:
+        back = 0; 
+        strcpy(msg + len, "triangle is released, back is ");
+        msg[strlen(msg)] = '0' + int(back);
+        break;
+    case 4:
+        strcpy(msg + len, "square is pressed");
+        up = 1; down = 1;
+        break;
+    case -4:
+        strcpy(msg + len, "square is released");
+        up = 0; down = 0;
+        break;
+    case 5:
+        down = 1;
+        up = 0;
+        strcpy(msg + len, "down arrow is pressed, down is ");
+        msg[strlen(msg)] = '0' + int(down);
+        break;
+    case -5:
+        down = 0;
+        strcpy(msg + len, "down arrow is released, down is ");
+        msg[strlen(msg)] = '0' + int(down);
+        break;
+    case 6:
+        load_manual = 0;
+        strcpy(msg + len, "right arrow is pressed. ");
+        msg[strlen(msg)] = '0' + n_loaded;
+        dc_motor1.set_out(0,1);    
+        n_loaded++;  
+        if(firing2 == 1)
+        {
+            if(n_loaded <= 5)
+            {
+                dc_motor1.set_out(0,0.5);
+                wait(1.2);                
+            }
+            else
+            {
+                strcpy(msg + len, "right arrow is pressed. ");
+                strcpy(msg + strlen(msg), "n_loaded cleared!");
+                n_loaded = 0;
+            }
+            dc_motor1.set_out(0,0);
+        }
+//        load_manual = 1;
+        break;
+    case -6:
+        
+        strcpy(msg + len, "right arrow is released. ");
+        break;
+    case 7:
+        up = 1;
+        down = 0;
+        strcpy(msg + len, "up arrow is pressed, up is");
+        msg[strlen(msg)] = '0' + int(up);
+        break;
+    case -7:
+        up = 0;
+        strcpy(msg + len, "up arrow is released, up is");
+        msg[strlen(msg)] = '0' + int(up);
+        break;
+    case 8:
+        strcpy(msg + len, "left arrow is pressed, left is ");
+        msg[strlen(msg)] = '0' + stage_pick;
+        if(stage_pick == 0)
+        {
+            dc_motor2.set_out(0, 0.5);
+            if(firing3 == 1)
+                dc_motor2.set_out(0,0);
+            stage_pick++;
+            eject_1 = 1; eject_2 = 0;
+        }
+        else if(stage_pick == 1)
+        {
+            dc_motor2.set_out(0.5,0);
+            wait(0.3);
+            dc_motor2.set_out(0,0);
+            stage_pick++;
+        }
+        else if(stage_pick == 2)
+        {
+            dc_motor2.set_out(0.5,0);
+            wait(0.3);
+            dc_motor2.set_out(0,0);
+            stage_pick = 0;
+        }
+        break;
+    case -8:
+        strcpy(msg + len, "left arrow is released, left is ");
+        break;
+    case 9:
+        strcpy(msg + len, "L1 is pressed");
+        break;
+    case -9:
+        strcpy(msg + len, "L1 is released");
+        break;
+    case 10:
+        dc_motor1.set_out(0,0);
+        dc_motor2.set_out(0,0);
+        strcpy(msg + len, "R1 is pressed");
+        break;
+    case -10:
+        strcpy(msg + len, "R1 is released");
+        break;
+    case 11:
+        strcpy(msg + len, "share is pressed");
+        break;
+    case -11:
+        strcpy(msg + len, "share is released");
+        break;
+    case 12:
+        strcpy(msg + len, "option is pressed");
+        break;
+    case -12:
+        strcpy(msg + len, "option is released");
+        break;
+    case 13:
+        up = 1; down = 1; back = 1;
+        strcpy(msg + len, "playstation button is pressed, cur pos should be saved");
+        break;
+    case -13:
+        up = 0; down = 0; back= 0;
+        strcpy(msg + len, "playstation button is released");
+        break;
+    default:
+        len = strlen(msg);
+        strcpy(msg + len, "Unrecognized pattern");
+        break;
+    }
+
+    responser.publish(&str_msg);
+}
+
+
+// --------------- main -----------------
+int main() 
+{  
+    
+    // -> Set Baud Rate
+    nh.getHardware()->setBaud(BAUD_RATE);
+    nh.initNode();
+    // Advertise publishers
+    nh.advertise(responser);
+    // Initiate display
+    str_msg.data = msg;
+//    responser.publish(&str_msg);
+    // Initiate subscribers
+    nh.subscribe(sub_button);
+    nh.subscribe(sub_joystick);
+    // Initiate IOs, keep everything at rest
+    myled = 0;
+    back = 0;up = 0; down = 0; lock = 0;  
+    eject_1 = 0; eject_2 = 1;
+    
+    // Initiate firing pins
+    firing1.mode(PullUp); // default 1
+    firing2.mode(PullDown); //default 0
+    firing3.mode(PullUp); // default 1
+    
+    // Reset dc motor
+    dc_motor1.reset();
+    dc_motor1.set_pid(0.008, 0, 0, 0.0);
+    dc_motor2.reset();
+    dc_motor2.set_pid(0.008, 0, 0, 0.0);
+//    dc_motor2.set_out(0,0.5);
+//    wait(0.3);
+//    dc_motor2.move_angle(100);
+    dc_motor2.set_out(0,0);
+//     dc_motor1.move_angle(100);
+//    dc_motor1.set_out(0.5,0); // -> testing only
+    
+    // Main programming
+    int start = 0; // control variable for resetting shooter
+    int tmp = 0;
+
+    while(true) {
+        nh.spinOnce();
+        
+        if(nh.connected())
+            myled = 1;    // Turn on the LED if the ROS successfully connect with the Jetson
+        else 
+            myled = 0;    // Turn off the LED if the ROS cannot connect with the Jetson
+        if(button == 1)
+        {
+            myled = 0;
+            if(!faul_reset)
+            {
+                down = 0; up = 1; back = 1; // 101
+                start = 1;
+                faul_reset = 1;
+            }
+            else
+            {
+                dc_motor1.set_out(0,1);   
+            }
+            while(button == 1);
+            wait(0.2);
+            memset(msg, 0, sizeof(msg));
+            strcpy(msg, "user button is pressed, faul_reset is ");
+            msg[strlen(msg)] = '0' + faul_reset;            
+            responser.publish(&str_msg);
+        }
+        if(load_manual && firing2 == 1)
+        {
+            dc_motor1.set_out(0,0);   
+        }
+        if(firing1.read() == 0 && start == 1)
+        {
+            up = 0; down = 1; back = 1; // 110
+            while(firing1.read() == 0);
+            wait(0.3);
+            down = 0; back = 0; up = 0;
+            start = 0;
+            memset(msg, 0, sizeof(msg));
+            strcpy(msg, "firing1 is touched: ");
+            msg[strlen(msg)] = '0' + firing1.read();
+            responser.publish(&str_msg);
+            
+        }
+    }
+}
 
  
 void itoa(int num, char *str, int radix)
@@ -140,188 +416,8 @@
         strcpy(msg + len, "L3: the value is ");
         len = strlen(msg);
         itoa(joystick_msg.data[2], msg + len, 10);
+        
     }
 
     responser.publish(&str_msg);
-}
-
-// button_msg: Int8
-void msgCb_button(const std_msgs::Int8 &button_msg)
-{
-//    myled = !myled; // blink the led
-    memset(msg, 0, sizeof(msg));
-    strcpy(msg, "Received ");
-    itoa(button_msg.data, msg + 9, 10);
-    //    int len = my_strlen(msg);
-    int len = strlen(msg);
-    msg[len++] = ';';
-    msg[len++] = ' ';
-    
-    switch (button_msg.data)
-    {
-    case 1:
-        eject_1 = 1 - eject_1;
-        eject_2 = 1 - eject_2;
-        strcpy(msg + len, "x is pressed, eject_1 is ");
-        msg[strlen(msg)] = '0' + int(eject_1);
-        break;
-    case -1:
-//        eject = 0;
-        strcpy(msg + len, "x is released, eject_2 is ");
-        msg[strlen(msg)] = '0' + int(eject_2);
-        break;
-    case 2:
-        lock = 1 - lock;
-        strcpy(msg + len, "o is pressed, lock is: ");
-        msg[strlen(msg)] = '0' + int(lock);
-        
-        break;
-    case -2:
-        strcpy(msg + len, "o is released");
-        break;
-    case 3:
-        back  = 1;
-        strcpy(msg + len, "triangle is pressed, back is ");
-        msg[strlen(msg)] = '0' + int(back);
-        break;
-    case -3:
-        back = 0; 
-        strcpy(msg + len, "triangle is released, back is ");
-        msg[strlen(msg)] = '0' + int(back);
-        break;
-    case 4:
-        strcpy(msg + len, "square is pressed");
-        up = 1; down = 1;
-        break;
-    case -4:
-        strcpy(msg + len, "square is released");
-        up = 0; down = 0;
-        break;
-    case 5:
-        down = 1;
-        up = 0;
-        strcpy(msg + len, "down arrow is pressed, down is ");
-        msg[strlen(msg)] = '0' + int(down);
-        break;
-    case -5:
-        down = 0;
-        strcpy(msg + len, "down arrow is released, down is ");
-        msg[strlen(msg)] = '0' + int(down);
-        break;
-    case 6:
-        left = 0; right = 1;
-        strcpy(msg + len, "right arrow is pressed, right is ");
-        msg[strlen(msg)] = '0' + int(right);
-        break;
-    case -6:
-        right = 0;
-        strcpy(msg + len, "right arrow is released, right is ");
-        msg[strlen(msg)] = '0' + int(right);
-        break;
-    case 7:
-        up = 1;
-        down = 0;
-        strcpy(msg + len, "up arrow is pressed, up is");
-        msg[strlen(msg)] = '0' + int(up);
-        break;
-    case -7:
-        up = 0;
-        strcpy(msg + len, "up arrow is released, up is");
-        msg[strlen(msg)] = '0' + int(up);
-        break;
-    case 8:
-        left = 1; right = 0;
-        strcpy(msg + len, "left arrow is pressed, left is ");
-        msg[strlen(msg)] = '0' + int(left);
-        break;
-    case -8:
-        left = 0;
-        strcpy(msg + len, "left arrow is released, left is ");
-        msg[strlen(msg)] = '0' + int(left);
-        break;
-    case 9:
-        strcpy(msg + len, "L1 is pressed, left is ");
-        msg[strlen(msg)] = '0' + int(left);
-        break;
-    case -9:
-        strcpy(msg + len, "L1 is released");
-        break;
-    case 10:
-        strcpy(msg + len, "R1 is pressed");
-        break;
-    case -10:
-        strcpy(msg + len, "R1 is released");
-        break;
-    case 11:
-        strcpy(msg + len, "share is pressed");
-        break;
-    case -11:
-        strcpy(msg + len, "share is released");
-        break;
-    case 12:
-        strcpy(msg + len, "option is pressed");
-        break;
-    case -12:
-        strcpy(msg + len, "option is released");
-        break;
-    case 13:
-        up = 1; down = 1; back = 1;
-        strcpy(msg + len, "playstation button is pressed, cur pos should be saved");
-        break;
-    case -13:
-        up = 0; down = 0; back= 0;
-        strcpy(msg + len, "playstation button is released");
-        break;
-    default:
-        len = strlen(msg);
-        strcpy(msg + len, "Unrecognized pattern");
-        break;
-    }
-
-    responser.publish(&str_msg);
-}
-int main() 
-{  
-    // -> Set Baud Rate
-    nh.getHardware()->setBaud(BAUD_RATE);
-    nh.initNode();
-    nh.advertise(responser);
-    str_msg.data = msg;
-    responser.publish(&str_msg);
-    nh.subscribe(sub_button);
-    nh.subscribe(sub_joystick);
-    myled = 0;
-    back = 0;up = 0; down = 0; lock = 0; left = 0; right = 0;
-    eject_1 = 0; eject_2 = 1;
-    strcpy(msg, "Byebye world.");
-    responser.publish(&str_msg);
-    int start = 1;
-    firing.mode(PullDown);
-    // Main programming
-    while(true) {
-        nh.spinOnce();
-
-        if(nh.connected())
-            myled = 1;    // Turn on the LED if the ROS successfully connect with the Jetson
-        else 
-            myled = 0;    // Turn off the LED if the ROS cannot connect with the Jetson
-        if(button == 1)
-        {
-            myled = 0;
-            down = 0; up = 1; back = 1;
-            start = 1;
-            while(button == 1);
-        }
-        if(firing.read() == 1 && start == 1)
-        {
-            up = 0;
-            down = 1; 
-            back = 1;
-            while(firing.read() == 1);
-            wait(0.3);
-            down = 0; back = 0; up = 0;
-            start = 0;
-            
-        }
-    }
 }
\ No newline at end of file