Using CAN bus with (not just NUCLEO) mbed boards

Dependencies:   mbed CANMsg

Revision:
10:4b0101c6763c
Parent:
9:3211e88e30a5
--- a/main.cpp	Fri Feb 08 13:16:55 2019 +0000
+++ b/main.cpp	Thu Apr 02 11:42:45 2020 +0000
@@ -33,7 +33,9 @@
 #if defined(BOARD1)
     const unsigned int  RX_ID = 0x100;
     const unsigned int  TX_ID = 0x101;
+    
 #else
+    
     const unsigned int  RX_ID = 0x101;
     const unsigned int  TX_ID = 0x100;
 #endif
@@ -41,8 +43,11 @@
 #include "mbed.h"
 #include "CANMsg.h"
 
-Serial              pc(USBTX, USBRX);
+//Serial              pc(USBTX, USBRX);
+Serial              pc(SERIAL_TX, SERIAL_RX);
 CAN                 can(PB_8, PB_9);  // CAN Rx pin name, CAN Tx pin name
+//CAN                 can(PA_11, PA_12);  // Use for RC-car
+DigitalIn           button(PC_13);
 //CAN                 can(p30, p29);  // CAN Rx pin name, CAN Tx pin name
 CANMsg              rxMsg;
 CANMsg              txMsg;
@@ -51,6 +56,15 @@
 uint8_t             counter = 0;
 AnalogIn            analogIn(A0);
 float               voltage;
+char                message;
+bool                LED;
+bool                brake;
+float               a;
+float               b;
+char                c;
+float               mid = 0.5;
+float               p_DC = 0.05;
+float               p_Servo= 0.05;
 
 /**
  * @brief   Prints CAN message to PC's serial terminal
@@ -70,6 +84,126 @@
     pc.printf("\r\n");
 }
 
+float decodeTurn(char c, float floatA){
+        a=floatA;
+        switch (c){
+            case 'l':
+                c  = '\0';
+                if (LED == false){
+                    pc.printf("LED ON\n");
+                    led = 1;
+                    LED = true;
+                    }
+                else {
+                    pc.printf("LED OFF\n");
+                    led = 0;
+                    LED = false;
+                    }
+                break;               
+                            
+            case 'q':
+                c = '\0';
+                led = 0; // OFF
+                a = 0;
+                pc.printf("Hard right %f \r\n",a);
+                //moveTurnServo(a);
+                break;
+            
+            case 'e':
+                c = '\0';
+                led = 1; // ON
+                a = 1;
+                pc.printf("Hard right %f \r\n",a);
+                //moveTurnServo(a);
+                break;
+                
+            case 'r':
+                c = '\0';
+                a=mid;
+                pc.printf("Straightening up %f \r\n",a);
+                //moveTurnServo(a);
+                break;
+            
+            case 'a':
+                c = '\0';
+                if(a > 0){
+                    a = a - p_Servo;
+                    pc.printf("Turning left %f \r\n",a);
+                    //moveTurnServo(a);
+                }
+                else{
+                    pc.printf("Servo at max left");
+                    }
+                break;
+            
+            case 'd':
+                c = '\0';
+                if(a < 1){
+                    a = a + p_Servo;
+                    pc.printf("Turning right %f \r\n",a);
+                    //moveTurnServo(a);
+                }
+                else{
+                    pc.printf("Servo at max right");
+                    } 
+                break;
+    
+                      
+        }
+        return a;
+}
+
+float decodeDC(char c, float floatB){
+        b=floatB;
+        switch (c){
+            case 'w':
+                c = '\0';
+                if(b < 1){
+                    b = b + p_DC;
+                    pc.printf("Accelerating %f \r\n",b);
+                    //speedDCMotor(b);
+                }
+                else{
+                    pc.printf("Motor at max power");
+                    }                
+                break;
+                
+            case 's':
+                c = '\0';
+                if(b > 0){
+                    b = b - p_DC;
+                    pc.printf("Deaccelerating %f \r\n",b);
+                    //speedDCMotor(b);
+                }
+                else{
+                    pc.printf("Motor at max power");
+                    } 
+                break;
+                
+            case 'f':
+                c = '\0'; 
+                b = mid;
+                pc.printf("Stopping DC Motor %f \r\n",b);
+                //speedDCMotor(b);               
+                break;
+                
+            case 'b':
+                c  = '\0';
+                if (brake == false){
+                    pc.printf("Breaking\n");
+                    //moveBrakeServo(1);
+                    brake = true;
+                    }
+                else {
+                    pc.printf("Releasing breaking\n");
+                    //moveBrakeServo(mid);
+                    brake = false;
+                    }     
+            }
+            return b;
+}
+            
+
 /**
  * @brief   Handles received CAN messages
  * @note    Called on 'CAN message received' interrupt.
@@ -87,11 +221,14 @@
         // extract data from the received CAN message 
         // in the same order as it was added on the transmitter side
         rxMsg >> counter;
-        rxMsg >> voltage;    
+        rxMsg >> voltage;
+        txMsg << message;    
         pc.printf("  counter = %d\r\n", counter);
         pc.printf("  voltage = %e V\r\n", voltage);
+        pc.printf("  message = %s \r\n", message);
     }
     timer.start(); // to transmit next message in main
+    pc.printf("-------------------------------------\r\n");
 }
 
 
@@ -102,31 +239,42 @@
  * @retval
  */
 int main(void)
-{
+{   
+    a = mid;
+    b = mid;
     pc.baud(9600);          // set serial speed
     can.frequency(1000000); // set CAN bit rate to 1Mbps
     can.filter(RX_ID, 0xFFF, CANStandard, 0); // set filter #0 to accept only standard messages with ID == RX_ID
     can.attach(onCanReceived);                // attach ISR to handle received messages
-
-#if defined(BOARD1)
     led = ON;               // turn the LED on
     timer.start();          // start timer
     pc.printf("CAN_Hello board #1\r\n");
-#else
-    led = OFF;      // turn LED off
-    pc.printf("CAN_Hello board #2\r\n");
-#endif
+    
     while(1) {
-        if(timer.read_ms() >= 2000) {    // check for timeout
+        c = pc.getc(); // Read hyperterminal1
+        a = decodeTurn(c,a);
+        b = decodeDC(c,b);
+        pc.printf("a %f \r\n",a);
+        pc.printf("Pressed %c \r\n",c);
+        if(!button){
+            led = 1; // ON
+            wait(0.05);
+            led = 0; // ON
+            wait(0.05);
+            }
+            
+        if(timer.read_ms() >= 200) {    // check for timeout
             timer.stop();                // stop timer
             timer.reset();               // reset timer
             counter++;                   // increment counter
             voltage = analogIn * 3.3f;   // read the small drift voltage from analog input
+            voltage = a;
             txMsg.clear();               // clear Tx message storage
             txMsg.id = TX_ID;            // set ID
             // append data (total data length must not exceed 8 bytes!)
             txMsg << counter;   // one byte
             txMsg << voltage;   // four bytes
+            txMsg << message;   //  bytes
              
             if(can.write(txMsg)) {       // transmit message
                 led = OFF;               // turn the LED off
@@ -135,10 +283,13 @@
                 pc.printf("CAN message sent\r\n");
                 printMsg(txMsg);
                 pc.printf("  counter = %d\r\n", counter);
-                pc.printf("  voltage = %e V\r\n", voltage);
+                pc.printf("  value = %e \r\n", voltage);
+                pc.printf("  message = %s \r\n", message);
             }
             else
                 pc.printf("Transmission error\r\n");
+            pc.printf("-------------------------------------\r\n");
         }
+        //timer.start();          // start timer
     }
 }