Alfred Lind-Anderton
/
CAN_Hello_XAVIER
Using CAN bus with (not just NUCLEO) mbed boards
Diff: main.cpp
- 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 } }