お久しぶりです。さばねっこです。
今年もなぜか学生ロボコンに出場させていただく機会をいただきまして、ピットメンバーとして参加させていただきました。
↓去年出た時のやつ
もしかして高専生で学生ロボコンのピット2回やってるのって激レア人材なのでは???
今年は回路設計全般とマイコン上で動作するファームウェア全般を担当させていただきました。ワンオペ回路班&ワンオペ低レイヤー制御班ですね。
今回は本大会で出場したロボットの回路とソフトを紹介、もとい公開していきたいと思います。別に特別なことをしているわけではありませんしね。
基板もソフトもパクりたいところがあれば自由にパクってください。というかパクってくれると嬉しいです。
回路系のデータはすべてこちらのリポジトリにアップロードしてありますので自由にご活用ください。readmeにファームへのリンクも貼ってあるのでそちらも自由に使っていただいて構いません(ほとんどコメント書いてないクソコードだけど)。
目次
基本方針
今回学ロボに参加することになったわけですが、実はフルコミットできていたわけではありません。そう、みんな大好き大学編入試験があるのです(あとバイト)。まあ編入に関しては推薦枠を貰えていたので最悪勉強しなくても何とかなるかもしれないですが、toeicのスコアは上げておきたいですし、推薦に落ちた時のために最低限の勉強はしておきたいわけです。
また、回路の仕様変更でほかの人(高レイヤー制御とか)に負担を強いるのも申し訳ないので、活動開始から一次ビデオまでの2か月でファームも含めて9割程度完成させておきたいなと思いました。
というわけで以下のような基本方針を定めました。
- 面白いことをやらない
- 工作が楽しくなってきちゃうと勉強しなくなるから
- パワエレ部分は自作しない
- 直すのがめんどくさいので壊れない回路を作る
- やったことのないことをやらない
- お金で解決できるならそうする
うーんすでにクソつまらなさそうですね。でも時間ないからしょうがない。
パワエレをしない、というのは割と苦肉の選択ではあります。一応僕はパワエレ大好きマンですので、できればモタドラとかも全部自作したいわけです。実際こんな感じで作ってるし。
しかしモタドラの信頼性はかなり重要な点であり、その点を保証するためにはそれなりの開発リソースが必要になります。というわけで今回は我慢して市販品を惜しみなく使うことにしました。
そんな感じで決めた設計がこんな感じ。
うーん読めませんね。
回路系だけ切り出して日本語訳するとこんな感じ。
めっちゃロボマスモーター&モタドラを使うことになりました。まあ(多少の出費に目を瞑れば)回路も制御も設計もみんな幸せになれるので合理的ではあります。
モーターの位置指令や速度指令は制御用PC内のROSシステムで演算し、マイコン側はCANバスを通じて指令を受け取りPID制御などをする形の構成になります。また、モーターの回転角といった情報はCANバスを通じてPCにフィードバックし、自己位置推定に用いたりしています。まあ、きわめて一般的な構成なのではないかなと思います。しらんけど。
メインの通信はすべてノーマルなCANを使うことにしました。FDじゃないです。FDできるマイコンの在庫があまりなかったのが主な理由ですね。
まあモーターのpidなどのバチバチなリアルタイム性が必要な制御は基板内で完結していますし、普通のcanでも帯域は足りるよね、という訳でそこまで問題にはなりませんでした。というか帯域が足りなかったら最悪オーバークロックして4Mbpsぐらいでブン回せばいいや〜〜とか思ってました(???)。
というわけでこれらの方針に従って作った基板とかを紹介します。
モーター制御基板
ロボマスモーター制御基板ですね。
この一枚で、C610/620を4つ制御することができます。また、射出のモーターを回すvesc(つよいオープンソースなBLDCドライバ)も同様に4つ繋げられます。
本来c610は一つのcanバスに8つまで接続出来ますが、余裕を持って4つにしておきました。基板サイズ的にもちょうど良いですしね。(本当はソフトを拡張するのがめんどくさくて放棄しただけ)
また、i2cポートが4つあり、as5600といった磁気アブソリュートエンコーダーの値を元にモーターの制御をすることも出来ます。ステアの操舵角の制御にはこれを使っています。
指令値を送るだけで位置制御、速度制御、オープンループなど、大抵のことはできるようになっています。また、canやi2cの断線検知機能もつけましたので結構安全性は高いと思います。多分。
コネクタの間にインジケータLEDを入れてみたりしたのですが割と気に入っている。
モーター制御基板、LEDの点滅パターンで制御モードがわかる(オープンループ、速度、位置、
— さばねっこ🐟@豊田高専TGT (@sabanekko1) 2024年6月10日
絶対位置など)ようになってるんだけど割と気に入っている pic.twitter.com/Z5zyglKKQ3
ドライバがつながっていないと光らないようにもなっているので断線が一目でわかります。
USB-CAN変換器
データの取りこぼしや演算のオーバーヘッドがあると困るのでなるべく強いマイコンを使おう、というわけでSTM32H743を積んでみました。
この基板一枚から二つのCANバスが出ていますが、実はUSB側から見ると一つのCANバスとして使えるようになってます。起動時にバス上のデバイスを検索して、USBからのデータを自動的に振り分ける、という感じですね。これで実質CANの帯域が2倍になります(tekitoiu)。
ちなみにUSB側にはSLCANというプロトコルを採用しています。
基本的にはただのシリアル通信で文字列を送っているだけですし、パソコン側もpython-canというライブラリから簡単に利用できるのでおすすめです。
また、絶縁タイプのトランシーバーを採用しているので万一電源基板が暴走してもパソコンに被害が及ばないようにしています。
ちなみにいかにも絶縁してる感のあるスリットがトランシーバIC下にありますが、そもそもこのトランシーバICの絶縁性能はそこまで高くないので実はただの飾りです。それっぽいのでおk。
ちなみに基板右下のUSBはCH347Tというシリアル変換ICにつながっています。このICはUSB high-speedに対応しているため、マイコン内蔵のUSB Full-Speedでは帯域が足りなかった時のためにを載せられるようにしていました。実際には使用しませんでしたが…。
二系統のuartを扱うことができたり、i2cやspiも使えるらしくて面白そうなのでいつか使ってみたいですね。
電源基板
基本的にはパワー系の電圧、電流、非常停止を管理するお仕事をしています。
また、降圧チョッパを乗せたので5v系の電源の生成も出来ます。
こちらのICを使用しました。ワンチップに同期ブリッジが内蔵されていて便利ですね。外付け部品も少なくそこそこ電流流せるのでおすすめです。
あと何となくブザーを乗せたのですが、これが結構便利。LEDだと実際に目で見るまで異常が分かりませんからね。接続されたリポのセル数や、非常停止、電圧異常、電流以上などのステータスをお知らせしてくれます。
もちろんオートディスチャージ機能もありますので、非常停止時は速やかに電源を落とすことができます。
ちなみに突入電流保護はめんどくさかったので入れてないです。何とかなるやろの精神。実際何とかなってるのでセーフ。
そういえば非常停止のスイッチングには伝統のクソデカリレーを使っていますが、これは半導体スイッチだと万一故障したときにショートモードになってしまい非常停止の意味がなくなるからです。あと動作音が気持ちいい。
汎用IO基板
基本的にリミットスイッチなどの単純なセンサー類を繋ぐことを想定して設計しています。また、サーボやescを繋ぐことができるようにポートごとにソフトウェアpwmを生成できるようにもなっています。各ポートごとに周期やduty比を設定できるので、圧電スピーカーを繋げば9重和音も出せますね。やらんけど。
escは大抵起動時に数秒ほどの起動シーケンスを実行する必要がありますが、この基板は自動的に実行するpwmシーケンスを設定できるようになっており、非常停止解除の信号を受け取ると勝手にescの起動シーケンスを実行してくれるようになっています。便利。
ちなみにxt30はサーボとかの補助電源用です。使う機会はありませんでした…。
全体的な絶縁設計
今回のロボットのパワー系と弱電系の電源は絶縁されておらず、電源基板にて一点接地するような形で設計されています。
基板ごとに絶縁する宗派の方も時折見かけますが、デジタルアイソレータの類は基本クソ高いですし、電源がめんどくさいのであんまりやりたくありません…。
まあ、CANは結構ノイズに強いので、ある程度雑に扱っても問題なく動作してくれますしね。
というわけでCANは非絶縁で、それ以外の差動信号でない重要な部分だけに絞って絶縁することにしました。具体的にはESCの制御信号のところですね。
もしこの部分を絶縁していないと、下図みたいな感じでクソキモGNDループが形成されてしまいます。そういうわけでフォトカプラでPWM信号は絶縁して、GNDを分離することにしました。
こうすればGNDは電源基板の一点でのみ接続された状態となるため、ノイズ対策もしやすくなりますね。
また、USB-CAN変換基板にも絶縁CANトランシーバを採用しています。この部分は理論上絶縁しなくても問題ありませんが、事故ってクソ高いパソコンが死んでも責任は取れませんので絶縁しておきました。
回路固定具の設計
基板が壊れたりした際には、修理のために取り外さないといけません。しかし、ねじタイプのスペーサーでスタックしてしまうと、分解の手間がかなり掛かります。
またロボコンモタドラ界隈でよく見る縦ざし基板はマザーボードの設置が運用の大前提となってしまい、ロボットに搭載する際の自由度が下がってしまいます。
まあ単体でも使えるような設計もできますが、それはそれで考えることが多くてめんどくさい…。
というわけでこんな感じの3Dプリンタ製レールを設計しました。
レールユニットを取り出すとこんな感じ。
コネクタはこちらのものを使用しています。
↓レール搭載する基板側
↓ハブ基板(レールの奥に固定されている基板)側
https://www.digikey.jp/ja/products/detail/sullins-connector-solutions/SFH11-NBPC-D03-ST-BK/4558818
フラットケーブルなどを接続するのに使用する普通のBOXプラグですね。ですのでレールユニットに乗せられない基板は普通のフラットケーブルで接続して使用することも可能です。
基板取り付けメスのコネクタは少々高いですが、ふつうのピンソケットでも代用可能なのでそれでもいいと思います。
ちなみにレールのSTLデータはにあるので暇だったら印刷して遊んでみてください。stepファイルも上げてあります。
良かった点・反省点
なんやかんや作った基板は試作段階を除いて一度も壊れることは無かったので良かったです。本番会場でも無事壊れずに動作してくれたので回路班的にはこれ以上の満足はないかな。
あと全基板にUSB typeCを乗せた点、これは滅茶苦茶良かった。デバッガにもstlink v3 minieを採用しているので回路系のデバッグはすべてtypeCでできます。
また、どの基板もUSB-CAN変換基板と同じSLCANプロトコルによる指令に対応しているため、基板単体の動作確認であれば、わざわざUSB-CAN変換基板を用意しなくてもUSBから直接データを送って動作させられるようになっています。これは超便利なのでみんなやりましょう。
ただ反省点ももちろんあります。
まず、やっぱりCAN-FDは使っておけばよかったなーという点ですね。
まあ帯域的には問題なかったのですが、将来的な拡張を考えると普通のCANはやはり微妙…。まあ最近の学ロボ界隈ではじわじわとetherCATの波が広がっているのでそっちでもいいかもしれない。
また、USB-CAN変換基板への入力も、USB-High speed、もしくはethernet接続にしておけばよかったかなと思います。こちらも拡張性の問題ですね。
ほかにもモーター制御基板から8つモーター回せるようにしておけばよかったなーとかもありますが…。まあこれはちょっとソフトを書き換えるだけなのでいいでしょう。
というか設計データ見返してて思ったけど部品密度めっちゃ低いな。2年前の僕の超高密度設計はどこへやら。まあ大した機能も載っていないのでこんなもんですかね。
これからについて
私事ですが(というか私事を書くブログなのですが)、無事長岡技科大に進学することになりました。パワエレ頑張りたい。ロボコンは…、まあやるかはまだわからないですがもし手伝えることがあればやりたいなという感じです。
というかロボコンに感してはマジで成仏できたなーという感じです。二年前の高専ロボコンで成仏したのに何やってるんだろ。まあでも今回の大会で、自分の中の「こういう回路構成やってみたい」っていうネタは全部出せたので結構満足しています。またいいネタが浮かんだらロボコンやろうかな。
なんかめっちゃ長くなってしまいましたね…。5000字越えの記事は初めてかもしれない。
自分が書けることはほとんど書いたつもりなのでぜひ参考にしていただけると嬉しいです!