Introduction: [2021] マイクロビット2個を使いラジコンカーを走らせよう!

About: スクール・クラブ活動に関わる皆様に楽しい教材を設計しています。自己学習と協力体験の両面から楽しさを追求します。

ヴァレンタ・オフローダー は マイクロビットで操作できるラジコンカーです。レゴ・テクニックの部品と互換性があります。後輪に2つのギアモーターがあり、車体前方にマイクロサーボを使用しロベルヴァル・メカニズム (機構) を用いて前輪のステアリングを操作します。

今回のプロジェクトでは、2個のマイクロビットを準備し、一方を送信機、もう一方を受信機としてラジコンカーに搭載して操作してみたいと思います。マイクロソフト社のMakeCodeエディターを使用してコーディングしてゆきます。難しいと感じる方の為にもサンプルコードをダウンロードできる様に用意していますのでご安心ください。

今回のプロジェクトでは、送信側のマイクロビットに搭載される加速度センサーを用いて前後左右に車を走らせたり、ステアリング調整やLED点灯、オプション装備のウィンチを巻いてみたり、と様々な機能をコーディングしてみたいと思います。

Supplies

今回のプロジェクトを始める前にヴァレンタ・オフローダーを組み立ててアプリを設定する必要があります。以下のプロジェクトを事前に確認してください。

ヴァレンタ・オフローダーを組み立てよう

チュートリアル

ビデオ

ヴァレンタ・オフローダーには別途、micro:bit (1個)、単3電池 (4本) を使用します。はんだ付けしたり接着や塗装などの作業は必要ありません。ブロックの様にパチッと部品を取り付けて組み立てることができます。ヴァレンタ・オフローダーは英国 4Tronix 社と、Hummingworks 合同会社のパートナーシップにより共同開発いたしました。

The tutorial in English is available!

Step 1: サンプルコードをダウンロードしましょう

このチュートリアル内では、マイクロソフト社 MakeCode エディターにて作成した micro:bit 用のサンプルコードを使用します。さっそくダウンロードしてみましょう。全てプログラミング済みですのですぐに遊べます。後のステップでサンプルコードの解説をします。サンプルコードが理解出来たら新しいコーディングに挑戦してみてください!

このステップ内にあるサンプルコードをお手元のコンピューターにダウンロードしてください。コンピューターと micro:bit を USB ケーブルで接続してファイルをドラッグアンドドロップして書き込んでください。

先ず Transmitter.hex サンプルファイル を送信側のマイクロビットに書き込みます。サンプルコードを書き込みましたか?送信側のマイクロビットに電池ボックスを取り付ける事で給電されます。

次に Receiver.hex サンプルファイル を受信側のマイクロビットに書き込みます。サンプルコードを書き込みましたか?受信側のマイクロビットを車(ヴァレンタ・オフローダー)に搭載してモーターコントローラーの電源をONにしましょう!

送信側のマイクロビットと受信側のマイクロビット両方の電源をONにするとすぐに遊ぶことができます。送信側のマイクロビットを前後左右に傾けてください。加速度センサーが反応して、受信側のマイクロビットを搭載する車が前後左右に走り出します。

もし車の舵 (ステアリング) が真っすぐでない場合、送信側のマイクロビットのボタンAまたはBを複数回押してみてください。 ステアリングがに右傾いていたら、ボタンAを押して左に修正できます。 ステアリングが左に傾いていたら、ボタンBを押して右に修正できます。

車にウィンチがオプション装備されている場合、送信側のマイクロビットのボタンA、Bを同時に押すと、ウィンチの紐が緩んだり巻かれたりします。複数回ボタンA、Bを同時に押して試してみてください。

Step 2: ウィンチを取り付けましょう

もし車がウィンチ機構をオプション装備している場合、モーターコントローラーに接続する事で一層楽しむことができます。

ウィンチ機構は360度の連続回転サーボを使用しており、モーターコントローラーのP1ピンに接続する事で紐を巻いたり緩めて伸ばしたりできます。主にオフロード走行する車の前部に取り付け、紐を巻くことにより悪路や急斜面を走破します。

このチュートリアルで使用するヴァレンタ・オフローダーはDRV8833チップを搭載するモーターコントローラーを使用しており、2つのDCモーター、4つの入出力ピン (P0, P1, P2, P8) を操作できます。各ピンは3本で構成され、信号を送るシグナル線 (黄)、ボルト (赤)、グランド (黒) で構成されます。 4つの入出力ピンはスイッチにより3.3Vまたは5Vを選択可能ですので、サーボを使用する場合は5Vを選択します。

Step 3: Transmitter.hex サンプルファイルを確認しましょう

では Transmitter.hex サンプルファイルを確認してゆきましょう。MakeCodeエディターを開き Import ボタンをクリックします。送信側のマイクロビット内に保存されている Transmitter.hex サンプルファイルを選択して開きます。

on start block

このブロックはプログラム起動時に1度だけ呼び出されるブロックです。

radio set group 1

Radio 拡張機能から radio set group 1 ブロックをドラッグアンドドロップして 1 に設定します。数字は任意で構いませんが、受信側のマイクロビットと送信側のマイクロビットを同じ数字に設定しないと双方向通信できませんのでご注意下さい。

ここでは、送信側のマイクロビットに搭載される Accelerometer 加速度センサーを活用した車の送信機をコーディングしてみようと思います。送信側のマイクロビットを前に傾ける (on logo down) と車が前進する、後ろに傾ける (on logo up) と車が後進する、左に傾ける (on tilt left) と車が左折する、右に傾ける (on tilt right) と車が右折する、という様にセンサーを活用したいと思います。このセンサーに応じて、前進時に goForward 文字列、後進時に goBackward 文字列、左折時に goLeft 文字列、右折時に goRight 文字列を受信側のマイクロビットに送信して車が反応する様にコーディングしてゆきたいと思います。

on logo down block

radio send string "goForward"

Input 拡張機能から on logo down ブロックをドラッグアンドドロップします。このブロック内に radio send string "goForward" ブロックをドラッグアンドドロップします。 送信側のマイクロビットを前に傾ける (on logo down) と goForward 文字列を受信側のマイクロビットに送信して車が前進する様にコードを作成します。

on logo up block

radio send string "goBackward"

Input 拡張機能から on logo up ブロックをドラッグアンドドロップします。このブロック内に radio send string "goBackward" ブロックをドラッグアンドドロップします。 送信側のマイクロビットを後ろに傾ける (on logo up) と goBackward 文字列を受信側のマイクロビットに送信して車が後進する様にコードを作成します。

on tilt left block

radio send string "goLeft"

Input 拡張機能から on tilt left ブロックをドラッグアンドドロップします。このブロック内に radio send string "goLeft" ブロックをドラッグアンドドロップします。 送信側のマイクロビットを左に傾ける (on tilt left) と goLeft 文字列を受信側のマイクロビットに送信して車が左折する様にコードを作成します。

on tilt right block

radio send string "goRight"

Input 拡張機能から on tilt right ブロックをドラッグアンドドロップします。このブロック内に radio send string "goRight" ブロックをドラッグアンドドロップします。 送信側のマイクロビットを右に傾ける (on tilt right) と goRight 文字列を受信側のマイクロビットに送信して車が右折する様にコードを作成します。

初期の段階では、車の操舵に使用するステアリング用のサーボは車が直進できる様に真っすぐに必ずしも向いていません。その場合、送信側のマイクロビットのボタンAまたはBを押してステアリングを修正できる様にします。

on button A pressed block

radio send string "calibrateLeft"

Input 拡張機能から on button A pressed ブロックをドラッグアンドドロップします。このブロック内に radio send string "calibrateLeft" ブロックをドラッグアンドドロップします。送信側のマイクロビットのボタンAを押す (on button A pressed) と calibrateLeft 文字列を受信側のマイクロビットに送信します。車のステアリングが右に傾きすぎていた場合、ボタンAを一回押すとステアリングを+2度左に修正します。ボタンAを必要な回数押してください。

on button B pressed block

radio send string "calibrateRight"

Input 拡張機能から on button B pressed ブロックをドラッグアンドドロップします。このブロック内に radio send string "calibrateRight" ブロックをドラッグアンドドロップします。送信側のマイクロビットのボタンBを押す (on button B pressed) と calibrateRight 文字列を受信側のマイクロビットに送信します。車のステアリングが左に傾きすぎていた場合、ボタンBを一回押すとステアリングを-2度右に修正します。ボタンBを必要な回数押してください。

on button A+B pressed block

radio send string "wind"

Input 拡張機能から on button A+B pressed ブロックをドラッグアンドドロップします。このブロック内に radio send string "wind" ブロックをドラッグアンドドロップします。送信側のマイクロビットのボタンAとBを同時に押す (on button A+B pressed) と wind 文字列を受信側のマイクロビットに送信します。受信側のマイクロビットは文字列を受信するたびにウィンチ機構のウィンチを巻く、止める、反対に巻く、止めるを繰り返します。

Step 4: MakeCode エディター内に拡張機能を追加しましょう

現在使用しているMakeCodeエディター内に Servos 拡張機能、Neopixel 拡張機能は追加されていますか?エディター左のメニュー内にこれらの拡張機能が追加されているか確認してください。これらの拡張機能は以降のステップで使用します。

もしこれらの拡張機能が追加されていない場合は、メニュー下部の Extensions をクリックします。次の画面で ServosNeopixel の拡張機能が表示されたら、一つづつクリックして追加して下さい。

Servos 拡張機能は、車の操舵 (ステアリング) を調整するために使用するブロックが含まれています。

Neopixel 拡張機能は、モーターコントローラー基板上の4つのLEDを点灯させるのに使用するブロックが含まれてします。

Step 5: Receiver.hex サンプルファイルを確認しましょう (パート1)

では Receiver.hex サンプルファイルを確認してゆきましょう。MakeCodeエディターを開き Import ボタンをクリックします。受信側のマイクロビット内に保存されている Receiver.hex サンプルファイルを選択して開きます。

on start block

このブロックはプログラム起動時に1度だけ呼び出されるブロックです。

radio set group 1

Radio 拡張機能から radio set group 1 ブロックをドラッグアンドドロップして 1 に設定します。数字は任意で構いませんが、受信側のマイクロビットと送信側のマイクロビットを同じ数字に設定しないと双方向通信できませんのでご注意下さい。

ここでは、車の操舵に使うステアリング用のサーボをP2ピンで操作し、可動範囲を 0から180度に設定し、中央角度を90度に設定する事にします。

set center to 90

Variable 拡張機能内に center 変数を作成します。この変数の中に車の操舵に使うステアリング用のサーボの中央角度を保持させます。中央角度を 90 度に設定しておきましょう。

set servo P2 range from 0 to 180

Servos 拡張機能から set servo P2 range from 0 to 180 をドラッグアンドドロップします。ステアリングに使用するサーボをP2ピンで操作しているので、P2を選択し、可動範囲を 0 から180 度に設定しましょう。

set servo P2 angle to center

Servos 拡張機能から set servo P2 angle to center をドラッグアンドドロップします。center 変数に指定されている事を確認してください。

set LED RGB to NeoPixel at pin P16 with 4 leds as RGB

Neopixel 拡張機能から set strip to NeoPixel at pin P0 with 24 leds as RGB ブロックをドラッグアンドドロップします。strip 変数名を変更して LED RGB にしましょう。モーターコントローラーはP16ピンを使用して基板上の4つのRGB LEDを光らせています。よってP16、4 ledsを選択しましょう。ブロックは set LED RGB to NeoPixel at pin P16 with 4 leds as RGB の様に修正されています。

set winch to 0

Variable 拡張機能内に winch 変数を作成します。これは2つの値のいずれかの状態を維持するブーリアン型のデータで、0または1、オフまたはオンの状態を管理するために使用します。初期設定は 0 (オフ) にします。

set UP to 0

Variable 拡張機能内に UP 変数を作成します。これも2つの値のいずれかの状態を維持するブーリアン型のデータで、0または1、紐を伸ばすまたは巻き戻す動作を管理するために使用します。初期設定は 0 (紐を伸ばす動作) にします。

Step 6: Receiver.hex サンプルファイルを確認しましょう (パート2)

車の進行方向とスピードを定義するブロックについて見てゆきましょう。左後輪にM1モーター、右後輪にM2モーターが接続されています。

function goForward block

Functions 拡張機能内に goForward 関数を作成します。

digital write pin P13 to 0

P13ピンはM1モーターの進行方向を定義します。Pins 拡張機能から digital write pin P13 to 0 をドラッグアンドドロップして作成します。0 の値を選択する事でM1モーターは前進します。

digital write pin P15 to 0

P15ピンはM2モーターの進行方向を定義します。Pins 拡張機能から digital write pin P15 to 0 をドラッグアンドドロップして作成します。0 の値を選択する事でM2モーターは前進します。

analog write pin P12 to 1023

P12ピンはM1モーターのスピードを定義します。Pins 拡張機能から analog write pin P12 to 1023 をドラッグアンドドロップして作成します。1023 の値を選択する事でM1モーターは全速力のスピードで前進します。

analog write pin P14 to 1023

P14ピンはM2モーターのスピードを定義します。Pins 拡張機能から analog write pin P14 to 1023 をドラッグアンドドロップして作成します。1023 の値を選択する事でM2モーターは全速力のスピードで前進します。

pause (ms) 1000

Basic 拡張機能から pause (ms) 1000 ブロックをドラッグアンドドロップします。車が前進する状態を 1000ミリ秒 (1秒) 維持します。

call stop

Functions 拡張機能から call stop ブロックをドラッグアンドドロップします。1秒前進した後に車を停止するためにこのブロックを呼び出します。

function goBackward block

Functions 拡張機能内に goBackward 関数を作成します。

digital write pin P12 to 0

P12ピンはM1モーターの進行方向を定義します。Pins 拡張機能から digital write pin P12 to 0 をドラッグアンドドロップして作成します。0 の値を選択する事でM1モーターは後進します。

digital write pin P14 to 0

P14ピンはM2モーターの進行方向を定義します。Pins 拡張機能から digital write pin P14 to 0 をドラッグアンドドロップして作成します。0 の値を選択する事でM2モーターは後進します。

analog write pin P13 to 1023

P13ピンはM1モーターのスピードを定義します。Pins 拡張機能から analog write pin P13 to 1023 をドラッグアンドドロップして作成します。1023 の値を選択する事でM1モーターは全速力のスピードで後進します。

analog write pin P15 to 1023

P15ピンはM2モーターのスピードを定義します。Pins 拡張機能から analog write pin P15 to 1023 をドラッグアンドドロップして作成します。1023 の値を選択する事でM2モーターは全速力のスピードで後進します。

pause (ms) 1000

Basic 拡張機能から pause (ms) 1000 ブロックをドラッグアンドドロップします。車が後進する状態を 1000ミリ秒 (1秒) 維持します。

call stop

Functions 拡張機能から call stop ブロックをドラッグアンドドロップします。1秒後進した後に車を停止するためにこのブロックを呼び出します。

function stop block

Functions 拡張機能内に stop 関数を作成します。

digital write pin P13 to 0

P13ピンはM1モーターの進行方向を定義します。Pins 拡張機能から digital write pin P13 to 0 をドラッグアンドドロップして作成します。0 の値を選択する事でM1モーターは前進します。

digital write pin P15 to 0

P15ピンはM2モーターの進行方向を定義します。Pins 拡張機能から digital write pin P15 to 0 をドラッグアンドドロップして作成します。0 の値を選択する事でM2モーターは前進します。

analog write pin P12 to 0

P12ピンはM1モーターのスピードを定義します。Pins 拡張機能から analog write pin P12 to 0 をドラッグアンドドロップして作成します。0 の値を選択する事でM1モーターは停止します。

analog write pin P14 to 0

P14ピンはM2モーターのスピードを定義します。Pins 拡張機能から analog write pin P14 to 0 をドラッグアンドドロップして作成します。0 の値を選択する事でM2モーターは停止します。

set servo P2 angle to center

Servos 拡張機能から set servo P2 angle to center ブロックをドラッグアンドドロップします。center 変数に指定されている事を確認してください。車が毎回停止した際にステアリングが真っすぐに向くためのブロックです。

Step 7: Receiver.hex サンプルファイルを確認しましょう (パート3)

前回のステップで Variable 拡張機能内に winch 変数を作成しました。これは2つの値のいずれかの状態を維持するブーリアン型のデータで、0または1、オフまたはオンの状態を管理するために使用します。Logic 拡張機能から if then ブロックを使用します。+ サインをクリックして必要数の条件分岐を作成します。ブーリアン型データの winch 変数と共にウィンチ機構をオン、オフにする様に条件分岐します。

更に Variable 拡張機能内に UP 変数を作成します。これも2つの値のいずれかの状態を維持するブーリアン型のデータで、0または1、紐を伸ばすまたは巻き戻す動作を管理するために使用します。Logic 拡張機能から if then ブロックを使用します。+ サインをクリックして必要数の条件分岐を作成します。ブーリアン型データの UP 変数と共にウィンチの紐を巻く、巻き戻すといった動作に条件分岐します。

function wind block

Functions 拡張機能内に wind 関数を作成します。

if winch = 0 then

set winch to 1

LED RGB show color white

もし winch 変数が 0 の場合、ウィンチ機構はオフ状態なので set winch to 1 と修正して winch 変数を 1 にしてオン状態にします。Neopixel 拡張機能から strip show color red ブロックをドラッグアンドドロップして、strip 変数を以前のステップで作成した LED RGB 変数に変更します。ここで任意の色も選択しましょう。よってブロックは LED RGB show color white の様になっているかと思います。

if UP = 0

set UP to 1

continuous servo P1 run at 50%

else if UP = 1

set UP = 0

continuous servo P1 run at -50%

入れ子ブロックとして条件分岐を作成します。もし UP 変数が 0 の場合、ウィンチの紐を巻き戻す動作を選択しているので set UP to 1 と修正して UP 変数を 1 にして紐を伸ばします。Servos 拡張機能から continuous servo P1 run at 50% ブロックをドラッグアンドドロップします。もしウィンチのスピードを速めたい場合は100%に設定してみてください。ウィンチに使用するサーボはP1ピンに接続されている事も確認してください。

もし UP 変数が 1 の場合、ウィンチの紐を伸ばす動作を選択しているので set UP to 0 と修正して UP 変数を 0 にして紐を巻き戻します。Servos 拡張機能から continuous servo P1 run at -50% ブロックをドラッグアンドドロップします。もしウィンチのスピードを速めたい場合は-100%に設定してみてください。ウィンチに使用するサーボはP1ピンに接続されている事も確認してください。

if winch = 1 then

set winch to 0

LED RGB show color black

stop servo P1

もし winch 変数が 1 の場合、ウィンチ機構はオン状態なので set winch to 0 と修正して winch 変数を 0 にしてオフ状態にします。Neopixel 拡張機能から strip show color red ブロックをドラッグアンドドロップして、strip 変数を以前のステップで作成した LED RGB 変数に変更します。ここで黒色 (消灯を意味します) を選択しましょう。よってブロックは LED RGB show color black になっていると思います。Servos 拡張機能から stop servo P1 ブロックをドラッグアンドドロップします。これでウィンチ機構は停止します。

Step 8: Receiver.hex サンプルファイルを確認しましょう (パート4)

送信側のマイクロビットから送られてきた文字列を受信側のマイクロビットが受け取った時、文字列の内容に基づいて条件分岐されて関数を実施します。

on radio received receivedString block

Radio 拡張機能内にある on radio received receivedString ブロックを使用します。Logic 拡張機能内にある if then ブロックも使用します。+ サインを複数回クリックして必要な分の条件分岐を作成してください。

if receivedString = calibrateLeft then

set center to center + 2

set servo P2 angle to center

受け取った文字列が calibrateLeft の場合、Variable 拡張機能から set center to ブロックをドラッグアンドドロップして set center to center + 2 に修正します。これはステアリング (操舵) のセンター (中央) を左に+2度修正するためのコードです。Servos 拡張機能から set servo P2 angle to ブロックをドラッグアンドドロップしてset servo P2 angle to center に修正します。これで P2 ピンに接続するサーボのステアリングセンターを左に+2度修正できました。

if receivedString = calibrateRight then

set center to center - 2

set servo P2 angle to center

受け取った文字列が calibrateRight の場合、Variable 拡張機能から set center to ブロックをドラッグアンドドロップして set center to center - 2 に修正します。これはステアリング (操舵) のセンター (中央) を右に-2度修正するためのコードです。Servos 拡張機能から set servo P2 angle to ブロックをドラッグアンドドロップしてset servo P2 angle to center に修正します。これで P2 ピンに接続するサーボのステアリングセンターを右に-2度修正できました。

else if receivedString = goForward then

call goForward

受け取った文字列が goForward の場合、Functions 拡張機能から call goForward ブロックを呼びだすためにドラッグアンドドロップします。

else if receivedString = goBackward then

call goBackward

受け取った文字列が goBackward の場合、Functions 拡張機能から call goBackward ブロックを呼びだすためにドラッグアンドドロップします。

else if receivedString = goLeft then

set servo P2 angle to center + 10

call goForward

受け取った文字列が goLeft の場合、Servos 拡張機能から set servo P2 angle to ブロックをドラッグアンドドロップします。Math 拡張機能から括弧ブロックを使用して center + 10 ブロックを作成し、set servo P2 angle to center + 10 ブロックに修正します。これで P2 ピンに接続するサーボを左に10度舵を切って左折できる様になりました。次に Functions 拡張機能から call goForward ブロックを呼びだすためにドラッグアンドドロップします。これで車が左折しながら前進する一連の動作ができました。

else if receivedString = goRight then

set servo P2 angle to center - 10

call goForward

受け取った文字列が goRight の場合、Servos 拡張機能から set servo P2 angle to ブロックをドラッグアンドドロップします。Math 拡張機能から括弧ブロックを使用して center - 10 ブロックを作成し、set servo P2 angle to center - 10 ブロックに修正します。これで P2 ピンに接続するサーボを右に10度舵を切って右折できる様になりました。次に Functions 拡張機能から call goForward ブロックを呼びだすためにドラッグアンドドロップします。これで車が右折しながら前進する一連の動作ができました。

else if receivedString = wind then

call wind

受け取った文字列が wind の場合、Functions 拡張機能から call wind ブロックを呼びだすためにドラッグアンドドロップします。

これで一通り、Receiver.hex サンプルファイルを確認できました!このチュートリアルを基に色々とカスタマイズしてみてください。