前回はUIFlowでDDT M06ダイレクトドライブモーターを動かしたけど、最終的にはROS2で動かしたいと考えているので、その一歩手前として次はC++で動かしてみました。
もっとコンパクトにしたいので、前回と違って、M5Stack ATOMS3+ATOMIC RS485キットを使ってます。
環境
DDT M0601C_111 2つ
Windows 11
PlatformIO
M5Stack ATOMS3
ATOMIC RS485キット
プログラム
ゆうもやさんがM06/M15ダイレクトドライブモーターに対応したライブラリを公開してくれているので、かなり楽ができます。
なるべくM5Stackの種類に依存しないように作ったけど、GPIOの番号だけはATOMS3に依存しています。
platformio.ini
[env:m5stack-atoms3] platform = espressif32 board = m5stack-atoms3 framework = arduino build_flags = '-D RX_GPIO=5' '-D TX_GPIO=6' lib_deps = m5stack/M5Unified@^0.1.7 https://github.com/takex5g/M5_DDTMotor_M15M06
main.cpp
#include <M5Unified.h> #include <DDT_Motor_M15M06.h> #define MOTOR_SPEED_RPM 50 MotorHandler motor_handler = MotorHandler(RX_GPIO, TX_GPIO); const uint8_t motor_ids[] = {1, 2}; // ID of motors Receiver received_data[sizeof(motor_ids) / sizeof(motor_ids[0])]; // Receiver objects for each motor int motor_speeds[sizeof(motor_ids) / sizeof(motor_ids[0])]; // Speeds for each motor void control_motors(); void stop_motors(); void move_forward(); void move_backward(); void turn_left(); void turn_right(); void display_status(const char* action); void setup() { M5.begin(); M5.Lcd.setTextSize(2); M5.Lcd.println("DDTM Test"); stop_motors(); // Initialize all motors to stopped state } void loop() { static int mode = 0; M5.update(); if (M5.BtnA.wasPressed()) { mode = (mode + 1) % 5; // Cycle through modes 0 to 4 switch (mode) { case 0: stop_motors(); display_status("Stop"); break; case 1: move_forward(); display_status("Forward"); break; case 2: move_backward(); display_status("Backward"); break; case 3: turn_left(); display_status("Turn Left"); break; case 4: turn_right(); display_status("Turn Right"); break; } } delay(10); } void control_motors() { for (size_t i = 0; i < sizeof(motor_ids) / sizeof(motor_ids[0]); ++i) { motor_handler.Control_Motor(motor_speeds[i], motor_ids[i], 0, 0, &received_data[i]); } } void stop_motors() { motor_speeds[0] = 0; motor_speeds[1] = 0; control_motors(); } void move_forward() { motor_speeds[0] = -MOTOR_SPEED_RPM; motor_speeds[1] = MOTOR_SPEED_RPM; control_motors(); } void move_backward() { motor_speeds[0] = MOTOR_SPEED_RPM; motor_speeds[1] = -MOTOR_SPEED_RPM; control_motors(); } void turn_left() { motor_speeds[0] = -MOTOR_SPEED_RPM; motor_speeds[1] = -MOTOR_SPEED_RPM; control_motors(); } void turn_right() { motor_speeds[0] = MOTOR_SPEED_RPM; motor_speeds[1] = MOTOR_SPEED_RPM; control_motors(); } void display_status(const char* action) { M5.Lcd.fillScreen(BLACK); M5.Lcd.setCursor(0, 0); M5.Lcd.printf("%s\n", action); M5.Lcd.printf("T-RPM %d %d", motor_speeds[0], motor_speeds[1]); }