見出し画像

ArduinoとODriveをシリアル通信してBLDCを回す!

こんにちは。人生に疲れましたが、まだ道のりは長いです。
本日はArduinoとOdriveをシリアル通信してBLDC(ブラシレスモーター)を回します!

使うもの
・Arduino MEGA
・ODrive v3.6
・PC





まずは下の公式サイトをもとにodrivetoolを使ってモーターを回しましょう!

ここでつまずいた方はまずは下のサイトをやってください。


ではシリアル通信していきましょう。
使用するライブラリはこちら

このライブラリはArduino IDEにインクルードする際に一癖ありました。
上手くインクルードできなかった方は、一度ZIPファイルを展開し、
その中から、ODriveArduinoというファイルをもう一度ZIPファイルにして
IDEにインクルードしてみてください。

配線

・pin 17: RX - connect to ODrive TX GPIO 1

・pin 16: TX - connect to ODrive RX GPIO 2

・arduinoのGNDとodriveのGNDをつなぐ


コード


#include <HardwareSerial.h>
#include <SoftwareSerial.h>
#include <ODriveArduino.h>

// Printing with stream operator helper functions
template<class T> inline Print& operator <<(Print &obj,     T arg) { obj.print(arg);    return obj; }
template<>        inline Print& operator <<(Print &obj, float arg) { obj.print(arg, 4); return obj; }

////////////////////////////////
// Set up serial pins to the ODrive
////////////////////////////////
// pin 17: RX - connect to ODrive TX GPIO 1
// pin 16: TX - connect to ODrive RX GPIO 2
HardwareSerial& odrive_serial = Serial2;

// ODrive object
ODriveArduino odrive(odrive_serial);

void odrive_calibration()
{
  int motornum0 = 0;
  int motornum1 = 1;
  int requested_state0;
  int requested_state1;

  requested_state0 = 8;
  if(!odrive.run_state(motornum0, requested_state0, false /*don't wait*/)) return;

  requested_state1 = 8;
  if(!odrive.run_state(motornum1, requested_state1, false /*don't wait*/)) return;
}

void setup() {
  // ODrive uses 115200 baud
  odrive_serial.begin(115200);

  // Serial to PC
  Serial.begin(115200);
  while (!Serial) ; // wait for Arduino Serial Monitor to open

  odrive_calibration();
  delay(1000);
}

void loop() {
    Serial.println("Executing test position control");
    delay(2000);
    //1.0Fなら1回転
    float pos_m0 = 10.0f;
    float pos_m1 = 2.0f;
    odrive.SetPosition(0, pos_m0);
    odrive.SetPosition(1, pos_m1);
}


動かそう

では動かしていきましょう。
まずは、ODrivetoolをPCから操作してキャリブレーションとクローズドループを行います。

そしたらarduinoの電源を入れてみてください。
BLDCが10回転するはずです!

//1.0Fなら1回転
    float pos_m0 = 10.0f;

この部分を書き換えることで、回転数を決めることができます!

この記事が気に入ったらサポートをしてみませんか?