クリエイター手抜きプロジェクト[478]IoT編 IchigoJam同士で通信する(3)/古籏一浩

投稿:  著者:  読了時間:7分(本文:約3,200文字)



今回もIchigoJamを2台使って通信をしてみます。今回は入力した文字が受信側に表示されるようにします。無理矢理送信して押しつけるわけなのですが、一方通行のチャットだと思ってもよいでしょう。相互で通信すればチャットになります。

まず、前回と同じようにIchigoJam同士をつなぎます。受信側のプログラムは変更せず、前回のものをそのまま使用しRUNとして実行させておきます。

送信側は押されたキーの番号をそのまま出力するようにします。IchigoJamはリアルタイムにキー入力を行うことができます。その命令はINKEY()です。以下のようにすると変数Kに押されたキーの番号が入ります。

K=INKEY()

ところでキーの番号って、どこに書いてあるのでしょう? 基本的にアスキーコード準拠になっていますが、以下のキャラクタマップに文字と番号の対応があります。





●IchigoJamキャラクタマップ
http://fukuno.jig.jp/app/IchigoJam/charmap.html

大文字のAなら65、小文字のzなら122です。数字の2は50になります。とりあえず、押されたキーの値をそのまま送信してみましょう。プログラムは以下のようになります。

10 K=INKEY()
20 OUT K
30 GOTO 10

実行してみると、押されたキーのコードが一瞬だけ受信側の画面に表示されます。ちょっと処理が速すぎるようです。あっという間に表示され、文字が流れていってしまいます。

これではわかりませんので、キーが押されていない場合は送信しないようにします。INKEY()はキーが押されていない場合は0を返しますので、これを利用します。

以下のプログラムのように、15行目を追加しIF命令を使って変数Kの値が0なら10行に戻るように条件を追加します。つまりキーが入力されるまでひたすら待つわけです。

10 K=INKEY()
15 IF K=0 THEN GOTO 10
20 OUT K
30 GOTO 10

今度は押されたキーの番号が、受信側にずっと表示されるようになりました。でも、送信側は何のキーを押したのかが分かりません。

そこで、以下のように25行目を追加し、押したキーに対応する文字を表示するようにします。CHR$()は指定した番号に対応する文字を表示する命令です。

10 K=INKEY()
15 IF K=0 THEN GOTO 10
20 OUT K
25 PRINT CHR$(K)
30 GOTO 10

RUNとして実行してみましょう。今度は押したキーが送信側に表示され、受信側には番号が表示されます。でも、せっかくなので受信側も文字を表示したいところです。そこで、受信側でもCHR$()を使って数値を文字にします。

10 OUT 1,-1:OUT 2,-1:OUT 3,-1
20 A=IN() & #7F
30 PRINT CHR$(A)
40 GOTO 20

それでは実行してみましょう。送信側でキーを押すと、対応する文字が送信側にも表示されます。しかし、入力された文字がひたすら表示され続けてしまいます。

できればチャットのように1文字ずつ表示させたいところです。思い立ったら早速改良しましょう。

まず、文字を受信したら、次の文字を受信するまで待つようにします。とは言っても、同じも文字が連続してきたら、次の文字かどうかが判別できません。そこで、1文字受信したら0の値が来るまで待ちます。要するに、以下のように1文字送ったら0を送る、という「仕様」にします。

65 ← Aの文字
0 ← 区切り
66 ← Bの文字
0 ← 区切り

この仕様にそって作成すると、以下のようなプログラムになります。

10 OUT 1,-1:OUT 2,-1:OUT 3,-1
20 A=IN() & #7F
30 IF A=0 THEN GOTO 20
40 PRINT CHR$(A);
50 A=IN() & #7F
60 IF A<>0 THEN GOTO 50
70 GOTO 20

60行目のA<>0は変数Aが0でなかったら、という意味です。つまり、一度文字を受信すると、その値がずっと来てしまうので、その値が来ている場合は0が来るまで待つということです。

それでは次に送信側のプログラムです。キーの値を送信したら60行目でウェイトを入れています。これを入れないと速すぎて、受信側でうまく値を受け取れません。もし、これでも取りこぼすようならWAIT 5など値を大きくして下さい。

10 OUT 0
20 K=INKEY()
30 IF K=0 THEN GOTO 20
40 OUT K
50 PRINT CHR$(K);
60 WAIT 2
70 GOTO 10

送信側のIchigoJamでキーを押すと、受信側でも同じ文字が表示されます。リターンキーやバックスペースも有効です。

一方通行ですが、何となくチャットっぽくなりました。相互にチャットできるようにするには工夫が必要ですが、通信の基本的な感じが分かってもらえば十分かなと思います。実際にIchigoJam同士を接続して体験してみてください。

ちなみにIchigoJamにはTXD, RXDポートがあり、これでPRINT命令などで文字などを簡単に出力できます。興味があればTXD-RXDとして接続してデータを送信してみてください。


【古籏一浩】openspc@alpha.ocn.ne.jp
http://www.openspc2.org/

今年は長雨でなかなか稲刈りの後の脱穀ができなかったのですが、ようやく終わりました。日経だったか経済誌だったか、農業関係の記事で「農家が一家に一台、バインダーとか脱穀機を持つのは非効率的でよくない、無駄である。共有して使用するのが合理的である」と書かれていました。

では実際に共有したらどうなったか、というのは何十年も前に結論が出ていて、共有しては駄目だ、ということです。

特に稲刈り・脱穀は、天候によっては一か月のうちにチャンスが一回(日)か二回(日)しかありません。その日のうちに全部刈り取ってしまわなければいけないわけです。三軒で共有すると、一軒は稲刈りできても他の二軒は、肝心な時に稲刈りができなくなります。

結局、残りの二軒は自分達で機械を購入するということになります(なりました)。経済屋さんの言う通りにやったら一時的(二〜三年)に効率はよくなったがトータルでは駄目だった、ということです。

しかし、ここ数年で急に高齢化が進み、多くの人が数軒の大規模農家や農協に依頼するようになりました。つまり、経済誌で書かれているような「効率的」な状態になりました。

ところが今年のような天候の場合、稲刈りができず一か月くらいずれこんでしまいました。コンバインで効率的に刈り取りはできても、その後の乾燥機で時間がかかるため、実際には次々と刈り取っていくことはできないのです。いつまで稲作ができるかどうか、という感じです。

・みんなのIchigoJam入門 BASICで楽しむゲーム作りと電子工作
http://www.amazon.co.jp/dp/4865940332/

・Premiere Pro & Media Encoder自動化サンプル集
http://www.amazon.co.jp/dp/4802090471/

・JavaScriptによるデータビジュアライゼーション入門
http://www.amazon.co.jp/dp/4873117461/

・Photoshop自動化基本編
http://www.amazon.co.jp/dp/B00W952JQW/

・Illustrator自動化基本編
http://www.amazon.co.jp/dp/B00R5MZ1PA/

・Adobe JavaScriptリファレンス
http://www.amazon.co.jp/dp/B00FZEK6J6/

・4K/ハイビジョン映像素材集
http://www.openspc2.org/HDTV/

・クリエイター手抜きプロジェクト
http://www.openspc2.org/projectX/