micro:bitでラジコンは作った。コントローラーはどうする？

ねえパパ、ラジコンつくりたい。

数年前のクリスマス少し前、息子（当時小1）のこの言葉からはじまったラジコン作り。[前回、車体は作成できた](https://qiita.com/secile/items/4f617f24452b1abb4086)。ではコントローラーはどうする？

# コントローラーを作成する前に
車体の前輪・後輪がサーボモーターと組み合わせて正しく動作するか、チェックをしましょう。

前回説明しましたが、前輪と後輪のサーボモーターはどちらも、Yahboom社の[Super:bit Expansion Board](http://www.yahboom.net/study/Super:bit)のサーボモーター端子に接続されています。micro:bitでSuper:Bitを利用するには、Yahboom社から提供されている、拡張機能を利用します。

MakeCodeのプロジェクトエディタで「拡張機能」の検索窓に以下のURLを入力します。すると「Extension for Yahboom SuperBit」が見つかるので、これをプロジェクトに追加してください。

実はSuper:Bitには、古いもの（無印）と新しいもの（V2）があります。今購入すると（たぶん）V2が届くと思いますが、持っているSuper:Bitに合わせて、適切な方を選択してください。

[ふるいもの](https://github.com/YahboomTechnology/Superbit-expansion-board/blob/69b99118169689e5f0d25ba7314d24607415bf02/Introduction%20of%20Superbit%20expansion%20board%20.pdf)：https://github.com/lzty634158/SuperBit
[新しいもの](https://github.com/YahboomTechnology/Superbit-expansion-board/blob/69b99118169689e5f0d25ba7314d24607415bf02/Introduction%20of%20Superbit%20expansion%20board-New.pdf)：https://github.com/YahboomTechnology/SuperBitLibV2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/6ee33d27-65f3-99c6-2e67-ea0880d920af.png)

今回は「新しいもの」を追加した場合、以下のブロックが追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/7351e79e-edba-2171-03dd-7f0b6198bcc0.png)


# 前輪の動作チェック
前輪は角度モーターです。GeekServeの角度モーターには180度のものと270度のものがあるようです。使用するモーターにあわせて適切なブロックを選択します。今回は180度モーターで説明します。

180度角度モーターの場合、指定できる範囲は0度～180度、中心は90度になります。以下のようなプログラムを作成し、前輪を一度、中心（90度）にします。前輪はS1端子に取り付けたので、「S1」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/8a9549a4-153d-a527-e0d3-3979fe0300dd.png)

おっと！ **Aボタンを押す前に、前輪のサーボモータの歯車を、ギヤラック（溝がついた部品）から外すのを忘れないように！** そうでないと、歯車がギヤラックの限界を超えて回転し、「ガギガギ」と壊れそうな音で回るかもしれません！？前輪が中心（90度）になってから、車体が直進するように前輪の向きを調節して、歯車をギヤラックにセットしてください。

valueの値を変更し、以下のように前輪が動作すればOKです。ただし、角度をあまり大きく or 小さくすると、歯車がギヤラックの限界を超えて回転しようとします。私の場合、角度が「40度～140度」くらいが適切でしたので、この範囲で変更するようにします。

![241211_142839_sh.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/7fc7890d-ed13-591a-4965-9a7451570757.gif)

# 後輪の動作チェック
後輪は回転モーターです。以下のようなプログラムを作成して、動作確認をしましょう。S2端子に取り付けたので、「S2」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/0e60d123-f4b5-acb0-1669-9f58005d7689.png)

回転モーターは、回転方向（forward」か「reverse」）と、速度を指定します。速度は0-100の間で指定するようです。速度と回転方向を色々と変更して、動作確認してみましょう。

![241211_143024_sh.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/2ab90c17-7914-ab1c-84b6-edd0602e63e4.gif)

# コントローラーどうするか

## スマホやタブレットのmicro:bitアプリの「モニター＆コントロール」機能を利用する。
ネットで検索する限り、スマホやタブレットのmicro:bitアプリには、micro:bitをリモートで制御するための「モニター＆コントロール」があるらしい。。。でも私のAndroidのmicro:bitアプリには、そんな機能ない。

![monitor_control.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/9503d437-951e-101d-1f57-fabb8db302f5.png)

娘を呼んで、娘のiPhoneとiPadにmicro:bitアプリをインストールしたところ、なんと、「モニター＆コントロール」機能が、ちゃんとありました。なんでAndroidには無い・・・？
残念ながらこの方法は不採用となりました。

## micro:bit対応のジョイスティックを購入する
micro:bitに対応したジョイスティックが、いくつかのメーカーから販売されています。
- Yahboom：[Yahboom micro:bit basic game handle](https://category.yahboom.net/products/basicgamehandle)
- DFRobot：[micro:GamePad ](https://www.dfrobot.com/product-1711.html)
- スイッチサイエンス：[micro:bit用ジョイスティック付きコントローラーキット](https://switch-education.com/products/microbit-joystick-controller-kit/)

ただし、車体側のmicro:bitとは別に、<font color="DeepPink">**ジョイスティック用にmicro:bitがもう１台必要！ジョイスティックとあわせてお金がかかる！**</font>。しかし、もっともラジコンらしい操作ができます。「micro:bitは２台あれば、連携して、いろいろ遊べるよ！」と自分に言い聞かせて、私は、２台目のmicro:bitと、スイッチサイエンスのジョイスティックを購入しました。

### 全体の構成
micro:bitはもともと、複数台で通信する仕組みが備わっています。これを利用して、コントローラーを作成します。
以後、ジョイスティック側のmicro:bitを①、車体側のmicro:bitを②とします。
- [micro:bit①と②] 最初だけブロックで「無線グループを設定 0」を実行
- [micro:bit①だけ] スティックの状態を読み取って、無線でmicro:bit②に送信
- [micro:bit②だけ] 無線でデータを受け取ったら、サーボモーターを制御

### 最初だけブロックで「無線グループを設定」を実行
micro:bit①と②とも、「最初だけ」ブロックに「無線のグループを設定」を追加します。これで、micro:bit①⇔②間で、データのやり取りができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/37a15e9a-50e4-51c7-76b0-a46b7ff679d2.png)

### [micro:bit①] スティックの情報を読み取って、無線でmicro:bit②に送信

スイッチサイエンスのジョイスティックは、P0,P1,P2端子を読み書きしてスティックの状態を読み取ります。
- はじめにP2端子で、左右どちらのスティックの状態を読み取るか指定します。デジタル出力で0を書き込むと左スティック、1を書き込むと右スティックの状態が読み取れるようになります
- 次に、P0端子のアナログ電圧を読み取ると、スティックの横方向（水平方向）の傾きを0～1023の範囲で読み取ることができます
- 次に、P1端子のアナログ電圧を読み取ると、スティックの縦方向（垂直方向）の傾きを0～1023の範囲で読み取ることができます
- 注意点として、P2端子にデジタル0か1出力後、少しだけ待つ必要があります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/d5cc9443-7f6d-7c8c-0015-e520ae8ef8b5.png)

読み取ったスティックの状態は0～1023範囲となります。これを、サーボモーターの適切な範囲に変換するために、「数値をマップする」ブロックを使用します。
- 左スティックはスティック状態の0～1023範囲を、角度モーターの40～140範囲にマップしています
- 右スティックはスティック状態の0～1024範囲を、回転モーターの速度であるマイナス100からプラス100にマップしています

読み取った「ハンドル」「アクセル」の値は、「無線で送信」ブロックを使って、micro:bit②に送信します。

### [micro:bit②] 無線でデータを受け取ったら、モーターを制御
今度は車体側です。

「無線で受信したとき」ブロックで、microbit①からのデータを受信します。受信したデータに従って、前輪や後輪を動かします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/4e38a744-19a5-b1c1-940e-7e2fd48a3b3d.png)

# ついにラジコンが完成した！

やったあ！ついにラジコンが完成した！パパやったよ。息子よ。
あれ？なんかそれほどうれしそうじゃなくない？そんなことないって？そうか。

![WIN_20241218_11_42_35_Pro.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/762c8b27-9ee9-3979-9fd3-78080c250c17.gif)

# 数か月後・・・

仕事から帰って机の上を見たら、そこには、魔改造されたラジコンの姿が！。サーボモーターSG90を結束バンドでくくりつけて、レゴで作ったプロペラをつけたらしい。もちろんプロペラは回転する。空を飛ばせたかったらしい。息子は息子なりに楽しんでいたようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/12a47a68-a4ad-e6e0-9e26-d7b80f55045c.png)

## スマホをコントローラー代わりにする。
🤔「でも、やっぱり、もう１つmicro:bitを購入するのは、ちょっと...」
😑「ジョイスティックなしで、なるべく安くコントローラーをつくりたいよ...」

そこで、次回、「スマホでコントローラーを作成する」を、お楽しみに！