Hana道場【師範】のブログ

IchigoJamの徹底解説ブログ

IchigoJamとMixJuiceを「SLEEP」して超省電力のIoTをつくる【IoTインターホン続編】

f:id:hanadojo_sihan:20201030124715j:plain

前回は自宅のインターホン(呼び鈴)をIoT化させました。hanadojo-sihan.hatenablog.com

 

↑のブログでは、IchigoJamのみSLEEPにしていますが、MixJuice自体もSLEEPにする方法を見つけました。

IchigoJam + MixJuiceで製作するIoTセンサ – Ambient

 

今回はIchigoJamとMixJuice両方をSLEEPさせて、「超省電力IoT」に挑戦します!

 

 

【接続】

f:id:hanadojo_sihan:20201030131517j:plain

MixJuiceのCN4-2(RST)IchigoJamのBTNをジャンパー線で接続。

 

今回はインターホン(呼び鈴)のIoTなので、ボタンが押されるとSLEEPから起きるようにしています。

 

BTNピンにはMixJuice(RST)からの線と、インターホンのボタンからの線、計2本挿さっています(2本挿すためにホッチキスの芯を使っています笑)

 

【プログラム】 

10 VIDEO 0
20 ?"MJ APS":IF INKEY()!=49 CONT
30 ?"MJ GETS maker.ifttt.com/trigger/イベント名/with/key/Webhoocksのkey?value1=メッセージ"
40 BEEP 20,90
50 ?"MJ SLEEP 0"
60 SLEEP

 30行目でLINEメッセージを送っています。

詳しくは<その1>ブログをご覧ください。

 

【プログラム解説】

10 VIDEO 0 ビデオ出力OFF
20 ?"MJ APS":IF INKEY()!=49 CONT ネットワークに再接続するまで待機
30 ?"MJ GETS maker.ifttt.com/trigger/イベント名/with/key/Webhoocksのkey?value1=メッセージ" LINEメッセージをIFTTTのWebhoocksに送る
40 BEEP 20,90 呼び鈴の音
50 ?"MJ SLEEP 0"
MixJuiceを無限にSLEEP
60 SLEEP IchigoJamをディープSLEEP

 

20行目:ネットワークに接続するまで待機しています。

MJ APS 
WiFiアクセスポイントへの接続を確認します。
戻り値が0の場合は未接続、1の場合は接続中です。

50行目:CN4-2(RST)がHIGHになる(ボタンが押される)までSLEEPします。

MJ SLEEP sec 
スリープ(節電モード)します。sec には 0-4000(秒) を指定できます。
(sec=0の場合) 無限にスリープします。
CN4-2(RST)をHIGHで復帰します。
(sec>0の場合) CN4-2(RST)とCN4-6(IO16)を接続してください。
sec秒後に復帰します。
 

60行目:IchigoJamをSLEEPさせます。

SLEEP
プログラムを休止する (ボタンを押すと起動し、LRUN0を実行する)

 

これでインターホン(ボタン)が押されると、SLEEPが解除されLINEにメッセージを送ります。

メッセージを送った後は、MixJuice→IchigoJamの順番にSLEEPさせます。

 

<注意>

モバイルバッテリーを電源として使用すると、消費電力が低すぎてモバイルバッテリー自体がスリープしてしまいます。

スリープさせない方法もあるようですが、単三電池を使えば問題なく動きました!

何ヶ月持つか実験中です!!

 

ご指摘・ご質問はTwitterからお願いします。

CC BY Hana道場師範 / @shihan_hanadojo

twitter.com

 

IchigoJamで【IoTインターホン】をつくってみた!LINE連携シリーズ<その3>

f:id:hanadojo_sihan:20201019105827j:plain

IchigoJamでLINEを送るシリーズ<その3>では、実践編として「IoTインターホン(呼び鈴)」をご紹介!!

IchigoJamでLINEを送る方法 <その1>

IchigoJamで"UTF-8変換"してLINEを送る方法<その2>

今回挑戦したのはこちら↓

youtu.be

 

プログラムも接続方法もとてもシンプルなので、<その1>ブログを参考につくってみてください!!

 

【目次】

 

 

1. 必要なもの

(我が家の電池式呼び鈴は古くて検索しても見つかりませんでした)

 

2. 接続方法

今回IoT化したインターホン(呼び鈴)はこちら

f:id:hanadojo_sihan:20201019111007j:plain 

(1)カバーを開ける

f:id:hanadojo_sihan:20201019111214j:plain

2箇所ボタンに繋がる接点を発見!

この2箇所をIchigoJamのピンBTNとGNDにつなげばOK!

(2)ネジを外し、ジャンパー線に接続

f:id:hanadojo_sihan:20201019111423j:plain

銅線が鋼板とネジで留められていました!

銅線をそれぞれジャンパー線メスにねじ込みます。 

(3)IchigoJamに接続&テスト

f:id:hanadojo_sihan:20201019111615j:plain

ジャンパー線オスをIchigoJamのピンBTNとGNDにそれぞれ接続します。

10 ?BTN():WAIT3:CONT

のようなプログラムを実行し、実際にインターホンを押してみましょう!

インターホンを押すと1、押さないと0が返って来たら成功です。

 

3. プログラム概要

【プログラム】

10 VIDEO 0
20 ?"MJ GETS maker.ifttt.com/trigger/イベント名/with/key/Webhoocksのkey?value1=メッセージ"
30 BEEP20,90:WAIT60
40 SLEEP

0番にSAVEしましょう。IchigoJamのボタンを押しながら電源ONで0番のプログラムが自動実行します。

ver1.4以降なら、最初の行に「@ARUN」を入れるとボタンを押さなくても自動実行されます。

5 @ARUN

 

WiFi接続は1回接続すれば、次から自動で接続されます。

?"MJ APC SSID パスワード"

MixJuice参考サイト:準備・使い方 - イチゴジャム レシピ

 

インターホンを押してメッセージが送られてきたら成功です!

f:id:hanadojo_sihan:20201019162235j:plain

(メッセージを GUSET!! にした場合)

 

【プログラム解説】

10 VIDEO 0 画面表示を停止し処理高速化
20 ?"MJ GETS maker.ifttt.com/trigger/イベント名/with/key/Webhoocksのkey?value1=メッセージ" IFTTTにパラメータvalue1を送信
30 BEEP20,90:WAIT60 ブザーを鳴らす
40 SLEEP スリープ状態にする

 

10行目:画面表示を停止すると、消費電力を抑え、処理も高速化されます。

VIDEO 数{,数2} 画面表示非表示を切り替える。0で画面表示を停止し処理高速化 

20行目<その1>ブログをご覧ください。

40行目:SLEEP状態にし、消費電力を抑えます。

SLEEP プログラムを休止する (ボタンを押すと起動し、LRUN0を実行する)

ボタン(インターホン)が押されると、0番のプログラムが自動実行されます。

 

そしてなんとSLEEP状態だとIchigoJam消費電力が1.2μA(0.0012 mA)まで下がるそうです!

IchigoJamを低電力で定期実行させる方法 - LPC810で1分定期WAKEUPするIoT! #maker #IoT #lpc1114 #lpc810 / 福野泰介の一日一創 / Create every day by Taisuke Fukuno

IchigoJamで省エネIoT、動作周波数別消費電流とスリープモード #maker #IchigoJam #IoT / 福野泰介の一日一創 / Create every day by Taisuke Fukuno

 

単三電池2本(2000mA)だと、約1666時間(約69日)使えます!

2ヶ月に1回交換でokですね。

ただ、MixJuiceもSLEEPにしないと省電力化したとは言えませんね。

後日やってみたのでご覧ください↓

hanadojo-sihan.hatenablog.com

 

 

古いインターホン(呼び鈴)だったら簡単に作れちゃう「IoTインターホン」

ぜひやってみてください!

 

質問などはTwitterからお願いします↓

CC BY Hana道場師範 / @shihan_hanadojo

twitter.com

IchigoJamで"UTF-8変換"してLINEを送る方法<その2>【IchigoJam × MixJuice × IFTTT】

f:id:hanadojo_sihan:20201013065828j:plain

IchigoJamで文字列をUTF-8変換して、文字化けせずLINEにカタカナ(日本語)のメッセージを送るプログラムを紹介します!

IFTTT でLINEにメッセージを送る方法は<その1>のブログをご覧ください。

hanadojo-sihan.hatenablog.com

 

今回挑戦するのはこちら↓

 

IchigoJamBASICでUTF-8変換しています。

ご指摘があればTwitterからお願いいたします!

@shihan_hanadojo

twitter.com

【目次】

 

【プログラム】

5 CLS:POKE#1E03,1,34:INPUT S

10 ?"MJ GETS maker.ifttt.com/trigger/イベント名/with/key/Webhoocksのkey?value1=";

20 FOR I=0 TO LEN(S)-1

30 C=ASC(S+I):D=ASC(S+I+1)

40 IF C<160 ?STR$(S+I,1);:GOTO290

50 A=#82

60 IF C>176&&C<182 [I]=#A2+2*C%177

70 IF C>181&&C<192 [I]=#AB+2*C%182

80 IF C>191 IF C=192 [I]=#BF ELSE A=#83:[I]=#81+3*(C=194)+5*(C=195)+7*(C=196)

90 IF C>196&&C<202 [I]=#8A+C%197

100 IF C>201&&C<207 [I]=#8F+3*C%202

110 IF C>206&&C<212 [I]=#9E+C%207

120 IF C>211&&C<215 [I]=#A3+2*C%212

130 IF C>214&&C<220 [I]=#A9+C%215

140 IF D=222 [I]=[I]+1:F=1:IF C=192 [I]=#80:A=#83

150 IF D=223 [I]=[I]+2:F=2

160 IF C=220 [I]=#AF

170 IF C=166 [I]=#B2:A=#83

180 IF C=221 [I]=#B3

190 IF C>166&&C<172 [I]=#A1+2*C%167

200 IF C=172 [I]=#A3:A=#83

210 IF C=173 [I]=#A5:A=#83

220 IF C=174 [I]=#A7:A=#83

230 IF C=175 [I]=#83:A=#83

240 IF C=176 [I]=#BC:A=#83

250 IF C=164 [I]=#81:A=#80

260 IF C=161 [I]=#82:A=#80

270 ?"%E3%";HEX$(A);"%";HEX$([I]);

280 IF F I=I+1:F=0

290 NEXT

300 ?:LC0,10:?”>”;STR$(S):?

5,10,300行目はWebhoocksにHTTP通信してメッセージを送っている部分です。

<その1>で解説しています。

 

【実行画面】

?"ムカエニキテ

↓Enterを押すと

f:id:hanadojo_sihan:20201013072606p:plain

文字化けせず、ちゃんと日本語が送れました!

 

【プログラム解説】

①文字列入力、HTTP通信(GETメソッド)

5 CLS:POKE#1E03,1,34:INPUT S

10 ?"MJ GETS maker.ifttt.com/trigger/イベント名/with/key/Webhoocksのkey?value1=";

<その1>を参照してください。

 

②文字列のUTF-8変換

UTF-8変換サイトで変換(エンコード)の実験をしてみましょう。

<変換例>

ア→%E3%82%A2 イ→%E3%82%A4 ウ→%E3%82%A6

カ→%E3%82%AB ガ→%E3%82%AC キ→%E3%82%AD

ハ→%E3%83%8F バ→%E3%83%90 パ→%E3%83%91 ヒ→%E3%83%92

法則1:16進数2桁で表記
法則2:小文字(ァィゥェォ)のある行(ア行、ヤ行)は2飛ばし
法則3:濁点がある行(カ行、サ行、タ行)も2飛ばし
法則4:濁点+半濁点があるハ行は3飛ばし
法則5:その他の行(ナ行、マ行、ラ行)は1飛ばし
補足:「つ」だけ濁点+小文字がある。句読点や「ー」などは個別で設定。「ダ」から2つ目の値が#83になる。
 
<値の呼び方>本ブログの場合
ア → %E3%82%A2
16進数822つ目の値A23つ目の値と呼ぶことにします。

 

20 FOR I=0 TO LEN(S)-1  文字列の長さ分くりかえし

30 C=ASC(S+I):D=ASC(S+I+1) 変数Cは現在の文字のコード、変数Dは次の文字のコード

40 IF C<160 ?STR$(S+I,1);:GOTO290 カナ以外の文字はUTF-8変換する必要なし

50 A=#82 2つ目の値

60 IF C>176&&C<182 [I]=#A2+2*C%177 ア行の3つ目の値を配列に代入

70 IF C>181&&C<192 [I]=#AB+2*C%182 カ行、サ行の3つ目の値を配列に代入

80 IF C>191 IF C=192 [I]=#BF ELSE A=#83:[I]=#81+3*(C=194)+5*(C=195)+7*(C=196) タ行の3つ目の値を配列に代入(「ダ」以降、2つ目の値が#83になる)

90 IF C>196&&C<202 [I]=#8A+C%197 ナ行

100 IF C>201&&C<207 [I]=#8F+3*C%202 ハ行

110 IF C>206&&C<212 [I]=#9E+C%207 マ行

120 IF C>211&&C<215 [I]=#A3+2*C%212 ヤ行

130 IF C>214&&C<220 [I]=#A9+C%215 ラ行

140 IF D=222 [I]=[I]+1:F=1:IF C=192 [I]=#80:A=#83 濁点の場合、3つ目の値を1増やす

150 IF D=223 [I]=[I]+2:F=1 半濁点の場合、3つ目の値を2増やす

160 IF C=220 [I]=#AF 「ワ」

170 IF C=166 [I]=#B2:A=#83 「ヲ」

180 IF C=221 [I]=#B3 「ン」

190 IF C>166&&C<172 [I]=#A1+2*C%167 小文字のア行

200 IF C=172 [I]=#A3:A=#83 小文字の「ヤ」

210 IF C=173 [I]=#A5:A=#83 小文字の「ユ」

220 IF C=174 [I]=#A7:A=#83 小文字の「ヨ」

230 IF C=175 [I]=#83:A=#83 小文字の「ツ」

240 IF C=176 [I]=#BC:A=#83 「ー」

250 IF C=164 [I]=#81:A=#80 「、」

260 IF C=161 [I]=#82:A=#80 「。」

270 ?"%E3%";HEX$(A);"%";HEX$([I]); URLにUTF-8変換した文字列を付加

280 IF F I=I+1:F=0 濁点、半濁点の場合は1文字飛ばす

290 NEXT 文字列全て付加するまでくりかえし

 

IchigoJamのカナ表記で気をつける必要があるのは、濁点と半濁点です。

f:id:hanadojo_sihan:20201013084910p:plain

「ガ」で1文字ではなく、「カ」と「゛」の2文字使用しています(半濁点も同様)。

 

濁点「゛」の文字コードは222、半濁点「゜」の文字コードは223です。

<濁点と半濁点の処理>

30行目:変数Dで常に次の文字に、濁点と半濁点がないか調べる

140行目:もし 次の文字が濁点なら 現在のUTF-8の値に1増やす(ダだけ2つ目の値に影響あり)

150行目:もし 次の文字が半濁点なら 現在のUTF-8の値に2増やす

280行目:もし 次の文字が濁点or半濁点なら それを飛ばして次の文字へ

例えば

「カ゛」なら「カ」の3つ目の値に1増やして(ガの値にして)、次の文字「゛」は飛ばします。

「ハ゜」なら「ハ」の3つ目の値に2増やして(パの値にして)、次の文字「゜」は飛ばします。

 

プログラムっぽい処理はそれだけで、その他の文字のUTF-8変換はゴリ押しです!

 

③送信した文字列の表示(おまけのチャットっぽさ)

300 ?:LC0,10:?”>”;STR$(S):? 

 

★完成★

音やチャットっぽさはご自由に演出してください。

 

<その3>インターン(呼び鈴)を押すとLINEが届く「IoTインターホン」の紹介もあります。

hanadojo-sihan.hatenablog.com

 

IchigoSodaでWiFi環境のない場所でもLINEを送れるサービスを実装中のHana道場インターン生がいます。

しかもGPSで自分の位置情報も送れちゃう!?

完成をお楽しみに。

 

 

何かエラーや文字化けがありましたら、Twitterにてご指摘ください!

CC BY Hana道場師範 / @shihan_hanadojo

twitter.com 

IchigoJamでLINEを送る方法 <その1>【IchigoJam × MixJuice × IFTTT】

f:id:hanadojo_sihan:20201013010949j:plain

IchigoJam × MixJuice × IFTTT でLINEを送る方法をご紹介します。

IchigoJamBASICのみのプログラムでLINEが送れます!! 

ただ、カタカナ(日本語)で送るにはUTF-8に変換するプログラムをBASICで書く必要があります。そちらは<その2>のブログで紹介します。

hanadojo-sihan.hatenablog.com

 

<その3>では自宅のインターホン(呼び鈴)をIoT化しています。

hanadojo-sihan.hatenablog.com

 

 

今回はIFTTTを使って、IchigoJamからLINEでメッセージを送る方法を紹介!!

 

【目次】

 

1. 必要なもの

【一覧】

【概要】

f:id:hanadojo_sihan:20201012223704j:plain

IFTTTは複数のwebサービスを連携させるサービスです。

さまざまなサービスが連携できる「IFTTT(イフト)」の使い方 (1/3):IFTTT入門 - @IT

今回は「Webhoocks」と「LINE」を連携させます。

(IFTTTで連携させて新たにできたサービスを「アプレット(Applet)」と言います)

WebhoocksにMixJuiceで通信することが「トリガー(引き金)」となり、LINEにメッセージを送ります。メッセージはMixJuiceからGETメソッドのパラメータとして送信します。

 

2. IFTTTの手順

2-1 アカウント作成

IFTTTからアカウントを作成しましょう。

 

2-2 Applets(サービス連携)をつくる

(1)ホーム画面から「Create」→「Applets」を選択

f:id:hanadojo_sihan:20201012230220p:plain

(2)「If This」を選択

トリガーとなる「Webhoocks」を登録していきます。

f:id:hanadojo_sihan:20201012230224p:plain

(3)webと検索し「Webhoocks」を選択

f:id:hanadojo_sihan:20201012230229p:plain

(4)「Receive a Web request」を選択

f:id:hanadojo_sihan:20201012230236p:plain

(5)「Event Name」を決め「Create trigger」を選択

※今回のブログではEvent Nameを「test」にしています。

f:id:hanadojo_sihan:20201012230243p:plain

(6)「Then That」を選択

最終的に実行するサービスであるLINEを登録していきます。

f:id:hanadojo_sihan:20201012230249p:plain

(7)LINEと検索し「LINE」を選択

f:id:hanadojo_sihan:20201012230254p:plain

(8)「Send messagae」を選択

f:id:hanadojo_sihan:20201012230259p:plain

(9)「Continue」を選択

f:id:hanadojo_sihan:20201012230304p:plain

(10)「Applet Title」を決め「Finish」を選択

はじめから入力されているタイトルでいいと思います。

f:id:hanadojo_sihan:20201012230311p:plain

2-3 個別設定① - LINE -

(1)LINEのアイコンを選択

f:id:hanadojo_sihan:20201012230318p:plain

(2)「Connect」を選択

f:id:hanadojo_sihan:20201012230322p:plain

(3)IFTTTとLINEの連携にすることを同意する

f:id:hanadojo_sihan:20201012230329p:plain

下のようなメッセージがLINEに届いたらOKです。

f:id:hanadojo_sihan:20201012230336j:plain

 

2-4 Appletの設定

(1)ホーム画面から作成したAppletを選択

f:id:hanadojo_sihan:20201012230344p:plain

(2)「Connect」を選択

f:id:hanadojo_sihan:20201012230349p:plain

(3)「Settings」を選択

f:id:hanadojo_sihan:20201012230355p:plain

(4)下記画像のように設定

f:id:hanadojo_sihan:20201012230401p:plain

 

2-5 個別設定② - Webhoocks -

(1)Webhoocksのアイコンを選択

f:id:hanadojo_sihan:20201012230407p:plain

(2)「Documentation」を選択

f:id:hanadojo_sihan:20201012230412p:plain

(3)Appletが正常に作動するかテスト

f:id:hanadojo_sihan:20201012230416p:plain

{event}にWebhoockのイベント名、value1にLINEに送る文字列を入れましょう

f:id:hanadojo_sihan:20201012230424p:plain

試しに「hello」と送ってみましょう。

「Test It」を選択し、LINEにメッセージが届けばAppletの作成成功です!!

 

赤枠で囲んだURLにMixJuiceで通信することになります。

メモしておきましょう。

 

3. プログラム概要

【プログラム】

5 CLS:POKE#1E03,1,34:INPUT S

10 ?"MJ GETS maker.ifttt.com/trigger/イベント名/with/key/Webhoocksのkey?value1=";

20 FOR I=0 TO LEN(S)-1

30 ?STR$(S+I,1);

40 NEXT

50 ?:LC 0,10:?”>”;STR$(S):?

2-5(3) を見て、イベント名keyを入力しましょう。

【実行画面】

?
?に続けて"メッセージを打ち込んでエンターでLINEに送信されます。
?"Hello!
LINEに「Hello!」とメッセージが届いたら成功です!!
エラーコードが返ってきたら、10行目のURLの打ち間違いの可能性があります。
 

【プログラム解説】

5 CLS:POKE#1E03,1,34:INPUT S 文字列(メッセージ)を変数Sに入力

10 ?"MJ GETS maker.ifttt.com/trigger/イベント名/with/key/Webhoocksのkey?value1="; Webhoocksにvalue1のパラメータをGETメソッドで送信

20 FOR I=0 TO LEN(S)-1 文字列(メッセージ)の長さ分くりかえし

30 ?STR$(S+I,1); URLに文字列(メッセージ)を1文字ずつ付加する

40 NEXT 文字列(メッセージ)全て付加するまでくりかえし

50 ?:LC 0,10:?”>”;STR$(S):? シリアル通信+送信した文字列(メッセージ)を表示

5行目:INPUT命令で変数Sに文字列を代入する特別な方法を使用しています。

 
10行目2-5(3) を見て、イベント名とkeyを入力しましょう。
URLの最後に ?変数名=値 を付加することで送信することができます。
には文字列(メッセージ)が入るので、20行目以降で1文字づつ付加していきます。
 
20行目:変数Sに代入された文字列の長さ分くりかえす
LEN("文字列") 文字列の長さ(文字数)を返す <レングス>

30行目:変数Sに代入された文字列を1文字づつPRINT出力

STR$("文字列",数) PRINT内で文字列を返す。数で返す文字数を決める。<ストリング>

 

UARTコマンドを使えば、例えば「UART9」で画面表示だけOFF(シリアル出力はON)にできます。詳しくは https://fukuno.jig.jp/2689

 

4. 補足

最初にも書きましたが、カタカナ(日本語)を送る場合は、メッセージをUTF-8に変換して送る必要があります。

UTF-8に変換して送信するIchigoJamプログラムはできていますが、長くなったので、<その2>として記事を分けようと思います。

 

【連載記事一覧】

 

<その2>IchigoJamでUTF-8変換して日本語をLINEで送る方法 

<その3>呼び鈴を押すとLINEが届く「IoT呼び鈴」の作り方

<その4>SLEEP機能で「超省電力IoT」の作り方

 

CC BY Hana道場師範 / @shihan_hanadojo

twitter.com

【MixJuice × Ambient】センサーの値、ゲームのスコアをグラフ化!IchigoJamでIoT入門【NT鯖江2020】

f:id:hanadojo_sihan:20201004204657j:plain

IchigoJamをインターネットにつなげて川下りゲームのスコアをグラフ化!

 

NT鯖江2020にHana道場として出展しました!(10/3-4)

※NTとは「なにか・つくろう」の略

Hana道場ブースはIchigoJamとドローンのみ置いてあるだけだったので、SNT(その場で・なにか・つくろう)しました。出展中でもなにかつくる!

<今回SNTしたもの>

  1. GPS付きIoTプロダクト基板づくり
  2. 距離センサーで店番ドローン
  3. インターネットにつながった川下りゲーム

 

3の川下りゲームのスコアがグラフ化されるプログラムを解説していきます!

川下りゲーム自体の解説は、こちらでしています↓↓

hanadojo-sihan.hatenablog.com

 

【目次】

 

1.必要なもの

Ambientはマイコンから送信されたデータを蓄積・グラフ化するIoT可視化サービスです。アカウントとチャネルは無料で作れるので、IchigoJamとMixJuice(+WiFi環境)があればお金は掛かりません!(2020年10月現在)

 

2.プログラム概要

ファイル0番:川下りゲーム本体

ファイル1番:スコア送信

※1つのファイルにまとめてもらってもOK

※値送信→グラフ化のテストだけしたい方はファイル1番のみでOK

 

【ファイル0番:川下りゲーム本体】

5 CLS:VIDEO3:WAIT60
6 K=INKEY():IF K!=10 LC 0,5:?"エンター デ スタート":?"ハイスコア";PEEK(#FFF):CONT
10 CLS:CLT:VIDEO1:X=15
15 S=TICK()/60
20 LC X,5:?"🐱"
30 LC RND(32),23:?S
40 WAIT 4
50 X=X-BTN(28)+BTN(29)
60 X=X&31
70 IF SCR(X,5)=0 GOTO15
80 IF S>PEEK(#FFF) GSB@HS ELSE ?"スコア:";S
90 WAIT120
100 LRUN 1
200 @HS
210 VIDEO6
220 ?"ハイスコア!":?S:WAIT180
230 POKE #FFF,S
240 SAVE FILE()
250 RTN
0番にセーブしましょう。
グレーの部分はハイスコア保存部分です。不要な方は入れなくてOK!
NT鯖江の間での最高記録は117秒!ぜひ挑戦してみてください。
 

【ファイル1番:値送信プログラム】

IchigoJam + MixJuiceで製作するIoTセンサを参考に作成しました。

10 CLS:P=#C00:UART1

20 ?"MJ PCT application/json"

30 ?"MJ POST START ambidata.io/api/v2/channels/チャネルID/data"

35 GSB@TX

40 '{"writeKey":"ライトキー","d1":"#"}

50 ?"MJ POST END"

100 LRUN 0

500 @TX

510 IF PEEK(P)!=ASC("'") P=P+1:CONT

520 P=P+1:IF PEEK(P)=ASC("#") ?S;:CONT

530 IF PEEK(P)!=0 ?CHR$(PEEK(P));:GOTO520

540 ?:RTN

Ambientの「チャネル一覧」からグラフ化したいチャネルのIDとライトキーをプログラムに追記すればプログラム完成です!1番に保存しましょう。

f:id:hanadojo_sihan:20201004223202p:plainそもそもMixJuiceの使い方(接続方法、ネットワークにつなぎ方など)が分からない方は下記サイトからご確認ください。

 

3.Ambientの使い方

川下りゲームのスコアをグラフ化するために、Ambientで設定をしていきましょう。

  1. 「チャネル一覧」からチャネルを選択(クリック)
  2. 画面上部の「グラフ+」のアイコンをクリックし「チャネル/データ設定」をクリック
  3. 「チャート設定」から下記画像のように入力

f:id:hanadojo_sihan:20201004230317p:plain

参考:Ambientを使ってみる – Ambient

 
公開チャネルに設定すると誰でもグラフを見ることができるようになります。 
「チャネル一覧」→「設定変更」→「公開チャネル」にチェック
※チャネルを公開するにはユーザー名を設定する必要があるようです。
 
これで完成!!(プログラムの仕組みが気になる方は4へ)
IchigoJamから送信してからグラフに反映されるのに15秒ほど掛かります。
 
CSV形式でダウンロードもできます!
「チャネル一覧」→「ダウンロード」
センサーと組み合わせて、気温や湿度などのグラフ化にも挑戦してみてください!
 
人感センサー(超音波センサー)と組み合わせた例↓↓

 

4.プログラム解説

【ファイル0番:川下りゲーム本体】

5 CLS:VIDEO3:WAIT60 ビデオ画面を2倍サイズにして1秒まつ
6 K=INKEY():IF K!=10 LC 0,5:?"エンター デ スタート":?"ハイスコア";PEEK(#FFF):CONT
エンターを押すまで待機。ハイスコア(メモリ#FFFに保存してある値)を表示
10 CLS:CLT:VIDEO1:X=15 ビデオ画面を通常サイズにする
15 S=TICK()/60 経過時間(スコア)を秒にして変数Sに保存
20 LC X,5:?"🐱" X,5の位置に、ネコを表示
30 LC RND(32),23:?S
0-31の中でランダム,23の位置に、経過時間を表示
40 WAIT 4 スピード
50 X=X-BTN(28)+BTN(29) ←→キー操作 
60 X=X&31 変数Xが0より小さくなったら31に、31より大きくなったら0にする
70 IF SCR(X,5)=0 GOTO15 ネコが経過時間に当たるまでゲーム続行
80 IF S>PEEK(#FFF) GSB@HS ELSE ?"スコア:";S
スコアがハイスコア(メモリ#FFFに保存してある値)より大きかったらサブルーチン@HSを呼び出す。大きくなかったらスコアを表示
90 WAIT120
100 LRUN 1 ファイル1番のプログラムをLOADしてRUN
200 @HS 200行目以降HSというハイスコア更新時のサブルーチン
210 VIDEO6 白黒反転の画面サイズ4倍にする
220 ?"ハイスコア!":?S:WAIT180
230 POKE #FFF,S メモリ#FFFに変数Sの値を書き込む
240 SAVE FILE() 現在のファイル番号にSAVE
250 RTN サブルーチン呼び出し元(GSB)へもどる

ハイスコアの保存以外は普通の川下りゲームとほとんど変わりませんが、敵が経過時間です!

 

ハイスコアの保存プログラムを入れると、電源を切ったとしてもハイスコアごと保存されます(メモリのプログラム領域#FFFに保存しているため)。再びLOADすればハイスコアが残っていることが分かります。

参考:メモリマップ - イチゴジャム レシピ

 

【ファイル1番:値送信プログラム】

ⅰ) MixJuiceで値を送信するプログラム

10 CLS:P=#C00:UART1 変数Pはプログラム領域のメモリアドレス

20 ?"MJ PCT application/json通信のタイプを設定

30 ?"MJ POST START ambidata.io/api/v2/channels/チャネルID/data"

POST通信開始(START以降のURLに通信する)

35 GSB@TX サブルーチンTXを呼び出す

40 '{"writeKey":"ライトキー","d1":"#"}

JSON形式で、キー名はd1、値はスコア(変数S)をAmbientへ送信する。#は目印のようなもの

50 ?"MJ POST END"  POST通信を終了

30行目:START以降のURLは大文字・小文字を間違えずに打ちましょう。エラーコードが返ってきた場合は打ち間違いの可能性大です。

40行目JSON形式でデータを送ります。{キー名:値,キー名:値,…}のようにキー名と値をセットで記述します。

キー名d1の値(=スコア)が#になっている理由と`を使っている理由は(ⅲ)で書きます。

参考:JSONの形式を完全理解して読み書きできるようになるための記事 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

ⅱ) ファイル移行

100 LRUN 0 0番のプログラムをLOADしてRUN

Ambientへ送信が終了したら川下りゲームのスタート画面にもどるようにします。

ⅲ) 40行目のプログラムをPRINT出力するプログラム

500 @TX 40行目をPRINT出力するためのサブルーチンTX

510 IF PEEK(P)!=ASC("'") P=P+1:CONT ' を見つけるまで変数Pを更新し続ける

520 P=P+1:IF PEEK(P)=ASC("#") ?S;:CONT #を見つけたら#の代わりに変数SをPRINT出力

530 IF PEEK(P)!=0 ?CHR$(PEEK(P));:GOTO520 終了コード0を見つけるまでPRINT出力

540 ?:RTN 改行して、呼び出し元にもどる

MixJuiceのMJコマンドはPRINT出力することで実行されます。

 例:?"MJ APL"

20,30,50行目のプログラムは、PRINT(?)出力でMJコマンドを実行しています。

 

<なぜ40行目だけ処理が難しい(違う)のか>

 

理由:40行目だけ  "  が使われているため

 

40行目を20,30,50行目と同じように、?で書くとこのようになります。

40 ? "{"writeKey":"ライトキー","d1":"#"}"

JSON形式では、キー名と値(文字列の場合)は""で囲む必要があるので、

?命令の""の中にさらに"を書くことになります。

?"""
Syntax error 

(例1 errorの原因は、?""で完結しているのにその後ろにさらに"があるから)

40 ? "{"writeKey":"ライトキー","d1":"#"}"
{Syntax error in 40

(例2 errorの原因は、?"{"で完結しているのにその後ろにwriteKEY...と文字列が続いているため) 

Syntax errorを防ぐため、500行目以降の処理でPRINT出力をしています。

 

<500行目以降のTXサブルーチン解説>

510行目:'を見つけるまで変数P(メモリのアドレス)を更新し続ける。

520、530行目:行の最後のメモリの値は終了コードといって、0が保存されています。変数Pの値が0のときは、行の最後までPRINT出力が完了したことになります。

次の文字が#の場合のみ、520行目で(#の代わりに)変数Sを出力しています。

つまり{d1:S}となり変数Sの値をキー名d1としてAmbientへ送ることができるという訳です。

 

結論:MixJuiceでJSON形式で送るには、500行目以降のようにプログラムのメモリ領域から読み込んでPRINT出力をする必要がある(他に方法あるかも?)

 

5.まとめ

4.プログラム解説をちゃんと理解しようと思うと、IchigoJamのメモリマップやMixJuiceのネットワーク(GET,POST)やデータ形式JSON)の知識も必要になります。IchigoJamのステップアップ、IoT入門として良い教材かも!?

 

<やってみよう>

  1. d1だけでなくd2,d3の値も送信してみよう!
  2. センサーと組み合わせてIoTを作ってみよう!

 

質問やご指摘はTwitterからお願いします。

CC BY Hana道場師範 / @shihan_hanadojo

twitter.com 

<参考リンク>

IchigoJam + MixJuiceで製作するIoTセンサ

Ambientを使ってみる – Ambient

準備・使い方 - イチゴジャム レシピ

メモリマップ - イチゴジャム レシピ

JSONの形式を完全理解して読み書きできるようになるための記事 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

初心に返って王道「川下りゲーム」徹底解説!!for IchigoJam【「寺子屋Hana」開所記念】

f:id:hanadojo_sihan:20200928212731j:plain

Hana道場の横展開としてSAPジャパンが支援し寺子屋Hana福島県会津若松に設立しました!!2020.9.26

Hana道場公式ブログに詳細あり

 

また9月26日は私、師範の誕生日でもあり、私がIchigoJamでプログラミングを始めてちょうど3年が経ちました!

とてもアニバーサリーな日なので、初心に返って王道プログラム「川下りゲーム」を徹底解説していこうと思います。

新たに子どもたちにIchigoJamプログラミングを教えたい人の一助になれば幸いです。

 

【目次】

 

1. 川下りゲームについて

川下りゲームはIchigoJamでプログラミングを始める人が最初に作る入門的プログラムです。とても短いプログラムの中に、アプリ(ゲーム)作りで大切な要素が詰まっており、1行づつ打ち込んで実行しながらゲームが出来上がっていく過程を体験できます。

鯖江市の小学校の総合学習の授業でも川下りゲームをつくります)

fukuno.jig.jp

 

2. プログラム概要

【プログラム】

10 CLS:X=15
20 LC X,5:?"0"
30 LC RND(32),23:?"*"
35 WAIT 3
36 X=X-BTN(28)+BTN(29)
39 IF SCR(X,5) END
40 GOTO 20
(CC BY 福野泰介)
 
【日本語訳付きプログラム】
<初期設定>
10 CLS:X=15 画面を消す:変数Xに15を記憶させる
<自分のキャラ表示>
20 LC X,5:?"0" 横にX,縦に5の位置に:0 を表示
<敵のキャラ表示>
30 LC RND(32),23:?"*" 横に0〜31の中からランダム,縦に23の位置に:* を表示
<スピード調整>
35 WAIT 3 3(1/20秒)まつ
<キャラの移動操作>
36 X=X-BTN(28)+BTN(29) 自キャラを←キーを押すと左に、→キーを押すと右に移動
<当たり判定>
39 IF SCR(X,5) END もし 自キャラの位置に何かあったら プログラム終了
<繰り返し>
40 GOTO 20 20行目にいく
 
このように、各行で何をしているか理解できたらとりあえずOK!
ちゃんと川下りゲームのプログラムを理解したい方は続きをご覧ください。
 

3. 実行結果と解説(1行づつ)

<初期設定>10行目
10 CLS:X=15 画面を消す:変数Xに15を記憶させる

CLS 画面を消す(ショートカットキーはF1) <クリア・スクリーン>
変数 = 数 変数に数を記憶させる <イコール>
: 命令と命令を連結させる(左から順番に実行) <コロン>
CLS で画面を消します。:で続けて
X=15 で変数Xに15を記憶させます。
 
?X で変数Xを画面に表示すると15を記憶していることがわかります。
 
<自分のキャラ表示>20行目
20 LC X,5:?"0" 横にX,縦に5の位置に:0 を表示

LOCATE ヨコ,タテ 表示する位置を決める(省略形:LC) <ロケート>
PRINT 文字列や数 画面に文字列や数を表示する(省略形:?) <プリント>
 左上から横にX,縦に5の位置に、自分のキャラ「0」を表示します。

f:id:hanadojo_sihan:20200928230038p:plain

IchigoJamの画面は左上が0,0で、右方向に31、下方向に23まで座標があります。
変数Xには10行目で15を記憶させているので、横に15,縦に5の位置に表示されます。
 
<敵のキャラ表示>30行目
30 LC RND(32),23:?"*" 横に0〜31の中からランダム,縦に23の位置に:* を表示

RND(数) 0〜数-1の中からランダムに1つ数を返す <ランダム>
横に0〜31のどれかランダム,縦に23の位置に、敵のキャラ「*」を表示します。

f:id:hanadojo_sihan:20200928230953p:plain

RND(32) は0〜31の32個から1つランダムに返します。
F5(RUNのショートカット)キーを連打すると、横はランダムに、縦は23固定で敵キャラが表示されます。
 
<繰り返し>40行目
40 GOTO 20 20行目にいく

 

 

35〜39行目を飛ばして、40行目の繰り返しを入力し実行します。

*が上方向に高速スクロールしていく様子に、子どもたちは驚き、喜びます!
コンピューターの計算速度を肌で実感してもらうためにあえて40行目を先に入力しています。
 
なぜ、上スクロールするのか解説します。
 
画面に表示するPRINT(省略形:?)命令は、表示した後に「改行」をしています。
敵キャラ*を画面一番下の23の位置に表示して「改行」しています。
画面一番下で改行すると、IchigoJamの仕様上、画面全体を1つ上にスクロールします。

 

↑の改行デモの前半では、手動で*を打ってエンターを押しています。

後半では、川下りゲームのアニメーションをWAIT60にして1秒おきに*を表示しています。画面一番下に*を表示して改行されて上にスクロールしていくのがわかりますね。 
 
結論:画面の一番下に表示を繰り返すことで、改行によって画面全体が上にスクロールする
 
自分のキャラ「0」も上に上がるので、5個連なっているような表示になります。
 
<スピード調整>35行目
35 WAIT 3 3(1/20秒)まつ

 

WAITを入れることで、*を表示する間隔が長くなります。

コンピューターの速度は人間には速すぎるので、WAITで待ってもらいましょうねと言っています。

 

<キャラの移動操作>36行目
36 X=X-BTN(28)+BTN(29) 自キャラを←キーを押すと左に、→キーを押すと右に移動

BTN(数) 数でキーを指定し、指定されたキーを押すと1、それ以外で0を返す <ボタン>

キーボードのキーにはそれぞれ番号が決まっています。

←キーは28番、→キーは29番です。

BTN(28) は←キーを押すと1に、押してないと0を返します。

←キーを押したときの36行目

36 X=X-1+0

変数Xを-1して記憶し直します。自分のキャラが左に1マス移動します。

→キーを押したときの36行目

36 X=X-0+1

変数Xを+1して記憶し直します。自分のキャラが右に1マス移動します。

 

<当たり判定>39行目
39 IF SCR(X,5) END もし 自キャラの位置に何かあったら プログラム終了

SCR(ヨコ,タテ) 指定した位置にある文字の番号を返す <スクリーン>
SCR(X,5) は自分のキャラの位置に何の文字があるか調べます。
何もない時は0を返します。
(ちなみに敵キャラ*の番号は42番です。番号表はこちら
IF 数 命令 数が0以外の時、命令を実行(数が0の時は、何もせず次の行へいく) <イフ>
39行目を入れることで、
もし SCR(X,5)が何か数を返したら プログラムを終了
→ もし 自分のキャラの位置に何か文字があったら プログラムを終了 
 
当たり判定をつけて、ゲームが完成しました!!
 

4. バグについて

バグの理由

実は、この状態だとバグがあります。

何人かの子どもたちはバグを見つけてニヤニヤしていることでしょう。

 

左右の端にいくと敵に当たらない<無敵バグ>が起こります。

 

なぜ<無敵バグ>が起こるのか、解説します。

結論:自分のキャラが画面外にいってしまっているから。

f:id:hanadojo_sihan:20200929000434j:plain

f:id:hanadojo_sihan:20200929000440j:plain

画面左端は0ですが、さらに←キーを押すとXがマイナスの値になります。

画面上には0の位置にいるように表示されますが、実際の座標はマイナスになっており、0〜31に表示される*には永遠に当たらなくなります。

(右端も同じように31にいるように表示されていても実際は32以上になっています)

 

バグを解消しよう! 

プログラムの穴(バグ)をついて、不正しているプレイヤーを「チーター」と言います。子どもたちは大体チーターという言葉を知っていて、なぜか喜びます。

チーター対策としてバグを直すのもプログラマーの仕事だよと言いながら、バグ修正のプログラムを教えます。

短いバージョンと長いバージョンの2つご紹介します。どちらも同じ動きになります。

 

短いプログラム

37 X=X&31
短いですが、理解するのは少し難しいです。&のリファレンス
また別の機会に解説しようと思います。
 

長いプログラム

37 IF X<0 X=31
38 IF X>31 X=0
2行必要になりますが、意味はわかりやすいです。
37 IF X<0 X=31 もし Xが0より小さくなったら Xに31を記憶させる
38 IF X>31 X=0 もし Xが31より大きくなったら Xに0を記憶させる
 
↓実行画面↓ 両端に行ってみましょう、どうなる?
 
無敵バグを直したがらない子どもも出てきます。
そういう時は「ワープ機能をつけよう」と言って37行目以降を入力してもらいましょう(嘘はついていません笑)
 
これで、川下りゲームの完成です!!
全員立ってもらって、同時にF5で実行し、敵に当たったら座っていくゲーム大会をすると盛り上がりますよ!!
 

5. まとめ

1つでもプログラムの原理を理解すると、他にも応用が効くようになっていきます。

あとは自分でも改造、実験(仮説と実装の繰り返し)をしながら、遊びつつ学んでいきましょう!

仮説を即実装できるのがIchigoJamの良いところ!何度間違えてもコンピューターは怒りません。

 

川下りゲームのおすすめの改造方法は別の記事で紹介しようと思います。

 

<やってみよう>

  1. 自分のキャラを変える
  2. 敵のキャラを変える
  3. スピードをゆっくりにする
  4. CLTとTICK()を使ってタイムを表示

 

CC BY Hana道場師範 / @shihan_hanadojo

twitter.com

Twitterのフォローもよろしくお願いします^^

【文字列の代入】体験イベントで活躍した『お絵かきゲームのお題生成プログラム』 for IchigoJam

f:id:hanadojo_sihan:20200908011242j:plain

 

お絵かきゲームのお題を生成するプログラムを紹介します。

イベントなどで自由にIchigoJamで遊んでもらうときに便利です。

f:id:hanadojo_sihan:20200908011826j:plain

↑Hana道場4周年イベントの様子です。

写真左下のMeganeJamの0番にお題生成プログラムが保存されています。

MeganeJamのモニターにお絵かきゲームのお題が表示され、それに合わせてお絵かきバトル!!(MeganeJamのボタンを押すと次のお題が表示)

誰が上手いかはお母さんがジャッジしていました笑

IchigoJam初心者でも放っておいても大丈夫!無料体験イベントなどでおすすめです。

 

【プログラム】

5 CLS:VIDEO 5:T=180

10 LET[0],"リンゴ","アメ","ゾウ","ニホン","フクイ","キリン","ハル","ナツ","アキ","フユ"

20 R=RND(10)

30 LC 0,0:?"オダイハ.."

40 IF BTN(32)=0 BEEP RND(50):CONT

50 ?STR$([R]):BEEP

60 WAIT120:BEEP60

70 ?"ヨウイ";:WAIT60:?"スタート!":BEEP20,60

80 CLT

90 LC 0,0:?"ノコリ";T-TICK()/60;"  "

100 IF T-TICK()/60>0 GOTO90

110 LC 0,2:?"シュウリョウ!!":BEEP20,120

 

<使い方>

スペースを押すと、10行目で指定した文字列がランダムに一つ表示されます。

そして3分間時間を測ってくれます。

 

<解説>

T:制限時間 R:0〜9の乱数

[0]〜[9]:お題の文字列

5 CLS:VIDEO 5:T=180 画面サイズを5、制限時間を180秒に設定

10 LET[0],"リンゴ","アメ","ゾウ","ニホン","フクイ","キリン","ハル","ナツ","アキ","フユ" お題を配列に代入

20 R=RND(10) 0〜9のうちランダムに一つを変数Rに代入

30 LC 0,0:?"オダイハ.."

40 IF BTN(32)=0 BEEP RND(50):CONT スペースを押すまで、くりかえし

50 ?STR$([R]):BEEP [0]〜[9]のうちランダムに一つ文字列として表示

60 WAIT120:BEEP60

70 ?"ヨウイ";:WAIT60:?"スタート!":BEEP20,60 開始のベル

80 CLT

90 LC 0,0:?"ノコリ";T-TICK()/60;"  ←スペース2つ分

100 IF T-TICK()/60>0 GOTO90 残り時間が0になるまでくりかえし

110 LC 0,2:?"シュウリョウ!!":BEEP20,120 終了のベル

STR$(数1{,数2})  PRINT内で、文字列を返す(数2(省略可)で長さ指定) 

数1の部分に文字列を代入した変数を入れましょう。

 

変数や配列に代入した文字列の表示は、下のようにします。

10 [0]="リンゴ" 文字列の代入
20 ?STR$([0]) 代入した文字列の表示
RUN
リンゴ

配列は[0]〜[101]まであるので、お題(文字列)を102個保存可能!! 

 

<やってみよう>

  1. お題の追加(10行目)
  2. 制限時間の変更(5行目)
  3. 1つ目のお題終了後、次のお題が表示されるようにする
  4. 同じお題が表示されないようにする

Hana道場4周年の時は、<やってみよう>の4までできたプログラムで行いました。

チャレンジしてみてください!

 

CC BY Hana道場師範 / @shihan_hanadojo

twitter.com

 

<追記>2020/9/23

複数人で行う「プログラミングお絵かきバトル」が白熱!!

プログラミング能力とデザインセンスが試される!?

 

3分の中でならお絵かきプログラムを書き換えOK!

必要な機能を実装しながらお絵かきを楽しもう✨