• カテゴリ マイコンボード の最新配信
  • RSS
  • RDF
  • ATOM

ブログ - マイコンボードカテゴリのエントリ

Arduino向けライブラリ更新

カテゴリ : 
マイコンボード
2023-3-15 10:20
DXSHIELD向けライブラリ改め、Arduino向けライブラリを更新しました。
Arduinoの 大勢がAVR系から他のコアになりつつあるのと、そういったケースに適用する際の修正はユーザに委ねていました。そこで今回からAVR想定だった通信部分を、完全に外出しにする事にしました。
以前との差異は以下の通りです。
  • クラスのインスタンスの際にシリアル通信にかかるハンドラをとりまとめた構造体を指定
  • AVR用として提供しているサンプルスケッチには、ハードウェアシリアル及びソフトウェアシリアルを使用したハンドラを用意
    Arduino環境であれば他のターゲットでもほぼ同じハンドラが利用可
  • ライブラリをAVR以外に適用すると、PC用DXLIBにも含まれている追加APIが利用可(β版扱い)
暗に新製品を想定している事を匂わせています

技術
DXSHIELD向けのライブラリを更新しました。
以前との差異は以下の通りです。
  • 原作者不在で放置されていたため全面的に精査
  • 一部チェックサムが無効化されていたのを修正
  • なぜか作られていなかったReadBlockData及びWriteBlockDataを追加
    それに伴いアイテムサイズに応じた読み出し及び書き込み関数は全て新設したBlock関数で代替
  • プロトコルV2における例外的な0xfdのサフィックス追加・除去機能を基本送受信関数内にて完全対応
  • いずれ追加される予定のArduino Nano RP2040 Connect用SHIELDでの検証を合わせて終了


技術
DXMIO with IMU向けのライブラリを更新しました。
以前との差異は以下の通りです。
  • フルカラーLEDやVL53L1Xの制御、DACを使ったサウンド再生、DXL追加APIのテスト、C++への対応方法のサンプルを追加
  • 近々リリースするDXMIO用I/Oボードへの対応(主にUSARTがらみ)

  • GCC Developer Liteを介さずにコンパイルできるようmakefileを追加
Dynamixelプロトコルで運用できるIMUとしてのサンプルには変更はありません。

技術
こちらで書かせてもらったWindows 10のUSB CDCの件、待っていても仕方ないので対方法を検討してみた。

結論から言ってしまうと、受信イベントのタイミングでReadFileすると、バッファ内のデータを読み込み切らずに終了するという事。残ってしまったデータは次の受信イベントが起こらない限り読み出すイベントが無い。その受信イベントは新たな受信データが無いと励起されない。
デバッガを起動していたりAPIのフックをしてたりすると若干改善したりする。

ブロッキングなら大丈夫だが、イベントドリブンな作りのアプリケーションでノンブロッキングだと解決できないネタだった。

ドライバの更新に期待していても始まらないので、それなりの改善が見受けられた方法だけ備忘録として。
とりあえず受信イベント直後のReadFile後にWindowsのメッセージを強制的にディスパッチし、受信バッファのQueueをチェックして再度ReadFileするといった方法。
これにより、マンマシン的なものであればごまかしが効くぐらいには改善する。

技術サポート
とりあえずだが、デバイスにかかわらず全般的におかしい。

usbser.sysに依存したCOMポートを使っているシステムの場合は、Windows 10への移行は待った方が無難である。

技術サポート
AVRマイコンボードシリーズを改版した事もあり、次回のGCC Developer Liteの更新時にシリアル通信ライブラリの仕様を変更します。
ARMコアのマイコンボード用シリアル通信ライブラリと記述を合わせる事で、基本的にコード互換向上を考えた上での措置となります。

主な変更は以下を予定しています。
  • システムクロックの引用
    ボーレートの決定にシステムクロックを指定し、標準的に適用している周波数と異なるクロックに対応。
  • ボーレートの指定
    ボーレートジェネレータの分周値の指定から、直接ボーレートの指定に変更。
  • 割り込み版とポーリング版の両対応
    割り込みを使用しないアプリケーションや割り込み処理内に記述できる様に送受信割り込みを使用しないバージョンを追加。
  • 送信割り込み処理変更
    送信データが多くて割り込みが連続する場合の負荷軽減。
  • 送信バッファの返値変更
    ~tx_buff関数の返値は送信バッファにたまっているデータのバイト数を返す様に変更。
  • 関数名の変更
    ポーリング版はus_~/us0_~/us1_~、割り込み版はus_int_~/us0_int_~/us1_int_~のプレフィクスに変更。
残念ながらソース互換ではなくなるため、リリースに合わせてサンプルプログラムも修正します。

技術

回路の準備ができたので、いよいよプログラム。まずはGCC Developer Liteをインストール。コンパイルオプションは「DYNAMIXEL Library for ATmega128 USB I/O」を選択(このGDLのバージョンは2.2.0.44)。GDLのバージョンによっては違う名前のこともあるが、「DYNAMIXEL」と「ATmega128」の2つの単語が入っている設定を使えばOK。
 

この設定にすることで、予め用意されているAX/DX(RXも)ライブラリをそのまま利用することができる。0から自分で用意する選択肢もあるが、今回は面倒なのでパス。また、別マイコンでAX/DXモータを使う場合も、ライブラリの中身を参考にするのが楽かも。

 


基本になるプログラムはこんな感じ。ただし、これだけだと何もしないので焦って「動かない!」と思わないよ~に。
 


トルクイネーブルまでを加えたのがこのプログラム。正しく動作すれば、AX-12+モータが現在位置で保持されるのでわかるはず。ここまでできれば、後は位置制御やら無限回転やら思いのままだ!

ということで今回はここまで。

74HC241を使えば、1つのICでAX-12+用の回路を作れる、というのが前回までのあらすじ。ちなみにDIPパッケージだと約110円。占有スペースが減るのもメリット多し。ただ、パッケージの半分以下しか使っていないのがもったいないといえばもったいない(貧乏性?)。

DIPパッケージでの接続は赤線の通り。


これだと中身がわからないので、内部ロジックから見た図がこれ

 
もちろん、元の回路にあったプルアップと直列抵抗も忘れずに。


 


モータの電源は7~12Vなので、マイコン電源と共通にしないように注意。次はいよいよライブラリを使って動かそうかな。

AX-12+は(AX-S1も)電源を含めた3本の線で動作させる・・・、というのはコネクタを見ればわかることですが、問題はマイコンとの接続ですね。

この図はAX-12+のマニュアルに載っている回路に追記したものです。2つのICを使って、マイコンの送信、受信端子を切り替えています。ちなみに、74HC125,126どちらもDIPパッケージなら100円しない位の価格らしいです。

切り替えに使うI/Oはどこでも良いといえばいいのですが、上の例ではPD5に接続しています。理由はベステクのATmega128用AXライブラリの接続がこの端子だったから。つまりこの接続なら用意されているAXライブラリ(実際にはDX/RXも共通)がそのまま使えるというわけです。楽チン楽チン。

前述の回路はこれで問題なく動作するのですが、ICを2種類使うのが玉にキズ。というわけで、1つのICで何とかならないかなと探したところ74HC241を使えば良さそうだ、というところで今回はここまで。

さてさて、回路が同じといってもAX-12+とICS2.0のプロトコルは全く違うので、別途送信コマンドを用意する必要があります(ま、当然ですね)。

ISC2.0のコマンドリファレンスとにらめっこしながら、適当に動かしてみました。

パリティの設定が違うのが、ハマりやすいところでしょうか。