SHOULDER

Dependencies:   X-NUCLEO-IHM05A1

Revision:
31:f24535e65dae
Parent:
29:f888a2394027
Child:
32:03c98e297a4a
--- a/main.cpp	Wed Aug 07 12:30:41 2019 +0000
+++ b/main.cpp	Thu Sep 05 20:07:59 2019 +0000
@@ -3,7 +3,7 @@
 
 #define VREFA_PWM_PIN D3
 #define VREFB_PWM_PIN D9
-
+#define SEND_FREQUENCY 10 //Hz
 l6208_init_t init =
 {
   8000,            //Acceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes
@@ -20,11 +20,11 @@
   100000           //VREFA and VREFB PWM frequency (Hz)
 };
 
-Thread canrxa;
-Thread cantxa;
+Thread cantxa(osPriorityNormal);
+Thread canrxa(osPriorityNormal);
 
 // Utility
-InterruptIn button(USER_BUTTON);
+//InterruptIn button(USER_BUTTON);
 DigitalOut led(LED1);
 
 // Motor Control
@@ -60,9 +60,24 @@
   CAMERA2,
 }JOINT;
 
-long int pose, current_pose;
-int speed, current_speed;
+float pose, current_pose;
+float speed, current_speed;
 
+void set_zero()
+{
+  printf("set zero\t\n");
+  motor->hard_stop();
+  motor->set_home();
+  motor->go_to(0);
+}
+void zero()
+{
+    printf("zero");
+    motor->run(StepperMotor::BWD);
+    
+}
+    
+    
 uint32_t gen_can_id(CAN_COMMANDS message_id, JOINT can_id)
 {
   uint32_t id = (uint32_t)can_id;     // LSB byte is the controller id.
@@ -70,20 +85,22 @@
   id |= 0x80000000;              // Send in Extended Frame Format.
   return id;
 }
-
-int angle_deparse (long int pose, float offset)
+double to_rad(double angle)
+{
+  return angle*0.0174533;
+}
+double angle_deparse (long int pose, float offset)
 {
   offset = offset * 0.00872664625;
-  float angle = pose * 0.00000425 ; //do something
-  angle = (angle - offset) * 100;
-  return (int)angle;
+  double angle = pose *0.000487012987; //do something 0,0004791666667
+  angle = (angle - offset);
+  return angle;
 }
 void motor_error_handler(uint16_t error)
 {
   printf("ERROR: Motor Runtime\n\r");
 
 }
-
 void end0_int_handler()
 {
   motor->hard_stop();
@@ -91,8 +108,6 @@
   motor->run(StepperMotor::FWD);
 
   printf("END0: Pressed\n\rPOSITION: %d\n\r", motor->get_position());
-
-
 }
 
 void end1_int_handler()
@@ -104,13 +119,6 @@
   printf("END1: Pressed\n\rPOSITION: %d\n\r", motor->get_position());
 }
 
-void motor_set_home()
-{
-  motor->hard_stop();
-  motor->set_home();
-  motor->go_to(0);
-
-}
 
 // CAN
 CAN can1(PB_8, PB_9);     // RX, TX
@@ -120,34 +128,44 @@
 
 void cantx ()
 {
+    while(1)
+    {
+    
+    int _pose;
     messageOut.format = CANExtended;
-    messageOut.id=gen_can_id(JOINT_CURRENT_POSITION, BASE);
+    messageOut.id=gen_can_id(JOINT_CURRENT_POSITION, SHOULDER);
     pose=angle_deparse(motor->get_position(), 0);
-
-    messageOut.data[3]=pose;
-    messageOut.data[2]=pose >>8;
-    messageOut.data[1]=pose >>16;
-    messageOut.data[0]=pose >>24;
+    _pose=pose*100;
+    messageOut.data[3]=_pose;
+    messageOut.data[2]=_pose >>8;
+    messageOut.data[1]=_pose >>16;
+    messageOut.data[0]=_pose >>24;
 
     int status = can1.write(messageOut);
-    printf("CAN send CURRENT POSITION Joint status %d : pose %d",status, pose);
-
-    wait(1);
+    led=!status;
+    printf("CAN send CURRENT POSITION Joint status %d : pose %f\t\n",status, pose);
+    }
+    
 
 
 
 }
-
+void cantx_ISR()
+{
+    cantx();
+    osDelay(1/SEND_FREQUENCY*1000);
+}
 
 
 void canrx()
 {
   while(1)
   {
-    if(can1.read(messageIn)&&messageIn.id==gen_can_id(JOINT_SET_SPEED,BASE))
+   
+    if(can1.read(messageIn)&&messageIn.id==gen_can_id(JOINT_SET_SPEED,SHOULDER))
     {
       speed=messageIn.data[0] + (messageIn.data[1] << 8) + (messageIn.data[2] << 16) + (messageIn.data[3] << 24);
-      printf("CAN: mess %d\n\r", speed);
+      printf("CAN: mess  received  : %d\n\r", speed);
       current_speed=speed-100;
 
 
@@ -170,29 +188,33 @@
       }
     }
     
-    if(can1.read(messageIn)&&messageIn.id==gen_can_id(JOINT_ZERO,BASE))
+    if(can1.read(messageIn)&&messageIn.id==gen_can_id(JOINT_ZERO,SHOULDER))
     {
       if((messageIn.data[0] + (messageIn.data[1] << 8) + (messageIn.data[2] << 16) + (messageIn.data[3] << 24))==1)
       {
-        motor->hard_stop();
-        motor->set_max_speed(5000);
-        motor->run(StepperMotor::BWD);
+        zero();
+        motor->wait_while_active();
       }
     }
     
   }
 }
-
+void canrx_ISR()
+{
+    canrx();
+    osDelay(10);
+}
 
 /* Main ----------------------------------------------------------------------*/
 
 int main()
 {
+  
   can1.frequency(125000);
-
+   
   // Motor Initialization
   motor = new L6208(D2, D8, D7, D4, D5, D6, VREFA_PWM_PIN, VREFB_PWM_PIN);
-
+  motor->set_step_mode(StepperMotor::STEP_MODE_1_16);
   if (motor->init(&init) != COMPONENT_OK)
   {
     printf("ERROR: vvMotor Init\n\r");
@@ -201,26 +223,25 @@
 
   motor->attach_error_handler(&motor_error_handler);
 
+
   end0.rise(&end0_int_handler);
   end1.rise(&end1_int_handler);
-  end1.fall(&motor_set_home);
-
+  end1.fall(&set_zero);
 
-
-  motor->set_step_mode(StepperMotor::STEP_MODE_1_16);
   printf("DONE: Motor Init\n\r");
 
   // CAN Initialization
-
-  canrxa.start(canrx);
-  cantxa.start(cantx);
-
+    zero();
+    
+  canrxa.start(canrx_ISR);
+  cantxa.start(cantx_ISR);
+  
   printf("DONE: CAN Init\n\r");
-
+  
 
 
   printf("Running!\n\r");
-
+  //zero();
   while(true)
   {
     wait(1000);