micro:bitでミニETCゲート

目次

0.アイディア

家にあったミニカー、子供用のブロックであるJOIZ(ABOUT JOIZ | おもちゃ-ピタゴラス・ブロック | 乳幼児玩具メーカー・ピープル)、サーボモーターを使い、次のようなミニETCゲートを作ってみました。ミニETCは、自動モードの他、手動モードでも開閉できます。手動モードには遠隔操作もあります。

  • 自動モード
    • 磁力センサーでミニカーに積まれた磁石を探知(↓動画)
  • 手動モード
    • A/Bボタン
    • Bluetooth
    • モバイルアプリ

クローズ

オープン

1.必要なもの

  • micro:bit 本体
  • 電源(今回は単3x2の電池ボックス)
  • サーボモーター(今回はSG-90)
  • ケーブル(今回はワニ口〜ジャンパーピン(オス))
  • JOIZ(JOIZ Basicの方ですが、JOIZ Firstでも部品は足ります)
    • ETCゲートのバーになる部分(JOIZを利用。 JOIZがない場合、サーボモーター付属のサーボホーンにストローを繋げるなどで代用可能)
    • サーボモーターの土台(JOIZを利用。JOIZがない場合、適当な空き箱)
  • トミカ(今回は2018年発売のトミカ No.85 三菱ふそう スーパーグレート)
  • 磁石

vivitelaeti.hatenablog.com

2.組み立て方

全体の繋ぎ方

電源→micro:bit→モーター→ETCゲートのバーと繋いでいます。ただし、置く順番としてはLEDの表示が見えやすいように、micro:bitを手前(写真右手=ミニカー侵入口側)に持ってきています。

サーボモーターとETCゲートのバー

サーボモーターには、付属のサーボホーンの代わりに、JOIZの細長いブロック1つを繋いでいます(繋ぐ角度は、makecodeで0度に設定したときにクローズ状態すなわち地面と水平になるように調節しています)。
JOIZの穴の大きさが偶々合うのですが、サーボホーンのように穴に細かいギザギザがないため1、繋いだ状態でブロックに少し負荷をかけると外れます。変に負荷に耐えたりしないので、今の所破損などはないようですが、メーカーでこのような繋ぎ方が想定されているわけでは全くないため、不具合が出ない保証はありません。

micro:bitサーボモータ

micro:bitサーボモーターは、makecodeのシミュレーターで出てくる方法で繋いでいますが、サーボモーターのデータシートで要求される電圧未満となります。これでも新品の電池などでは動きますが、電池の容量が低下すると、安定しないことがあります。本来は、モジュールを使うなどしてサーボモーターに十分な電圧を供給する方が安定します。

サーボモーターの土台

サーボモーターの土台は、JOIZのブロックのうち、丸が3個繋がったものを2つ両側に置き、その間を、丸が2個繋がったもの5つで繋いでいます。これも偶々サーボモーターの突起部分が片方の丸3個ブロックの凹の隙間に入り込み(写真左手)、もう片方が丸3個ブロックの凸にあたり(写真右手)、これでおおよそ固定されるようです。

ミニカー

ミニカーには小さい磁石を積んでいますが、小さいお子さんなど誤飲に注意が必要です。

3.プログラム

オープンとクローズ

ETCゲートをオープン・クローズする部分です。モードや遠隔操作方法によって、幾つかのブロックからオープン・クローズするため、関数にしています。

関数の中でサーボモーターを動かす方法としては、「入出力端子」>「サーボ 出力する 端子○ 角度○」ブロックを使って、オープンの角度は90度、クローズの角度は0度としています。単に角度のところにその数値を入力するだけでは、一瞬でゲートがその角度まで動いてしまうため、「ループ」>「変数○を0〜○にかけて繰り返す」を使って、1度ずつ動くようにしています。

また、ゲートが開いているのにオープン、閉じているのにクローズ、という意味のない呼び出しがなされた場合には、不要な動作をしないように、「ゲート」変数でフラグを立てています。

モード切替え

ETCを模すというところからは離れますが、磁力で開閉する自動モードの他に、遠隔操作して動かす手動モードも選択できるようにしています。

切替えそのときの状態が自動と手動のいずれか、区別できるようにしておくため、「オート」変数(0: 手動、1: 自動)でフラグを立てています。 本体のボタン(A+B)で、自動モードと手動モードの切替えを可能にしています。

自動モード

自動モードでは、磁石を積んだミニカーがETCゲートに近づいたときだけ開くようにする(普通のミニカーでは開かないようにする)ため、磁力センサーで磁石の接近による磁力の変化を探知しています。「入力」>「その他」>「磁力(μT)」のブロックを使い、X方向(左右方向)の磁力の絶対値を導いてそれが閾値を上回れば、オープン関数を呼びだしています。

手動モード(ボタン)

本体のA・Bボタンにそれぞれオープン・クローズ関数を割り当てています。

手動モード(標準の無線機能)

本体のボタンだけではなく、遠隔操作もやってみたくなります。
micro:bitを遠隔操作する方法は幾つかあり、標準の無線機能(Radioradio - micro:bit runtime)を用いて、他のmicro:bitから操作することが一番簡単です。

手動モード(Bluetooth

今回は、Bluetoothにより、スマホと接続してスマホアプリからの操作を試してみました。micro:bit v2のプロトコルは、Bluetooth 5.1 with Bluetooth Low Energy(BLE)となります(Hardware)。

micro:bitで、Bluetooth接続を使うためには、次の①②の事前準備を行います。

①No Paring Required

MakeCode Editorの右上の歯車>「プロジェクトの設定」をクリックすると表示される1番上のトグルボタン(No Paring Required)をオンにすることで、ペアリングを不要にすることができます。

この設定をスキップしても、実際に使用する際、スマホとのペアリングを行えばBluetoothを使うことはできます。(A+Bを押し続けたまま、リセットボタンをオンオフして待つ。Pairing via Bluetooth : Help & Support)。

Bluetooth拡張機能の追加

右上の歯車又は左側のメニューから「拡張機能」をクリックし、"Bluetooth"と検索すると、最初に以下の拡張機能が表示されるため、クリックします。

クリックすると、標準の無線機能(radio)を削除する必要があるとのメッセージが出ます 2 。これは、標準の無線機能(radio)もBluetoothも、同じオンボードの2.4GHz帯を使っているためのようです。

micro:bitのコードでは、「最初だけ」ブロックの中で、BluetoothUARTサービスをオンにしておきます。
micro:bitで利用可能なBluetoothのサービスは、センサーの数値などを取得できる特定のサービスと、汎用的なUARTサービスに分かれるところ、今回はスマホアプリから送る文字に応じてETCゲートをオープン・クローズすることを目的とするため、UARTサービスを使っています。

なお、特定のサービスとUARTサービスという分類は、ものものテックさんのウェブサイト(micro:bitで初めてのBLE通信)を参考にしています。このウェブサイトは分かりやすく、また、WebBluetoothを使った多様な作例の紹介もあります。 また、microbit.orgのサポートにも簡単な例が載っています(micro:bit Bluetooth Low Energy serial UART : Help & Support)。

その上で、「Bluetooth データを受信したとき 区切り文字(改行コード)」ブロック内で、「Bluetooth UART次のいずれかの文字の手前まで読み取る(改行コード)」にて、スマホからのデータを読み取っています。
データを変数に格納して、それが"o"であればオープン、"c"であればクローズしています。(途中で文字列を操作しているのは、そのままのデータでは、末尾に余分な文字列が含まれているのか、条件分岐がうまく働かないためです)。

スマホアプリは、Serial Bluetooth Terminalを使っています(Kai Morich's Android Apps)。"o"や"c"の文字を入力して送信するとmicro:bitを通じて、ミニETCゲートを遠隔操作できます。

手動モード(モバイルアプリ)

micro:bitには公式のモバイルアプリ(iOS版/android版)があり、micro:bitとBLEで接続して、プログラムを書き込むことができます。また、iOS版は、micro:bitから情報を受け取ったり、反対に情報を送って操作するためのインターフェースも備えています(monitor&control。Guide to mobile apps | micro:bit

このmonitor&controlには幾つか機能がありますが、そのうちgamepadは2つの十字キーを利用でき、ロボットなどの操作に便利そうです。

今回は、ゲートの上げ下げだけなので、本当は複数ボタンは必要ないのですが。昨年gamepadの利用方法が変わり、「高度なブロック」>「制御」>「イベントが届いたとき」ブロックを使う仕様になったことを、さとやまノート(マイクロビットを使ってみる 〜マイクロビットをスマホでコントロール 2 | さとやまノート)で知り、使ってみたくなりました。

monitor&controlは、BLEイベントサービスの一つであり、詳しい仕様はこちらに記載があります。micro:bit側はBLEを使えるようにしておく必要があります。

monitor&controlからの受信は「イベントが届いたとき」ブロックの発生源をMES_DPAD_CONTROLLER_IDにして、ボタン毎のイベント値で条件分岐しています。一目瞭然ですが、上ボタンを押す(イベントの値: 1)とオープン、下ボタンを押す(イベントの値: 3)とクローズするように設定しています。

条件分岐の箇所で使っているイベントの値ですが、microbit-dalのソースコードのうちMESEvents.hにて定義されています。

#define MES_DPAD_BUTTON_A_DOWN              1
#define MES_DPAD_BUTTON_A_UP                2
#define MES_DPAD_BUTTON_B_DOWN              3
#define MES_DPAD_BUTTON_B_UP                4
#define MES_DPAD_BUTTON_C_DOWN              5
#define MES_DPAD_BUTTON_C_UP                6
#define MES_DPAD_BUTTON_D_DOWN              7
#define MES_DPAD_BUTTON_D_UP                8
#define MES_DPAD_BUTTON_1_DOWN              9
#define MES_DPAD_BUTTON_1_UP                10
#define MES_DPAD_BUTTON_2_DOWN              11
#define MES_DPAD_BUTTON_2_UP                12
#define MES_DPAD_BUTTON_3_DOWN              13
#define MES_DPAD_BUTTON_3_UP                14
#define MES_DPAD_BUTTON_4_DOWN              15
#define MES_DPAD_BUTTON_4_UP                16

条件分岐の箇所では、上記を参照して数値を入力する代わりに、「高度なブロック」>「制御」>「…その他」>「MICROBIT_EVT_ANY」のブロックを取り出し、このブロックの右端▼から「MES_DPAD_BUTTON_UP」等を選ぶ方法も可能であり、こちらの方がコードを見てgamepadのどのボタンに対応した操作なのか一見してわかりやすいです。
もっとも、gamepadの特定のボタンではなく、いずれかのボタンをDOWN/UPしたときにある動作をする、というプログラムを考えると、上記の数値の規則性、DOWNは奇数、UPは奇数、を理解しておいた方が、条件分岐を簡潔に書けるメリットはありそうです。
例えば、前後左右に動くロボットをgamepadをリモコンにして動かすとき、いずれかのボタンUPでロボットの動作を止めるとしたいときには、「イベントの値を2で割ったあまり=0なら」(イベントの値が偶数ならば)という条件分岐だけで処理できそうです。

注意事項

JOIZとサーボモーターの組み合わせはメーカーが想定したものでは当然なく、相互に破損のおそれがあります。また、磁気センサー探知のため、小さい磁石を使用していますが、小さい磁石については誤飲事故が報告されています。

編集履歴

2022/07/14 高度なブロック」>「制御」>「…その他」>「MICROBIT_EVT_ANY」のブロックの利用方法について加筆


  1. このSG-90のギザギザを含めて、サーボホーンの3Dプリンタ用のデータを公開している方がいます(【SG-90サーボモーター】サーボホーンの歯を3Dプリンタで再現出来るってすごいですね! | ぶらり@web走り書き)。これを元に、サーボモーターとしっかり噛み合う部品を自作することもできそうです。が、CADの使い方も知らないため(Tinker CADを少し触っている程度)、私にはハードルが高いです。

  2. 標準の無線機能に戻したい場合、拡張機能で"radio"を検索してクリックすると、今度はBluetoothを削除するメッセージが出ますので先に進むと、標準の無線機能に戻すことができます。