IoT デバイス

Jasmine Tea から Bluetooth を使って IoT デバイスを制御するプログラムを作ることができます。現在は、以下の 2 つの IoT デバイスを制御することができます。

  • micro:bit
  • ココロキット

ここでは、Jasmine Tea からそれらの IoT デバイスを制御するための準備やプログラミング手順について紹介します。

micro:bit

micro:bit(マイクロビット)とは、イギリスのBBC(英国放送協会)が主体となって作った教育向けマイコンボードです。micro:bitには、LED、センサー、ボタンなどが備わっていているだけでなく、入出力ピンを使って電子工作によりロボットを作ることも可能です。

micro:bit側の準備

Jasmine Teaとmicro:bitは、Bluetoothを使って通信を行います。そのため、各種 Bluetooth サービスを有効にしたプログラムを予めmicro:bitに書き込んでください。書き込むプログラムは、以下から開くことができます。

https://makecode.microbit.org/S69889-25343-54060-24794

または、MakeCode のプロジェクトにBluetooth 拡張機能を追加して、以下のようにブロックを作ってmicro:bitに書き込みを行ってください。

iot-1

micro:bitとの動作確認

最初に、Jasmine Teaからmicro:bitを制御できるかどうかを確かめましょう。Google Chrome または Microsoft Edge ウェブブラウザを開いて、以下にアクセスしてください。

https://jasminetea.app/studio/projects/DTLbCTo3jck416Z7Qube

次に、micro:bitの電源を入れます。以下のようにLEDが「×」になっていることを確認してください。

iot-2

Jasmine Teaにて、プログラムを実行します。すると、ウェブブラウザから接続するmicro:bitを選択するポップアップが表示されますので、選択して「ペアリング」ボタンを押してください。

iot-3

両手でmicro:bitを以下のように持ってください。

iot-4

そして、以下の操作を行ってみてください。

  • micro:bitを左に傾けると、Jasmine Teaの実行画面のキャラクターも左に動きます。
  • micro:bitを右に傾けると、実行画面のキャラクターも右方向に動き出します。
  • 両手の人差し指を上に持ち上げてmicro:bitを手前にクイッと動かすジェスチャーを行うことで、実行画面のキャラクターがジャンプします。

ペンギンとぶつからないように、うまく避けてください。

ペアリング

Jasmine Teaのプログラムからmicro:bitに接続したいときは、pair$ 関数を使います。

device_id$ = pair$("microbit")

pair$ 関数を実行すると、ウェブブラウザから接続対象のmicro:bitの選択ポップアップが表示されます。選択されると、Bluetooth のペアリングが行われます。そして、デバイスID(接続されたmicro:bitを識別するための文字列)が戻り値として返されますので、変数に代入しておきます。

プログラムの実行が終了すると、自動的にペアリングは解除されます。もしJasmine Teaのプログラム内から明示的にペアリングを解除したいときは、unpair 命令を使います。

温度センサー

micro:bitの温度センサーから測定値を得たいときは、sensor@ 関数を使います。

device_id$ = pair$("microbit")
pause 500
t@=sensor@(device_id$, "temperature")
temperature=t@[0]
print temperature

sensor@ 関数にデバイスIDと "temperature" 文字列を渡すことで、測定値を得ることができます。sensor@ 関数の戻り値は配列ですが、温度の値は最初の要素に入っています。

ペアリングの直後にセンサーから値を読み取ると、測定値が 0 になることがあります。そのため、pause 命令によってプログラムの実行を少しだけ一時停止すると、正しい測定値を得ることができます。

ボタン

micro:bitのLEDの両脇にあるボタンが押されたかどうかを得たいときは、sensor@ 関数を使います。

device_id$ = pair$("microbit")
do
  b@=sensor@(device_id$, "buttons")
  ba = b@[0]
  bb = b@[1]
  locate 0,1
  print "Button A:";ba
  print "Button B:";bb
loop

sensor@ 関数にデバイスIDと "buttons" 文字列を渡すことで、ボタンの押下状況を得ることができます。sensor@ 関数の戻り値は配列です。最初の要素に A ボタン、2つ目の要素に B ボタンの押下状況が入っています。各値は、以下の意味となります。

  • 0 - 押されていない。
  • 1 - 押されている。
  • 2 - 押し続けている。

加速度

micro:bitに備わっている加速度センサーから測定値を得たいときは、sensor@ 関数を使います。

device_id$ = pair$("microbit")
do
  a@=sensor@(device_id$, "accelerometer")
  x = a@[0]
  y = a@[1]
  z = a@[2]
  locate 0,1
  print "X Axis:";x;"   "
  print "Y Axis:";y;"   "
  print "Z Axis:";z;"   "
loop

sensor@ 関数にデバイスIDと "accelerometer" 文字列を渡すことで、加速度センサーからの測定値を得ることができます。sensor@ 関数の戻り値は配列です。最初の要素に X 軸、2つ目の要素に Y 軸、3つ目の要素に Z 軸の測定値が入っています。

micro:bitを持って傾けたり上下に動かしたりすると、各軸の値が変化します。その変化量を使うことで、micro:bitをゲームのコントローラーとして機能させることなどができます。

磁気計

micro:bitに備わっている磁気センサーから測定値を得たいときは、sensor@ 関数を使います。

device_id$ = pair$("microbit")
do
  m@=sensor@(device_id$, "magnetometer")
  x = m@[0]
  y = m@[1]
  z = m@[2]
  locate 0,1
  print "X Axis:";x;"   "
  print "Y Axis:";y;"   "
  print "Z Axis:";z;"   "
loop

sensor@ 関数にデバイスIDと "magnetometer" 文字列を渡すことで、磁気センサーからの測定値を得ることができます。sensor@ 関数の戻り値は配列です。最初の要素に X 軸、2つ目の要素に Y 軸、3つ目の要素に Z 軸の測定値が入っています。

この3軸の値を使って、方角を計算することができます。

LED

micro:bitには横5個、縦5個の合計25個のLEDが搭載されています。LEDを一つごとに点灯させたり消灯させたりしたいときは、led 命令を使います。

device_id$=pair$("microbit")
for i=0 to 24
  if i%2=0 then
    led device_id$,i,1
  else
    led device_id$,i,0
  end if
next

LEDは、左上から右下に向かって横方向の順に 0 から 24 まで番号が振られています。led 命令にデバイスID、LEDの番号、そして点灯させるかどうかを示す数字を指定することで、LEDを点灯させたり消灯させたりすることができます。点灯させるかどうかは、以下の数字を指定します。

  • 点灯させるとき - 1 以上の数
  • 消灯させるとき - 0

ココロキット

ユカイ工学株式会社により販売されている ココロキットココロキット+ は、小学生からロボットづくりができる拡張キットです。自分で作ったロボットを自分のプログラムで動かすことができ、楽しくプログラミングを学ぶことができます。

ここでは、Jasmine Teaからココロキットおよびココロキット+を制御するための方法を紹介します。

動作確認

最初に、Jasmine Teaからココロキットまたはココロキット+を制御できるかどうかを確かめましょう。Google ChromeまたはMicrosoft Edge ウェブブラウザを開いて、以下にアクセスしてください。

次に、ココロキットまたはココロキット+の電源を入れます。そして、Jasmine Teaにて、プログラムを実行します。「▶ 実行」と書かれた青いボタンを押してください。すると、ウェブブラウザから接続するココロキットまたはココロキット+を選択するポップアップが表示されますので、選択して「ペアリング」ボタンを押してください。

iot-5

ココロキットまたはココロキット+の LED が赤色、緑色、青色に1秒間隔で点灯した後に消灯します。

ペアリング

Jasmine Teaのプログラムからココロキットまたはココロキット+に接続したいときは、pair$ 関数を使います。

// ココロキットに接続したいとき
device_id$ = pair$("cocorokit")

// ココロキット+に接続したいとき
device_id$ = pair$("cocorokit+")

pair$ 関数を実行すると、ウェブブラウザから接続対象のココロキットまたはココロキット+の選択ポップアップが表示されます。選択されると、Bluetooth のペアリングが行われます。そして、デバイスID(接続されたココロキットまたはココロキット+を識別するための文字列)が戻り値として返されますので、変数に代入しておきます。

プログラムの実行が終了すると、自動的にペアリングは解除されます。もしJasmine Teaのプログラム内から明示的にペアリングを解除したいときは、unpair 命令を使います。

LED

ココロキットまたはココロキット+のLEDを点灯あるいは消灯させたいときは、led 命令を使います。

ココロキットのLEDを制御する際には、以下のようなプログラムとなります。

device_id$=pair$("cocorokit")
for i=1 to 20
  led device_id$,5,random(0,100)
  led device_id$,6,random(0,100)
  led device_id$,7,random(0,100)
  pause 250
next

ココロキット+のLEDを制御する際には、以下のようなプログラムとなります。

device_id$=pair$("cocorokit+")
for i=1 to 20
  led device_id$,0,random(0,100)
  led device_id$,1,random(0,100)
  led device_id$,2,random(0,100)
  pause 250
next

上記のプログラムを実行すると、LED がランダムな色で 250ms 間隔で 20 回点灯を繰り返します。

LEDを制御するときは、led 命令にデバイスID、色の番号、そして明るさを示す数値を指定します。色の番号は、ココロキットおよびココロキット+で以下のように割り当てられています。

ココロキット 5 6 7
ココロキット+ 0 1 2

明るさは、0~100 までの数値を指定します。0 が消灯、100 が最も明るく点灯します。

ピン出力(ココロキット)

ココロキットのピンについて、主にDCモーターを制御する目的で利用する際には、pinpwm 命令を使います。

device_id$=pair$("cocorokit")
for i=0 to 10000 step 100
  pinpwm device_id$,1,i,0
  pinpwm device_id$,2,0,0
  pause 100
next
pinpwm device_id$,1,0,0
pinpwm device_id$,2,0,0

上記のプログラムを実行すると、DCモーターを接続する右側のピン間の電圧を 0V から 3V まで徐々に上げていき、最後に 0V に戻します。

各ピンに対して、pinpwm 命令を使って、PWM の Duty 値を変化させることができます。pinpwm 命令にデバイスID、ピン番号、Duty 値、Period 値を指定しますが、ココロキットでは Period 値は無視されます。ピン番号は、以下のように割り当てられています。

ピン ピン番号
PIO1 1
PIO2 2
PIO3 3
PIO4 4

Duty値は、0 から 10,000 までを指定することができます。0 は 0V(0%)を、10,000 は約 3V(100%)となります。

ピン出力(ココロキット+)

ココロキット+のピンについて、主にサーボモーターを制御する目的で利用する際には、pinpwm 命令を使います。

device_id$=pair$("cocorokit+")
pinpwm device_id$,0,2300,1000
pause 2000
pinpwm device_id$,0,600,0

ココロキット+の1番のピンにサーボモーターを接続して上記のプログラムを実行すると、180度まで比較的ゆっくりと回転し、2秒後に0度まで素早く回転します。

pinpwm 命令にデバイスID、ピン番号、Duty 値、Period 値を指定します。ピン番号は、以下のように割り当てられています。

ピン ピン番号
1番 0
2番 1
3番 2
4番 3

Duty 値は、0 から 65,535 までの数値を指定することができますが、サーボモーターを接続した際には、600 から 2,300 までの数値を指定することでモーターを回すことができます。Period 値によって、モーターを動かす速度を指定することができます。0 が最も速く回転し、5,000 付近でかなり遅く回転します。

pinpwm 命令によってサーボモーターを回転させたときに、回転が終わる前に Jasmine Tea のプログラムは次の行に進みます。そのため、連続してサーボモーターを制御したいときは、pause 命令を使ってプログラムの実行を一定時間停止させると良いでしょう。

Duty 値を角度から求めるときは、以下のように独自関数を定義して利用します。

device_id$=pair$("cocorokit+")
pinpwm device_id$,2,deg_to_value(180),1000
pause 2000
pinpwm device_id$,2,deg_to_value(0),0

function deg_to_value(degree)
  if degree>180 then
    degree=180
  else if degree<0 then
    degree=0
  end if
  if degree=90 then
    value=1450
  else if degree>90 then
    value=1450+((degree-90)*(2300-1450))/90
  else
    value=1450-((90-degree)*(1450-600))/90
  end if
  return value
end function

ピン入力(ココロキット+)

ココロキット+のセンサーピンにスイッチを接続して利用するときは、inpin 関数を使います。

device_id$=pair$("cocorokit+")
do
  s=inpin(device_id$,3)
  locate 0,1
  print "Press:";s
loop

inpin 関数にデバイスID、ピン番号を指定します。ピン番号は、以下のように割り当てられています。

ピン ピン番号
SENSOR1 3
SENSOR2 4

スイッチを押すと、inpin 関数の戻り値は 1 となります。また、スイッチが押されていないときは、inpin 関数の戻り値は 0 となります。