dreamdrive が 2022年09月23日22時26分58秒 に編集
初版
タイトルの変更
SpresenseからROBOTIS Dynamixelサーボを動かす
タグの変更
SPRESENSE
DYNAMIXEL
メイン画像の変更
記事種類の変更
セットアップや使用方法
ライセンスの変更
(MIT) The MIT License
本文の変更
Spresenseのマルチコアを活かして、非同期でコアごとに制御を分けたシステムを作りたいのですが、この記事は、その要素技術として、ROBOTIS社のサーボモーターをSpresenseで動かした忘備録です。 ポイントは、ROBOTISのDynamixel用ライブラリDynamixel2ArduinoとSpresenseのライブラリに競合する関数(関数形式マクロ)があるので、その対処です  。 使用するもの -- - Spresense - 1個 - Spresense拡張ボード - 1個 - DYNAMIXEL Shield for Arduino MKR series - 1個 - Dynamixel XL430 - 1個 - 電源等 - 適量 配線 -- 配線は以下の通り。  プログラム -- これで、Dynamixel2Arduinoに含まれる、「scan_dynamixel」を実行してみたいと思います。 とりあえず、マルチコアの話は置いておいて、メインコアに「scan_dynamixel」を書き込んで、シングルコアでテストする準備をします。 まずは、Spresense のために ``` #include <Dynamixel2Arduino.h>  ``` の前に ``` #include <MP.h> ``` を書き加えます。 次に、ハードウェアのピン設定の項目で、最後の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を制御する準備は出来ました!