dreamdrive が 2022年09月25日13時17分37秒 に編集
コメント無し
本文の変更
Spresenseのマルチコアを活かして、非同期でコアごとに制御を分けたシステムを作りたいのですが、この記事は、その要素技術として、ROBOTIS社のサーボモーターDynamixelをSpresenseで動かした忘備録です。 ポイントは、ROBOTISのDynamixel用ライブラリDynamixel2ArduinoとSpresenseのライブラリに競合する関数(関数形式マクロ)があるので、その対処です。 使用するもの -- - Spresense - 1個 - Spresense拡張ボード - 1個 - DYNAMIXEL Shield for Arduino MKR series - 1個 - Dynamixel XL430 - 1個 - 電源等 - 適量 配線 -- 配線は以下の通り。 ![配線概念図](https://camo.elchika.com/6f0b38b0ff7084232fa6c75341cb9871e3d5c803/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65663139313932372d333632372d346437632d623934342d6334393661306531343437312f32356533646233312d633864372d346534352d626135362d303164373335356566663332/) プログラム -- これで、Dynamixel2Arduinoに含まれる、「scan_dynamixel」を実行してみたいと思います。 とりあえず、マルチコアの話は置いておいて、メインコアに「scan_dynamixel」を書き込んで、シングルコアでテストする準備をします。
まずは、Spresense のために ``` #include <Dynamixel2Arduino.h> ``` の前に ``` #include <MP.h> ``` を書き加えます。
まずはハードウェアのピン設定の項目で、最後のelseの部分を下記の通り書き換えます。
次に、ハードウェアのピン設定の項目で、最後の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」の準備は完了です。
これだけで、「scan_dynamixel」の準備は完了です。
いざ、コンパイル! ![コンパイル結果](https://camo.elchika.com/195e7ef9e059187305df6667500fdb2af106bfbe/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65663139313932372d333632372d346437632d623934342d6334393661306531343437312f63376532616134372d663961382d343138302d383538382d653831333466643631623830/) ぎゃふん! エラー内容を見ると、どうも、関数名が競合しているような話。 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) ``` あらためて、書き込み! ![実行結果](https://camo.elchika.com/9a7c67ee3e01d65f9502e7783763a3ca3589031c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65663139313932372d333632372d346437632d623934342d6334393661306531343437312f35323332353066302d623239302d343339622d623262332d326165373637393063343535/) じゃん! バッチリ、Dynamixelを認識しましたね! これで、SpresenseからDynamixelを制御する準備は出来ました!