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を制御する準備は出来ました!
投稿者の人気記事
-
dreamdrive
さんが
2022/09/23
に
編集
をしました。
(メッセージ: 初版)
-
dreamdrive
さんが
2022/09/23
に
編集
をしました。
-
dreamdrive
さんが
2022/09/23
に
編集
をしました。
-
dreamdrive
さんが
2022/09/23
に
編集
をしました。
-
dreamdrive
さんが
2022/09/23
に
編集
をしました。
-
dreamdrive
さんが
2022/09/25
に
編集
をしました。
ログインしてコメントを投稿する