Orange picoとは?

 今回はマイクロビットのシリアル通信機能を使ってOrange pico(オレンジピコ)とデータのやりとりを行ってみます。Orange picoにはいくつもの種類がありますが、今回はOrangino(オレンジーノ)を使います。OranginoはArduinoのシールドも利用できる優れものです。
 Orange picoはこども向け教育用の小型コンピューターです。基本的にマイクロビットやIchigoJamなどと同じカテゴリの商品になります。

・Orange pico
http://www.picosoft.co.jp/orange/index.html

・Orangino
http://www.picosoft.co.jp/Orangino/index.html

 Orange picoはIchigoJamと同様にBASIC(Orange BASIC)でプログラムを作ることができます。IchigoJamのBASICとは違い、浮動小数演算もできますし、標準でグラフィック機能が用意されています。グラフィック画面とテキスト画面は独立しており合成して表示されます。面白いのはタートルグラフィックス機能も用意されていることです。今回は扱いませんが興味ある方は挑戦してみてください。

・LOGO/タートルグラフィックス
https://ja.wikipedia.org/wiki/LOGO

 今回使用するOranginoはテレビとの接続には専用のケーブルが必要です。IchigoJamのように既存のケーブルを使うことはできません。キーボードはUSBキーボードですので、手持ちのキーボードをそのまま使う事ができます。

マイクロビットとOranginoをつなげる

 まず、マイクロビットとOranginoをつなぎます。マイクロビットとOranginoはシリアル通信(UART)を使ってデータの送受信を行います。データの送受信を行うためには3本のケーブルが必要です。ワニ口クリップやジャンパーワイヤーなどを使って以下のようにつなぎます。Oranginoには複数のGND端子がありますが、どこにつないでも構いません。

【マイクロビット側】 【Orangino側】
P0端子 RX1
P1端子 TX1
GND端子 GND

・Oranginoピン配置
http://www.picosoft.co.jp/orange/download/Orangino/OranginoPin.pdf

これで準備完了です。Oranginoの電源は最初に入れておいても後から入れても大丈夫です。
Orangino側はデータを受信して表示するだけなら何もする必要はありません。もちろん、受信したデータを受け取って処理する場合にはプログラムを作成しなければなりません。

それではマイクロビット側のプログラムを作成します。ここでは「明るさ」を取得してOranginoに送信してみましょう。シリアル通信のカテゴリは高度なブロック内に用意されています。

使用するのは「シリアル通信 送信先を変更する」「シリアル通信 数値を文字で書き出す」と「シリアル通信 文字列を書き出す」の3つのブロックです。文字列を書き出すブロックは改行コードを送るために使用します。これはマイクロビットで用意されている「シリアル通信 1行書き出す」ブロックを使った場合、余計な文字まで送信されるためです。単純に明るさを送信するだけなら「シリアル通信 1行書き出す」ブロックでも構いません。ただし、Oranginoでの表示速度はかなり遅くなります。
そこでOranginoの改行コードにあわせてデータを送るために「シリアル通信 文字列を書き出す」ブロックを使用します。

まず、通信速度などの設定はマイクロビット側で用意してあるものをそのまま使います。また、Orangino側でも同じ設定になっているため、最初だけのブロック内に「シリアル通信 送信先を変更する」ブロックを入れます。次に明るさを送信するブロックを図のように組み立てます。

書き出す文字列で\n\rを指定していますが、ブロックエディタでは入力することができません。このためJavaScriptコードエディタに切り替えてserial.writeString()で指定する文字を"\n\r"に変更してからブロックエディタに戻ります。すると図のような状態になります。これでマイクロビットの送信側のプログラムはできあがりです。

 JavaScriptコードの場合は以下のようになります。

serial.redirect(
    SerialPin.P0,
    SerialPin.P1,
    BaudRate.BaudRate115200
)
basic.forever(function () {
    serial.writeNumber(input.lightLevel())
    serial.writeString("" + "\n\r")
})

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。マイクロビットから送られた明るさの数値がOranginoの画面に表示されるはずです。なお、明るさが0だとIllegal line numberと表示されてしまいますが、ここでは気にする必要はありません。
 データがうまく受信できない場合は、一度Oranginoのリセットボタン(濃いオレンジ色のボタン)を押してください。また、ワニ口クリップなどで接続している場合、線がちゃんとつながっているか、他の線や端子に接触していないか確認してください。

Orangino側でプログラムを使って受信

 今度はOranginoでプログラムを使ってデータを受信してみます。Orange BASICのリファレンスは以下のURLに用意されています。PDFなので印刷して手元に置いておくと便利かもしれません。

・Orange BASIC http://www.picosoft.co.jp/orange/download/ORANGE_BASIC.pdf

 ここではOranginoの電源投入直後の状態でプログラムを動かすことにします。この状態であれば以下のプログラムを入力することで、先ほど作成したマイクロビットから送られたデータを表示することができます。Orange BASICでプログラムを入力する場合は10や30の行番号に続けてプログラムを入力したら最後にリターンキーを押してください。リターンキーを押さないとプログラムとして入りません。
 Orange BASICではUARTからのデータ入力はuartget(1)を使います。

10 d=uartget(1)
20 if d=-1 then goto 10
30 print chr$(d);
40 goto 10

 上記のプログラムを入力したらrunと入力しリターンキーを押して下さい。すると画面にマイクロビットから送られた明るさの数値が表示されていきます。プログラムで受信しているので値が0でもIllegal line numberのエラー表示は出ません。

 このプログラムは単純に受信したデータを表示しているだけなので、データを加工して処理する場合は使い物になりません。そこで今度はマイクロビットから送られたきたデータを数値として処理することにします。
 今度はマイクロビット側のプログラムを少し変更します。Orange BASICで処理しやすいようにデータの区切りを,として送信します。ブロックを以下のように組み立てます。

 JavaScriptコードの場合は以下のようになります。

serial.redirect(
SerialPin.P0,
SerialPin.P1,
BaudRate.BaudRate115200
)
basic.forever(function () {
    serial.writeNumber(input.lightLevel())
    serial.writeString(",")
    basic.pause(500)
})

 先にマイクロビットに作成したプログラムを転送しておきます。ただし、この時点ではマイクロビットとOranginoをつながないでください。つないでしまうとOranginoでプログラムを入力できないためです。

 準備ができたらOranginoでプログラムを作成します。まず、数値を入れる変数に0を入れておきます。送られてきた文字が0〜9の文字コードだった場合、変数の値を10倍してから送られてきたデータを足します。0の文字コードは48なので送られてきたデータから48を引き算してから足します。
 Orange BASICのプログラムは以下のようになります。

10 n=0
20 d=uartget(1)
30 if d=-1 then goto 20
40 if d>47 and d<58 then n=n*10+(d-48)
50 if d=44 then print n:n=0
60 goto 20

プログラムを入力したらRUNと入力しリターンキーを押すと実行されます。次にマイクロビットとOranginoをつなげます。すると図のようにマイクロビットから送られてきた明るさの数値が表示されていきます。

本当に数値データとして処理されているか確認するには以下のプログラムをOranginoで実行してみてください。送られてきた明るさのデータと、それを2で割った値が表示されます。

10 n=0
20 d=uartget(1)
30 if d=-1 then goto 20
40 if d>47 and d<58 then n=n*10+(d-48)
50 if d=44 then print n;" ";n/2:n=0
60 goto 20

 受信データを数値として扱えればデータ処理をしてグラフとして表示することもできます。Orange BASICでは標準で320×200の白黒グラフィック画面が用意されています。ここでは明るさを棒グラフとしてグラフィック画面に描いてみます。Orange BASICでグラフィック画面に線を描くにはlineを使います。lineの書式は以下のようになっています。X座標は0〜319,Y座標は0〜199までの範囲になります。色コードは黒が0、白が1です。

line 始点X座標, 始点Y座標, 終点X座標, 終点Y座標, 色コード


 棒グラフは左側から右側に向かって描画していきます。1データ受信するごとに棒グラフが描かれます。右端まで描いたら左端から描いていきます。
 以下のプログラムをOranginoで入力し実行するとマイクロビットから送られた明るさをグラフとして表示します。また、左上には取得したデータの値も表示します。

10 cls
20 n=0:x=0
30 d=uartget(1)
40 if d=-1 then goto 30
50 if d>47 and d<58 then n=n*10+(d-48)
60 if d<>44 then goto 30
70 line x,0,x,199,0
80 line x,199-n/2,x,199,1
90 x=(x+1)%320
100 locate 0,0:print n;"  "
110 n=0
120 goto 30

Oranginoからのデータをマイクロビットで受信する

 それは次にOranginoからマイクロビットにデータを送信してみます。マイクロビットでは送信された文字をLEDに表示します。
Oranginoでは押されたキーをシリアルに送信します。シリアルで送信するにはuartputを使います。uartputの書式は以下のようになっています。

uart チャネル,送信文字列

チャネルは1つしか使えないので1の値を指定します。送信文字列はchr$()を使って押されたキーコードを文字列にして指定します。
なお、電源投入時から設定を変えている場合は動かないことがありますので、以下のプログラムは電源を入れた後に実行してください。

10 k=inkey()
20 if k=0 then goto 10
30 print chr$(k);
40 uartput 1,chr$(k)
50 goto 10

 次にマイクロビットの受信プログラムを作成します。初期設定部分は今までと同じブロックをそのまま配置します。
「シリアル通信 文字列を読み取る」ブロックを使えばシリアル通信データを読み出すことができます。データは文字列なので、このブロックをLEDの「文字列を表示」ブロックに入れます。
 プログラムは図のように組みます。

 JavaScriptコードの場合は以下のようになります。

serial.redirect(
SerialPin.P0,
SerialPin.P1,
BaudRate.BaudRate115200
)
basic.forever(function () {
    basic.showString(serial.readString    ())
})

マイクロビットとOranginoをつないだら、Oranginoで文字を入力します。入力した文字がマイクロビットのLEDに表示されます。ゆっくり押せば1文字ずつ表示されますが、素早くキーを入力すると複数の文字がスクロールして表示されます。

Oranginoは高速でグラフィック処理もできるため、マイクロビットのセンサーと組み合わせるといろいろ面白いことができるでしょう。タートルグラフィックス機能と組み合わせるのもよいかもしれません。

著者 古籏一浩
プログラミングをベースにして面白そうなものはとりあえずやってみるというスタンス。複雑なものよりシンプルで楽しめるものが好み。最近は30年前に移植したゲーム(mz-700版 SPACE HARRIER)の話などを書いたりしています。
著者サイト:http://www.openspc2.org/