ねえパパ、ラジコンつくりたい。
数年前のクリスマス少し前、息子(当時小1)のこの言葉からはじまったラジコン作り。前回、車体は作成できた。ではコントローラーはどうする?
コントローラーを作成する前に
車体の前輪・後輪がサーボモーターと組み合わせて正しく動作するか、チェックをしましょう。
前回説明しましたが、前輪と後輪のサーボモーターはどちらも、Yahboom社のSuper:bit Expansion Boardのサーボモーター端子に接続されています。micro:bitでSuper:Bitを利用するには、Yahboom社から提供されている、拡張機能を利用します。
MakeCodeのプロジェクトエディタで「拡張機能」の検索窓に以下のURLを入力します。すると「Extension for Yahboom SuperBit」が見つかるので、これをプロジェクトに追加してください。
実はSuper:Bitには、古いもの(無印)と新しいもの(V2)があります。今購入すると(たぶん)V2が届くと思いますが、持っているSuper:Bitに合わせて、適切な方を選択してください。
ふるいもの:https://github.com/lzty634158/SuperBit
新しいもの:https://github.com/YahboomTechnology/SuperBitLibV2
今回は「新しいもの」を追加した場合、以下のブロックが追加されます。
前輪の動作チェック
前輪は角度モーターです。GeekServeの角度モーターには180度のものと270度のものがあるようです。使用するモーターにあわせて適切なブロックを選択します。今回は180度モーターで説明します。
180度角度モーターの場合、指定できる範囲は0度~180度、中心は90度になります。以下のようなプログラムを作成し、前輪を一度、中心(90度)にします。前輪はS1端子に取り付けたので、「S1」を選択します。
おっと! Aボタンを押す前に、前輪のサーボモータの歯車を、ギヤラック(溝がついた部品)から外すのを忘れないように! そうでないと、歯車がギヤラックの限界を超えて回転し、「ガギガギ」と壊れそうな音で回るかもしれません!?前輪が中心(90度)になってから、車体が直進するように前輪の向きを調節して、歯車をギヤラックにセットしてください。
valueの値を変更し、以下のように前輪が動作すればOKです。ただし、角度をあまり大きく or 小さくすると、歯車がギヤラックの限界を超えて回転しようとします。私の場合、角度が「40度~140度」くらいが適切でしたので、この範囲で変更するようにします。
後輪の動作チェック
後輪は回転モーターです。以下のようなプログラムを作成して、動作確認をしましょう。S2端子に取り付けたので、「S2」を選択します。
回転モーターは、回転方向(forward」か「reverse」)と、速度を指定します。速度は0-100の間で指定するようです。速度と回転方向を色々と変更して、動作確認してみましょう。
コントローラーどうするか
スマホやタブレットのmicro:bitアプリの「モニター&コントロール」機能を利用する。
ネットで検索する限り、スマホやタブレットのmicro:bitアプリには、micro:bitをリモートで制御するための「モニター&コントロール」があるらしい。。。でも私のAndroidのmicro:bitアプリには、そんな機能ない。
娘を呼んで、娘のiPhoneとiPadにmicro:bitアプリをインストールしたところ、なんと、「モニター&コントロール」機能が、ちゃんとありました。なんでAndroidには無い・・・?
残念ながらこの方法は不採用となりました。
micro:bit対応のジョイスティックを購入する
micro:bitに対応したジョイスティックが、いくつかのメーカーから販売されています。
- Yahboom:Yahboom micro:bit basic game handle
- DFRobot:micro:GamePad
- スイッチサイエンス:micro:bit用ジョイスティック付きコントローラーキット
ただし、車体側のmicro:bitとは別に、ジョイスティック用にmicro:bitがもう1台必要!ジョイスティックとあわせてお金がかかる!。しかし、もっともラジコンらしい操作ができます。「micro:bitは2台あれば、連携して、いろいろ遊べるよ!」と自分に言い聞かせて、私は、2台目のmicro:bitと、スイッチサイエンスのジョイスティックを購入しました。
全体の構成
micro:bitはもともと、複数台で通信する仕組みが備わっています。これを利用して、コントローラーを作成します。
以後、ジョイスティック側のmicro:bitを①、車体側のmicro:bitを②とします。
- [micro:bit①と②] 最初だけブロックで「無線グループを設定 0」を実行
- [micro:bit①だけ] スティックの状態を読み取って、無線でmicro:bit②に送信
- [micro:bit②だけ] 無線でデータを受け取ったら、サーボモーターを制御
最初だけブロックで「無線グループを設定」を実行
micro:bit①と②とも、「最初だけ」ブロックに「無線のグループを設定」を追加します。これで、micro:bit①⇔②間で、データのやり取りができるようになります。
[micro:bit①] スティックの情報を読み取って、無線でmicro:bit②に送信
スイッチサイエンスのジョイスティックは、P0,P1,P2端子を読み書きしてスティックの状態を読み取ります。
- はじめにP2端子で、左右どちらのスティックの状態を読み取るか指定します。デジタル出力で0を書き込むと左スティック、1を書き込むと右スティックの状態が読み取れるようになります
- 次に、P0端子のアナログ電圧を読み取ると、スティックの横方向(水平方向)の傾きを0~1023の範囲で読み取ることができます
- 次に、P1端子のアナログ電圧を読み取ると、スティックの縦方向(垂直方向)の傾きを0~1023の範囲で読み取ることができます
- 注意点として、P2端子にデジタル0か1出力後、少しだけ待つ必要があります
読み取ったスティックの状態は0~1023範囲となります。これを、サーボモーターの適切な範囲に変換するために、「数値をマップする」ブロックを使用します。
- 左スティックはスティック状態の0~1023範囲を、角度モーターの40~140範囲にマップしています
- 右スティックはスティック状態の0~1024範囲を、回転モーターの速度であるマイナス100からプラス100にマップしています
読み取った「ハンドル」「アクセル」の値は、「無線で送信」ブロックを使って、micro:bit②に送信します。
[micro:bit②] 無線でデータを受け取ったら、モーターを制御
今度は車体側です。
「無線で受信したとき」ブロックで、microbit①からのデータを受信します。受信したデータに従って、前輪や後輪を動かします。
ついにラジコンが完成した!
やったあ!ついにラジコンが完成した!パパやったよ。息子よ。
あれ?なんかそれほどうれしそうじゃなくない?そんなことないって?そうか。
数か月後・・・
仕事から帰って机の上を見たら、そこには、魔改造されたラジコンの姿が!。サーボモーターSG90を結束バンドでくくりつけて、レゴで作ったプロペラをつけたらしい。もちろんプロペラは回転する。空を飛ばせたかったらしい。息子は息子なりに楽しんでいたようです。
スマホをコントローラー代わりにする。
🤔「でも、やっぱり、もう1つmicro:bitを購入するのは、ちょっと...」
😑「ジョイスティックなしで、なるべく安くコントローラーをつくりたいよ...」
そこで、次回、「スマホでコントローラーを作成する」を、お楽しみに!