IchigoJamとは?

 今回はマイクロビットのシリアル通信機能を使ってIchigoJam(イチゴジャム)とデータのやりとりを行ってみます。
IchigoJamはこども向けの小型コンピューターです。基本的にマイクロビットと同じカテゴリの商品になります。

・IchigoJam
https://ichigojam.net/

  • IchigoJam公式Webサイト

    IchigoJam公式Webサイト

 IchigoJamは完成品も販売されていますが、自分で組み立てることもできます。実際に自分のコンピューターを基板や抵抗などを組み立てることができるのはIchigoJamの大きな特長です。子供にはんだ付け?と思う人もいるかもしれませんが、実際に講座でやってみるとちゃんとはんだ付けして組み立てることができます。
 また、IchigoJamは電源を入れるとすぐに起動します。プログラム開発で使うのは古い時代に使われていたBASIC言語です。ええ?BASIC!と思われる人もいるかもしれませんが、命令を入力するだけですぐに動き結果がわかるので便利です。また、プログラムで使える容量は約1KB(1024バイト弱)ですが、便利な命令のおかげで思った以上にいろいろなことが可能です。ver 1.3以降ではIoT命令も用意されており手軽にサーバーとの通信ができます。

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

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

【マイクロビット側】 【IchigoJam側】
P0端子 RXD
P1端子 TXD
GND端子 GND

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

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

使用するのは「シリアル通信 送信先を変更する」「シリアル通信 数値を文字で書き出す」と「シリアル通信 文字列を書き出す」の3つのブロックです。文字列を書き出すブロックは改行コードを送るために使用します。これはマイクロビットで用意されている「シリアル通信 1行書き出す」ブロックが期待通りの動作にならないためです。そこでIchigoJamの改行コードにあわせてデータを送るために「シリアル通信 文字列を書き出す」ブロックを使用します。

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

次に明るさを送信するブロックを図のように組み立てます。

書き出す文字列で\n\rを指定しています。これが、IchigoJamでの改行コードになります。ただし、ここで注意が必要です。この状態では改行コードである\n\rは期待通り送信されません。というのも、ブロック内では半角バックスラッシュはエスケープ文字ではなく、半角バックスラッシュとして扱われてしまうためです。JavaScriptコードエディタで表示すると以下のようになっています。

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

そこでserial.writeString("\\n\\r")をserial.writeString("\n\r")に変更してからブロックエディタに戻ります。すると図のような状態になります。これでマイクロビットの送信側のプログラムはできあがりです。

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

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

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

 あと、データを送信する際には一定のウェイト(待ち時間)を入れてください。ウェイトなしで送信するとIchigoJam側でデータを処理できないことがあります。

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

 今度はIchigoJamでプログラムを使ってデータを受信してみます。IchigoJamのBASICのリファレンスは以下のURLに用意されています。バージョンによって使用できる命令やパラメーターが若干異なります。使用しているIchigoJamのバージョンに合わせて確認してください。

・ver 1.2.2
https://ichigojam.net/IchigoJam-1.2.html
・ver 1.3
https://ichigojam.net/IchigoJam-1.3.html

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

10 K=INKEY()
20 IF K=0 THEN GOTO 10
30 PRINT CHR$(K);
40 GOTO 10

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

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

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

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

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

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

10 D=0
20 K=INKEY()
30 IF K>47 AND K<58 THEN D=D*10+(K-48)
40 IF K=44 THEN PRINT D:D=0
50 GOTO 20

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

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

10 D=0
20 K=INKEY()
30 IF K>47 AND K<58 THEN D=D*10+(K-48)
40 IF K<>44 THEN GOTO 20
50 PRINT D
60 PRINT D/2;"*"
70 GOTO 10

 受信データを数値として扱えればデータ処理をしてグラフとして表示することもできます。IchigoJamは標準ではグラフィック機能がありません。マルチメディアボードを装着すると80×45、16色、4重和音を利用することができます。が、今回はテキスト画面だけで処理してみます。
 IchigoJamのテキスト画面は32文字×24行です。マイクロビットから送られてくる明るさのデータは0〜255です。この値を16で割ればIchigoJamの画面内に収まります。あとは、明るさにあわせて文字(*)の表示Y座標を調整します。文字をどこに表示するかはLOCATE(省略形はLC)で指定します。
 明るさを示す文字(*)を表示したら画面全体を左側にスクロール(移動)させます(SCROLL 3)。

 以下のプログラムをIchigoJamで入力し実行するとマイクロビットから送られた明るさをグラフとして表示します。

5 CLS
10 D=0
20 K=INKEY()
30 IF K>47 AND K<58 THEN D=D*10+(K-48)
40 IF K<>44 THEN GOTO 20
50 D=D/16
60 LC 31,17-D:PRINT "*";
70 SCROLL 3
80 GOTO 10

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

 それは次にIchigoJamからマイクロビットにデータを送信してみます。マイクロビットでは送信された文字をLEDに表示します。
IchigoJamでは押されたキーをシリアルに送信します。シリアルで送信するにはPRINTを使います。画面に表示される文字が、そのままシリアル通信データとして送られます。なお、電源投入時から設定を変えている場合は動かないことがありますので、以下のプログラムは電源を入れた後に実行してください。

10 K=INKEY()
20 IF K=0 THEN GOTO 10
30 PRINT CHR$(K);
40 GOTO 10

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

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

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

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

マイクロビットは多数のセンサーを搭載しているので、IchigoJamと組み合わせるとセンサーからの入力値に応じて様々な処理を行うことができます。sakura.ioとも連携できるので応用範囲は広いでしょう。

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