この記事は、IchigoJam Advent Calendar 2018 8日目の記事です。
1. はじめに
IchigoLink は Scratch 3.0 と IchigoJam を連携させるために開発している、
シリアル通信とブラウザJavaScriptのブリッジです。
Windows, Mac, Linux でコマンドラインアプリケーションとして動作し、
WebSocket を使って ローカルのシリアルポート と ブラウザのJavaScriptをつなぎます。
(ちなみに、micro:bit は同様のツールの BLE版を提供しています。)
本来は Scratch連携用 のツールですが、それ以外にも面白いことができます。
2. 何ができるのか
下記の動画にあるような IchigoJamと連携する作品を JavaScript と HTML だけで作成できます。
IchigoJam のボタン操作でWebページを変化させる
IchigoJam から取得したアナログ値で Webページを変化させる
WebページからIchigoJam を操作する
3. [使い方] 準備するもの
- パソコン
- IchigoJam
- シリアル通信に必要なデバイス(USBシリアル変換アダプタなど)
- IchigoJamで使いたいデバイス(LED、ボタン、可変抵抗、各種センサー、各種モーターなど)
4. [使い方] ダウンロードから起動まで
開発中ということで仮の場所になりますが、下記からダウンロードできます。
http://shizentai.jp/ichigolink/
IchigoLink は下記からダウンロードできます。
http://ichigolink.shizentai.jp/downloads.html
zip ファイルを解凍すると下記のような中身になっているので、コマンドプロンプトやターミナルを立ち上げて、このディレクトリに移動します。
パソコンとシリアル通信デバイス、IchigoJamを接続します。
参考: イチゴジャム レシピ — 周辺機器 パソコンと接続
下記のコマンドをたたきます。
Windows の場合
> ichigo-link [シリアルデバイス名]
Mac/Linux の場合
$ ./ichigo-link [シリアルデバイス名]
シリアルデバイス名は Windows の場合はCOM3やCOM4、Linux の場合は /dev/ttyUSB0 などになることが多いようです。
参考: IchigoLink: Find serial port
コマンドプロンプトやターミナルが上のような表示になり、
ブラウザで、 http://localhost:30110 を表示したときに下記のような画面になれば起動成功です。箇条書き程度ですが、仕様をまとめてあるので参考にしてください。
また、このページが ichigo-link-www フォルダの index.html に対応しており、ichigo-link-www フォルダ以下にファイルを置くと、localhost:30110 以下で公開されるようになっています。
5. [使い方] 付属デモアプリケーション
デモツールとして、簡易的なターミナルとコード送信ツールを添付しています。
ichigo-link-www/demo の下にファイルが存在します。
簡易ターミナル
http://localhost:30110/demo/terminal.html
connect ボタンを押すと接続します。
上のテキストボックスに入力したものを行単位で送信し、受信したものを下のテキストエリアに表示します。
RUNを中断したいときなどに esc ボタンを押してエスケープシーケンスも送れます。
現状、テキストエリアにデータを追加しているだけで解放処理をしていないので、
大量のデータを受け取ったり、長時間使用すると固まったりするかもしれません。あしからず。
コード送信ツール
http://localhost:30110/demo/send_source.html
まとめて何行か送りたいとき用のツールです。
6. 動画で紹介した作品の作り方
下記のソースコードをテキストエディタなどに貼り付けて、ichigo-link-www 以下に適当なファイル名で保存すれば、localhost:30110 以下でブラウザからアクセスできます。
IchigoJam 側のプログラムを最初に送って RUNするようにしていますが、この部分だけ IchigoJam 側に最初から用意しておいてもよいと思います。
IchigoJam のボタンを押すと背景色がつくページ
<!DOCTYPE html> <html> <head> <title>IchigoJamのボタンを押すと緑になるページ</title> <meta charset="UTF-8"/> <script> window.addEventListener('load', function () { var ws = new WebSocket('ws://localhost:30110/serial'); ws.addEventListener('open', function () { ws.send(JSON.stringify({"type":"esc"})); ws.send(JSON.stringify({"type":"text","value":"NEW"})); ws.send(JSON.stringify({"type":"text","value":"10 ?BTN():WAIT3:GOTO10"})); ws.send(JSON.stringify({"type":"text","value":"RUN"})); }); ws.addEventListener('message', function (event) { var obj = JSON.parse(event.data); if(obj.value == "0") { document.body.style.backgroundColor = "white"; } if(obj.value == "1") { document.body.style.backgroundColor = "#00C000"; } }); }); </script> </head> <body> <h2>IchigoJamのボタンを押すと画面が緑になるページ</h2> </body> </html>
ANA(2)の値で背景色の濃さが変わるページ
背景色の計算ロジック、地味に苦労しました。改善求む!
<!DOCTYPE html> <html> <head> <title>ANA(2)の値で緑の濃さが変わるページ</title> <meta charset="UTF-8"/> <script> window.addEventListener('load', function () { var ws = new WebSocket('ws://localhost:30110/serial'); ws.addEventListener('open', function () { ws.send(JSON.stringify({"type":"esc"})); ws.send(JSON.stringify({"type":"text","value":"NEW"})); ws.send(JSON.stringify({"type":"text","value":"10 ?ANA(2):WAIT3:GOTO10"})); ws.send(JSON.stringify({"type":"text","value":"RUN"})); }); ws.addEventListener('message', function (event) { var obj = JSON.parse(event.data); var a = parseInt(obj.value,10); var b = Math.floor(a/2); var c, d; if ( b < 256 ) { c = 255 - b; d = 255; } else { c = 0; d = 255 - (b-255); } var color = "rgb(" + c + "," + d + "," + c + ")"; console.log(color); document.body.style.backgroundColor = color; }); }); </script> </head> <body> <h2>ANA(2)の値で緑の濃さが変わるページ</h2> </body> </html>
LEDとPWMをコントロールするページ
<!DOCTYPE html> <html> <head> <title>IchigoJamのLEDとPWMをコントロールするページ</title> <meta charset="UTF-8"/> <script> window.addEventListener('load', function () { var ws = new WebSocket('ws://localhost:30110/serial'); ws.addEventListener('open', function () { ws.send(JSON.stringify({"type":"esc"})); ws.send(JSON.stringify({"type":"text","value":"LED0"})); ws.send(JSON.stringify({"type":"text","value":"PWM3,50"})); ws.send(JSON.stringify({"type":"text","value":"PWM4,50"})); document.getElementById('ledon').addEventListener('click',function() { ws.send(JSON.stringify({"type":"text","value":"LED1"})); }); document.getElementById('ledoff').addEventListener('click',function() { ws.send(JSON.stringify({"type":"text","value":"LED0"})); }); document.getElementById('pwm3').addEventListener('change',function() { var a = parseInt(document.getElementById('pwm3').value,10); ws.send(JSON.stringify({"type":"text","value":"PWM3," + a})); }); document.getElementById('pwm4').addEventListener('change',function() { var a = parseInt(document.getElementById('pwm4').value,10); ws.send(JSON.stringify({"type":"text","value":"PWM4," + a})); }); }); }); </script> </head> <body> <h1>IchigoJamのLEDとPWMをコントロールするページ</h1> <form> <h3>LED</h3> <input type="radio" name="led" id="ledon" />On <input type="radio" name="led" id="ledoff" checked="checked"/>Off <h3>PWM3</h3> 50 <input type="range" id="pwm3" value="0" min="50" max="240" step="10"/> 240 <h3>PWM4</h3> 50 <input type="range" id="pwm4" value="0" min="50" max="240" step="10"/> 240 </form> </body> </html>
7. まとめと課題
- IchigoLink を使うと IchigoJam と連携するブラウザアプリケーションを簡単に作れます。
- Scratch 対応として配布するまでに GUI化したいです。
- Windows 版の反応がよくない気がするのが少々気になる。
- IchigoLink 公式サイトhttp://ichigolink.shizentai.jp/