dreamdriveのアイコン画像
dreamdrive 2022年09月23日作成 (2022年09月25日更新) © MIT
セットアップや使用方法 セットアップや使用方法 閲覧数 1525
dreamdrive 2022年09月23日作成 (2022年09月25日更新) © MIT セットアップや使用方法 セットアップや使用方法 閲覧数 1525

SpresenseからROBOTIS Dynamixelサーボを動かす

SpresenseからROBOTIS Dynamixelサーボを動かす

Spresenseのマルチコアを活かして、非同期でコアごとに制御を分けたシステムを作りたいのですが、この記事は、その要素技術として、ROBOTIS社のサーボモーターDynamixelをSpresenseで動かした忘備録です。

ポイントは、ROBOTISのDynamixel用ライブラリDynamixel2ArduinoとSpresenseのライブラリに競合する関数(関数形式マクロ)があるので、その対処です。

使用するもの

  • Spresense - 1個
  • Spresense拡張ボード - 1個
  • DYNAMIXEL Shield for Arduino MKR series - 1個
  • Dynamixel XL430 - 1個
  • 電源等 - 適量

配線

配線は以下の通り。

配線概念図

プログラム

これで、Dynamixel2Arduinoに含まれる、「scan_dynamixel」を実行してみたいと思います。
とりあえず、マルチコアの話は置いておいて、メインコアに「scan_dynamixel」を書き込んで、シングルコアでテストする準備をします。

まずはハードウェアのピン設定の項目で、最後のelseの部分を下記の通り書き換えます。

#else // Other boards when using DynamixelShield
  #define DXL_SERIAL   Serial2
  #define DEBUG_SERIAL Serial
  const int DXL_DIR_PIN = 2; // DYNAMIXEL Shield DIR PIN
#endif

これだけで、「scan_dynamixel」の準備は完了です。

いざ、コンパイル!

コンパイル結果

ぎゃふん!

エラー内容を見ると、どうも、関数名が競合しているような話。
Dynamixelのライブラリはクラスになっているのに・・・どうして・・・。

答えはここにありました。
C:\Users(ユーザー名)\AppData\Local\Arduino15\packages\SPRESENSE\hardware\spresense\2.6.0\cores\spresense\leds.h

32行目から34行目にかけての関数形式マクロが問題のようです。

/* LED control */
#define ledOn(x)  digitalWrite(x, HIGH)
#define ledOff(x) digitalWrite(x, LOW)

この、ledOn、ledOffが、Dynamixelのライブラリのクラスのメンバ関数と同じ名前のため、コンパイルの時に置換されてしまい、引数の数が合わずにコンパイルエラーになっていた模様。

下記の通り書き換えます。

/* LED control */
#define ledOn_sp(x)  digitalWrite(x, HIGH)
#define ledOff_sp(x) digitalWrite(x, LOW)

あらためて、書き込み!

実行結果

じゃん!

バッチリ、Dynamixelを認識しましたね!

これで、SpresenseからDynamixelを制御する準備は出来ました!

1
ログインしてコメントを投稿する