1.記事一覧
記事は複数回に分けて投稿する予定です。AMD/XilinxのARM SoC(ZynqMP Kria K26 SOM)で動作する、AMD/Xilinx公式認定Ubuntuやベアメタル開発を勉強していく覚書きです。
ZynqMP(APU:Cortex-A53,Arm64) 組込みLinux入門編
- 【ZynqMP】1. 認定UbuntuでPLのGPIOを使う
- 【ZynqMP】2. 認定Ubuntuのカーネルビルド
- 【ZynqMP】3. 認定UbuntuのDeviceTree変更
- 【ZynqMP】4. 認定UbuntuでOpenAMPを試す【CR5Lockstep】
- 【ZynqMP】5. UARTでAMP【コア間通信】
- 【Linux】6. crash toolでカーネルメモリを見る
ZynqMP(RPU:Cortex-R5,Arm32) RPU入門編
- 【ZynqMP】1. Cortex-R5でHelloworld
- 【ZynqMP】2. Cortex-R5でRTOS+GPIO
- 【ZynqMP】3. PL EthernetでTCP/IP【動作編】
- 【ZynqMP/RasPi】4. CAN通信デバイスを試す ←本記事
2.CANを勉強するなら実デバイスを動かしたい
2-1. なぜCAN通信を試すのか
CAN(Controller Area Network)とは自動車機器やFA機器でよく利用される通信規格です。詳細な説明はWeb上にあるので省きますが、代表的な特徴は以下のとおりです。
CANの特徴
- リアルタイム性能
- 高い耐ノイズ性能
- 差動2線式で線数が少ない
- CANはMAX1Mbps、CANFDは2~5Mbps、あるいはそれ以上
仕事で車載機器に関わっていた身としては実機評価で扱っていました。しかし、あくまでアプリの評価をしただけでCANの仕組みはよくわかっていません。以前から趣味で試してみたいと思っていたのですが、やろうとすると結構導入ハードルが高いです。
導入が難しい理由
- PCとCANをブリッジする機器が高額(CANoe、Kvaserなど)
- 通信相手とするCAN機器が高額(自動車のOBD-Ⅱ、FA機器のセンサorアクチュエータなど)
- 産業用CAN機器の多くはプロトコルスタックによる複雑な通信をする(CANopenなど)
よくある実験方法としてはマイコンやRaspberry PiにCANアダプタを2つ接続してループバックさせる方法があります。それでも良いのですが、自身の中では満足とは行きません。
ループバック実験の(モチベ的な)メリデメ
- 導入の第1歩目としては非常に良い
- 通信内容は自由なので、実際のCAN機器の内容を見てみたい気持ちがある
- 通信タイミングが自由なので、実際のCAN機器と勝手が異なる
- 実際のCAN機器が無いとあまり面白くない
いろいろ理由を並べていますが、実際のCAN機器相手にしないとCANやってみた感がないというただの感情論です(笑)。以上のような理由から手出しするモチベーションがなかったのですが、最近あるものを見つけました。
CANデバイス候補:RollerCAN Unit
https://docs.m5stack.com/en/unit/Unit-RollerCAN
プロトタイプ向けに爆発的に人気の無線マイコンESP32をベースに作られた、M5Stackシリーズが有名です。2024/10頃にそのM5StackからCAN制御のブラシレスモータが発売されました。
モータドライバと制御用マイコン(STM32)を内蔵しており、FOC制御(フィールド指向制御、ベクトル制御)と磁気エンコーダを内蔵しています。減速機は無く、ダイレクトドライブ用途で使えるように、高トルク仕様になっているようです。
日本の代理店はスイッチサイエンスさんから¥8.7kで販売されていたので、1つ購入してみました。産業用サーボモータのような数十万円のものと比べれば、個人で手が届く範囲です(と言って自分を納得させている)。
サイズはかなりコンパクトです。裏にはOLED液晶のようなものがついていて、左のボタン(‘A’とある部分)とモータ軸を手動で回してダイヤル代わりにUIを操作して各種設定をすることができるようです。I2CモードとCANモードの切り替えやCAN用のデバイスIDの設定を最初にする必要があるみたいです。
モータの仕様
- 寸法:40*40*40mm
- 電源:DC 6~16V (XT30コネクタ)
- トルク:0.065N・m @ 927mA (DC16V)
- 磁気エンコーダ素子:TLI5012BE1000 (infineon)、 分解能0.01°だが、CAN指示では1°単位と粗め
- 通信I/F:CAN , I2Cのどちらかを選択
- 制御モード:電流指示、回転速度指示、位置(角度)指示から選択
- Groveの配線がマウント-モータ軸間でスリップリング接続されている
- 内部にSTM32G4マイコン搭載で、SWDの配線が引き出されていてFW書換可能
- STM32のFWがGithubに公開されている
最近注目されている中華系ドライバ内蔵モータ(cybergearなど)としてはそこまでトルクはないですが、価格帯を考えるとお手軽に手を出しやすいかなと思います。制御アルゴを内蔵しているのが、優秀ですね。改造する予定はないですが、FWのソースコードや回路図が公開されているのは純粋に驚きです。
2-2. 今後の計画
現時点での計画になりますが、段階を踏んで実験していこうと考えています。
- 1.RaspberryPiとCANアダプタでCANループバック実験
- 2.Pmod接続の絶縁CANトランシーバ基板の自作
- 3.ZynqMPでLinuxからCANを扱い、モータを動かす
- 4.ZynqMPでサブコア(CR5)からCANを扱い、モータを動かす
- 5.モータ2個でバイラテラル制御デモ
- 6.PID制御式の導出
- 7.ZynqMPでモータの速度制御(PI制御):速度制御モード非使用でサブコアで演算
- 8.ZynqMPでモータの角度制御(PID制御):位置制御モード非使用でサブコアで演算
詳細を説明していきます。
1.RaspberryPiとCANアダプタでCANループバック実験
今後実験する上でCANが確実に動作する環境が1つ欲しいため、ネット上に実績がある、RaspberryPiとCANアダプタでCANに入門します。PC-CANブリッジ機器を今回購入しないため、こちらをデバッグ用に活用します。
2.Pmod接続の絶縁CANトランシーバ基板の自作
KR260のPmodに挿せるCANトランシーバ基板を作成します。よくあるMCP2515のSPI-CANブリッジICを搭載しないトランシーバのみで、かつ、ガルバニック絶縁が施されているものが、市販で手に入りそうにないので、自作します。それっぽい理由を並べていますが、とりあえずプリント基板作成するネタが欲しかっただけです。
3.ZynqMPでLinuxからCANを扱い、モータを動かす
1.でラズパイによるCAN入門を参考にZynqMPでLinuxからSocketCANを扱ってみたいと思います。モータへのコマンド指示は可能ですが、リアルタイム性は期待できないので、後にサブコア(CR5)で再実装します。
また、ZynqMPはCANのIPが2種類あり、CAN-PSとAXI-CANの2つが使えます。CANFDのIPもありますが、今回は対象にしません。
4.ZynqMPでCR5からCANを扱い、モータを動かす
サブコア(CR5)による、RTOSorベアメタルアプリでAXI-CANからCAN通信を試みます。CANコマンド仕様をもとにライブラリの実装をする予定です。
5.モータ2個でバイラテラル制御デモ
モータ2個の軸同士を仮想的なシャフトで接続したような制御をやってみます。マニピュレータの力覚フィードバックとして用いられます。
6.PID制御式の導出
サブコアでPID制御演算を行うため、伝達関数から双一次変換法を用いて差分方程式、そしてC言語実装までをやってみたいと思います。できればリセットワインドアップも実装できればと思います。
7.ZynqMPでモータの速度制御(PI制御)
- モータからエンコーダ情報をフィードバック
- サブコアでPI制御を演算
- モータに操作量としてトルク指示
という流れのフィードバック制御をやってみたいと思います。モータは速度制御モードがありますが、それを使わず、電流制御モードを用います。もしかしたらトルク定数やロータイナーシャのパラメータ同定が必要になるかもしれません。
8.ZynqMPでモータの角度制御(PID制御)
速度制御がうまくできたら角度制御をやってみたいと思います。速度制御&角度制御のカスケード制御(PI+PI)になるか、1ループのPID制御になるかはまだわかりません。