Hi I’m new to Mbed
Is there anyone have ever interface a smart actuator(RMD-X8) with CAN bus.
Right now I know protocol of the actuator but I don’t know how to start coding to drive this actuator and there is no tutorial too.
I’m using NUCLEO F446RE
Thank you.
Hi there,
if you are newbie, it is good to start with Mbed’s documentation - Mbed OS quick start.
I saw a video about that part and it looks like a nice toy but a little expensive for me.
For the start you need next to your board:
- Mbed CAN API documentation
- Servos’s documentation (it looks good) from here. Like RDM-X User manual and RMD servo motor control protocol (CAN BUS )
- A CanBus transceiver, like is the MCP2551 or somethig similar.
- 2x 120ohm resistors like CanBus TERMINATORs
I tried to write only a simple program, which ask about a current PID setting of servo, it wait for response and then it end. Keep it mind it is only experimental code according to documents above, I not have this hardware.
#include "mbed.h"
#define DEVICE_CAN_ID 141 //identifier: 0x140+ID(1-32)
DigitalOut led1(LED1);
CAN can(PB_8,PB_9,1000000); //I am not sure with with frequency but in the video 1000kbps is used
char data[] = {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //read PID param. cmd
int main()
{
printf("CanTest\n");
ThisThread::sleep_for(500ms);
if (can.write(CANMessage(DEVICE_CAN_ID, data))) {
CANMessage msg;
while (1) {
if (can.read(msg)) {
// Printing what was read
printf("Message received:[ ID: %9x", msg.id);
printf(" Length: %d", msg.len);
printf(" Command: %2x", msg.data[0]);
//printf(" %2x", msg.data[1]); // Null
printf("Position loop Kp %2x", msg.data[2]);
printf("Position loop Ki %2x", msg.data[3]);
printf("Speed loop Kp %2x", msg.data[4]);
printf("Speed loop Ki %2x", msg.data[5]);
printf("Torque loop Kp %2x", msg.data[6]);
printf("Torque loop Ki %2x", msg.data[7]);
printf("CanBus Type: %d", msg.type); // 0 = data, 1 = remote
printf("Format: %d ]\r\n", msg.format); // 0 = standard, 1 = extended
ThisThread::sleep_for(500ms);
break;
}
ThisThread::sleep_for(100ms);
led1 = !led1;
}
}else{
printf("Write error\n");
}
printf("Rrogram end!\n");
}
BR, Jan
1 Like
Thank you so much.