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/