春のリモコン祭り
Meridian計画。
もう2月になってしまいましたが新年あけましておめでとうございます。
前回はFUTABAサーボが動作することを確認できました。
全体の形が見えてきたので、一つ一つ積み残しの懸念点を解消しています。
まず年末からお正月にかけては、Meridian導入のためのチュートリアル的なマニュアルを書いていました。導入マニュアルは今回のプロジェクトでクリティカルパスの一つです。せっかく作っても他の人が試す方法がないのでは困ります。(そして、自分も使い方を忘れるのでメモとして便利です。)
Meridian Boardを頒布させていただいた何名かは無事にデモの実行までたどり着けたようです。自分の手元を離れてボートが動くのは初めてのお使いを見守る親のようなドキドキ感があります。
カナさんにはラズパイ導入というほぼゼロのところから進めていただけました。ありがとうございます。何箇所か修正点もご指摘いただき、非常に助かりました。
導入部分がある程度できたところで、いよいよ本丸であるモーション作成や物理エンジンの導入、そして計算歩行の学習に進みます!
…と思ったのですが、まだ積み残しがありました。
やれば簡単だろうと後回しになっていた、ESP32のBluetoothを使用したリモコンの接続です。
どのリモコンを使う?
Bluetoothにつながるリモコンといえば、メジャーで入手しやすいものとして、PS3,PS4のコントローラ、Wiiリモコンがあげられます。他にもXBOX用やSwitch用、スマホを使ったコントローラーや自分がよく使うSBDBTというリモコン接続用のマイコンもあります。PCに接続するタイプの汎用的なワイヤレスコントローラーも販売されています。近藤科学のKRC-5FHという送信機・受信機はロボットキット用なので、近藤サーボのユーザーであればすでに所持している可能性も高いです。VSTONEのVS-C1,VS-C3もロボット競技ではメジャーです。
といったようにさまざまなコントローラーがありますが、Meridianは汎用性を高めることが目的の一つですので、使える可能性のあるリモコンは全部使えるようにします。簡単なところから始め、なるべく多くのコントローラーに順次対応させていきたいと思います。
ボタンの並びを一般化する
コントローラーのボタン押下判定は基本的にビットフラグで処理されますが、メーカーによって割り当て内容が違います。
ということでMeridian側で一般化しておきます。こうすればコントローラーを交換しても同じ操作性を維持できます。
ボタン押下のビットフラグの配列への格納は論理和という方式で加算していきます。ファミコンでも採用されていた方式で、複数のボタンが同時に押された場合の組み合わせ情報も正確に伝えることができます。
リモコン関連のプロトコルを決めたところで、各社各種のリモコン機種を見ていきます。
KRC-5FH
近藤科学のリモコンです。セットになっている受信機をサーボの信号線に取り付けて使います。Arduino用のライブラリも公開されているのですぐに導入できます。
Meridian側でボタンのデータを一般化の表に合わせて変換していきます。
セレクトに該当するボタンが右側ボタン全押し判定、スタートが左側全押しという判定というところが特殊です。コントロールコマンドを設定する際に「セレクト+左」のように押下判定が被る組み合わせはこのコントローラでは使えないので、コマンド設定の際には避けた方がよいでしょう。このリモコンはESP32ではなくTeensy4.0側で受信処理を行います。オプションのアナログ入力以外は実装完了しました。
VS-C1,VS-C3
VSTONEのロボット用リモコンです。見た目はPS2のコントローラにそっくりで、信号もPS2用のライブラリを使うことができるようです。Arduinoとの接続事例もあり、接続可能だと思います。ただし送受信がSPIのようなので、ESP32との高速SPI通信と併用できるか、実際に試すまでやや心配が残ります。ニーズがあったら試します。
Wiiリモコン
Wii用のリモコンも便利です。ライブラリがあるので導入も簡単です。
こちらはESP32側のBluetoothを利用します。
WIiは生産終了してしまいましたが、Wiiリモコンは中古なら300円ぐらいと非常に入手しやすいですし、自宅に1つぐらいあるという方も多いと思います。これを活用しない手はありません。
さっそくWiiリモコンの横持ち状態とヌンチャクまでは実装できました。
レバーが2つあるクラシックコントローラーまで対応できると良かったのですが、ライブラリが見つからなかったため後回しにしておきます。
Wiiリモコンの面白いところは、数多くの変換器が発売されているところです。この変換器を使えばファミコン用やPS用などのレトロなコントローラーが一気に使えるようになります。以下は古い動画ですがその例です。
PS3/PS4のコントローラー
こちらもライブラリに頼ります。
PS3用のライブラリについては最近holypongさんが動作確認されました。動かなくもないのですが、ESP32のボードマネージャーのバージョンを落とすなどの調整が必要とのことでした。なんとかなりそうなだけに惜しいですね。
PS4用のライブラリも動作確認ができました。
上の動画のようにたしかに動作確認できていたはずなのですが、先日ためしたらペアリングが成立しなくなってしまいました。問題解決しました。ESP32には少数しかBTペアリング情報が登録できないのですが、古いペアリング情報がフラッシュメモリに残ることが原因のようでした。登録解除するコードを教えてもらいうまく動くようになりました。
ファームウェアが更新されたのか、なんらかの変化が起きたようです。ライブラリのGitHubでも同様の症状に悩んでいる方がいらっしゃいました。
こういうこともあるので競技ではKRC-5FHなど確実に動くものも併用できるとよいですね。
Xboxのコントローラー
こちらはライブラリもあるようで導入できそうです。がXbox用のコントローラーを持っていないので後回し。
Switchのコントローラー
解析が進んではいるようですがライブラリはまだ見つかりません。
PC用の無線コントローラー
Btstackというライブラリを使えば繋がりそうな感じがありますが、まだ試していません。
スマホのコントローラー
いろいろと方法がありそうですが、こちらも試せていません。スマホに組み合わせられる物理コントロールデバイスもいろいろありますし、スマホ側をプログラムできればカメラからの受信表示や、音声やジェスチャによる指示なども導入できそうですよね。
PCをコントローラーとして使う
PCとwifi連携した状態での運用が前提であれば、コントローラーの幅は一気に広がります。
まずPC側で認識できるコントローラーは全て使えるようになります。
PCのPython側でMeridim配列を作る際に情報を加えればOKです。
コントローラーに限らずPCが入力を受け付けるものであれば理論上どんな形式に対応できるようになりますので、ボーン推定やフルトラッキングによるモーション入力、ネット回線を通じたテレイグジスタンスにも対応できます。
VR空間との連携ももちろん可能で、いま行っている下準備が整えば開発を進めやすくなりそうだなと思っています。
PCの活用については今の所すべて未実装ですが、Meridianの面白さはPCとシームレスに連携できるところだと思っています。
思わぬハマり沼
と、いくつかのコントローラーを対応させていったのですが、年始早々、コントローラを接続すると通信速度が一気に半減するという不具合に出会ってしまいました。漠然とした不安はあったのですが、やっぱり出てしまった不具合。しかもプロジェクトの根幹を揺るがすクリティカルなバグです。
結論からいうとチェックサムの計算方式の不備と通信順のアルゴリズムが問題でした。高速で回っていたものが実はチェックサムをスルーしていただけという症状まで発見して、そもそも高速通信ができていなかったのではないかという可能性に気づいてヒヤヒヤしたり・・・ちょっと焦りのあったスリリングな1ヶ月でした。
なんとかできた
バグの原因がなかなか分からなかったので、アルゴリズムを表にして整理したり、バラバラだった変数名を統一して見通しを良くする作業を進めました。
さらにマルチコア・マルチスレッドについても学び、導入したことで安定性も大幅に改善されました。
速度性能も倍に向上し、通信速度で200Hzぐらいまで対応できるようになりました。ホビー用途としてはなかなかの速度だと思います。
見た目はかわらず
中身を安定させる部分をかなりがんばりましたが、進捗動画はいつもと同じ感じで、アウトプットとしては全然進捗してないも同然です。
動作が少しキビキビした感じもあったのですが、内部的な反応速度を倍にしたわりには画面上で劇的な変化はなし。
速度がディスプレイのリフレッシュレートを上回っているので画面上で変化は出ないのではないかとみっちーさんよりご指摘。
たしかに。
画面より実機を動かした時の方が反応の違いがわかりそうな気がします。
つぎどうする?
未着手で見通しがたっていない部分として、モーションデータの流し込み実験があります。ここはまずやっていくべき。
並行して、他の人が機能を追加しやすいよう、プログラムの整理をしていこうと思います。
SDカードの利用やEEPROMへの設定書き込みなども盛り込んでいく予定です。
次回記事:
前回記事:
目次:
この記事が気に入ったらサポートをしてみませんか?