感謝を込めて「2人対戦型ヘビゲーム」をプレゼント【IchigoJam】
感謝を込めて僕からのゲームのプレゼントです!!
2 OK2
5 CLS:CLV:X=#A50:Y=#A4F:C=236:D=237:K=29:L=65:S=2:T=2:F=1:G=1:B=101
10 POKE#900,6:POKE#91F,6
20 COPY#920,#900,32*21
30 COPY#901,#900,31
40 COPY#BA1,#BA0,31
100 R=RND(32*22)+#900
110 IF PEEK(R)||R=X||R=Y GOTO100 ELSE POKE R,255
120 POKE X,C:POKE Y,D
130 IF F=2 POKE#A4F,0,0
140 IF F=S POKE[A],0:[A]=X:A=A+1:A=A%S
150 IF G=T POKE[B],0:[B]=Y:E=E+1:B=101-E%T
160 J=INKEY():IF J>27&&J<32 K=J ELSE IF J=65||J=68||J=87||J=83 L=J
170 X=X-(K=28)+(K=29)-32*(K=30)+32*(K=31)
180 Y=Y-(L=65)+(L=68)-32*(L=87)+32*(L=83)
190 IF PEEK(X)=255 S=S+1:F=F+1:GOTO100
200 IF PEEK(Y)=255 T=T+1:G=G+1:GOTO100
210 IF PEEK(X) GSB@DRAW:?"👾 WIN!!":END
220 IF PEEK(Y) ?"🐱 WIN!!":END
230 IF S>F F=F+1
240 IF T>G G=G+1
250 GOTO120
1000 @DRAW
1100 IF ABS(X-Y)<3||PEEK(Y) ?"DRAW...":END
1200 RTN
▼ゲームをプレイしたい方▼
2人対戦型ヘビゲーム(IchigoJam web)
<遊び方>
プレイヤー1(クラゲ)、プレイヤー2ネコ)に分かれて戦います。
先頭のキャラが何か(壁、敵、自分)に当たってしまうとゲームオーバーです。
フィールドにあるイチゴをとると、味方が1体増えます。
どちらかが当たるまでゲームは続きます。
<操作方法>
■プレイヤー1(クラゲ)
左移動:Aキー
右移動:Dキー
上移動:Wキー
下移動:Sキー
■プレイヤー2(ネコ)
左移動:←キー
右移動:→キー
上移動:↑キー
下移動:↓キー
難しかったら行番号120〜250の間にWAITを入れてね!
▼一人用ヘビゲームをプレイと解説を見たかったらこちらへ▼
hanadojo-sihan.hatenablog.com
そしてIchigoJam8周年おめでとうございます!
これからもよろしくお願いします!
CC BY shoichi1031da / @shoichi1031da
【IchigoJamとGASでIoT入門(3)】タイピングゲームのスコアをスプレッドシートにセルに入力する
IchigoJamとGASによるIoT入門第3弾!
GETリクエストで受け取ったパラメータをスプレッドシートのセルに自動入力に挑戦します。
IchigoJamのA〜Zを打つタイムを競う「タイピングゲーム」のスコアをスプレッドシートで管理します。
まず、スプレッドシートを用意します。
(ここでは「typing_log」というシート名にしています)
セルA1,A2それぞれに「名前」「タイム(秒)」を入力しておきます。
そして「拡張機能」→「Apps Script」をクリックし、エディタを開きます。
①タイピングゲームのプレイヤーの「名前」をパラメータNAMEとして受け取り、A1列のセルに自動入力する
【GASプログラム】
//(IchigoJamからの)GETリクエスト処理 function doGet(e){ let name = e.parameter.NAME; //パラメータNAMEの値を変数nameに格納 setVal(name); //setVal関数に変数nameを渡す return ContentService.createTextOutput(JSON.stringify("completed")); } // スプレッドシートへの入力 function setVal(name) { // 現在開いているスプレッドシートを取得 let spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // 現在開いているシートを取得 let sheet = spreadsheet.getActiveSheet(); // データがある最終行を取得 let lastRow = sheet.getDataRange().getLastRow(); // セルに入力する値を変数dataに格納 let data = [[name]]; // シートの、最終行を指定し、データ(名前)を入力 sheet.getRange(1+lastRow,1,1,1).setValues(data); //getRange(入力する行, 入力する列 ,入力する行数 ,入力する列数) }
保存して、デプロイしましょう。
ブラウザのアドレスバーにウェブアプリのURLを貼り付けて「?NAME=test」を追加してエンターを押しましょう。
https: //script.google.com/macros/s/(中略)/exec?NAME=test
セルA2に「test」と入力されていたら成功です!
②タイピングゲームの「タイム」をパラメータTIMEとして受け取り、A2セルに自動入力する
【GASプログラム】
let time = e.parameter.TIME; //パラメータTIMEの値を変数timeに格納 setVal(name,time); //setVal関数に変数nameとtimeを渡す
return ContentService.createTextOutput(JSON.stringify("completed"));
}
// スプレッドシートへの入力 function setVal(name,time) {
// 現在開いているスプレッドシートを取得
let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// 現在開いているシートを取得
let sheet = spreadsheet.getActiveSheet();
// データがある最終行を取得
let lastRow = sheet.getDataRange().getLastRow();
// セルに入力する値を変数dataに格納 let data = [[name,time]]; // シートの、最終行を指定し、データ(名前)を入力 sheet.getRange(1+lastRow,1,1,2).setValues(data); //getRange(入力する行, 入力する列 ,入力する行数 ,入力する列数) }
保存してデプロイしましょう。
ブラウザのアドレスバーにウェブアプリのURLにパラメータTIMEを追加します。
https ://script.google.com/macros/s/(中略)/exec?NAME=test&&TIME=100
タイムが追加されていたら成功です!
③IchigoJamでタイピングゲームを作り、名前とタイムをウェブアプリに送る
【IchigoJamプログラム】
20 ?CHR$(N);
30 IF INKEY()!=N GOTO30
40 N=N+1:IF N<91 GOTO20
50 T=TICK()/60
60 ?:?T
100 ?"MJ GETS script.google.com/macros/s/(中略)/exec?NAME=test&&TIME=";T
④日時を取得し追加する
セルA1に「日時」を追加しましょう。
setVal関数内のプログラムを修正します。
// セルに入力する値を変数dataに格納 let now = getNow(); let data = [[now,name,time]]; // シートの、最終行を指定し、データ(名前)を入力 sheet.getRange(1+lastRow,1,1,3).setValues(data); //getRange(入力する行, 入力する列 ,入力する行数 ,入力する列数) }
getNow関数を追加します。
//日時の取得 function getNow() { let d = new Date(); let year = d.getFullYear(); let month = d.getMonth() + 1; let day = d.getDate(); let now = year + "/" + month + "/" + day; return now; }
これでウェブアプリにGETリクエストがあった日時を取得し、セルに追加することができます。
まとめ
ウェブアプリに送られてきたパラメータをスプレッドシートのセルに自動入力するプログラムをご紹介しました。
名前のパラメータで区別すれば、大勢の子供たちと同時にタイムの競うイベントもできますね!
また温度センサーと組み合わせれば日々の温度の自動管理や、距離センサーと組み合わせればIoT人流カウンターにも活用できます。
ぜひ、アイデアを出してオリジナルIoTを作成してみてください!
CC BY shoichi1031da / @shoichi1031da
【IchigoJamとGASでIoT入門(2)】GETリクエストのパラメータでGmailの本文の内容を選択する
前回の記事では、GETリクエストを送ると自動でGmailを送るウェブアプリをGASで作成しました。
hanadojo-sihan.hatenablog.com
前回は入門ということで、シンプルなプログラムにするため1つの本文しか送りませんでしたが、
今回は、送るメール本文を複数選択できるようなアプリにアップデートします。
目次
HTTP通信について
HTTPは「HyperText Transfer Protocol」の略で、クライアントとサーバーの間でハイパーテキストを転送するための通信プロトコルです。
ウェブサイト(アプリ)を利用する際、自分のパソコンからwebサーバーに「リクエスト」を送っています。
今回は「GETメソッド」という方法でGASで作ったウェブアプリにリクエストを送ります。
パラメータについて
GETメソッドではURLの末尾に「パラメータ」を記述することで、値を送ることができます。
- 1つのパラメータを送る場合:?パラメータ名=値
- 複数のパラメータを送る場合:?パラメータ名1=値1&パラメータ名2=値2&・・・
パラメータ名は任意で決めることができます。
今回は「msg」というパラメータ名を使うことにします(messageの略)。
値は「1」,「2」,「3」の3種類の値を送る想定でつくります。
GASのプログラム
プログラム全体
// GETリクエストに対する処理 function doGet(e){ let message = e.parameter.msg; //パラメータ名msgの値を取得 sendMessage(message); //sendMessage関数に変数messageを渡す return ContentService.createTextOutput("'sended."); } // 送信するメール内容の決定 function sendMessage(message) { let address = '*******@gmail.com'; //送信先メールアドレス let subject = "***";//件名 let body; if(message === "1"){ body = "迎えに来て!"; } else if(message === "2"){ body = "行ってきます!"; } else if(message === "3"){ body = "ただいま!"; } GmailApp.sendEmail(address, subject, body); }
解説1)パラメータの処理
// GETリクエストに対する処理 function doGet(e){ let message = e.parameter.msg; //パラメータ名msgの値を取得 sendMessage(message); //sendMessage関数に変数messageを渡す return ContentService.createTextOutput("'sended."); }
doGet関数はウェブアプリにGETリクエストがあった時に動作する関数です。doGet引数の「e」にパラメータに関するデータが格納されています。
「e.parameter.パラメータ名」で値を受け取ることができます。
今回はGETリクエストで送った値をmessageという変数に格納し、sendMessage関数に実引数として渡します。
解説2)送るメール本文の決定処理
// 送信するメール内容の決定 function sendMessage(message) { let address = '*******@gmail.com'; //送信先メールアドレス let subject = "***";//件名 let body; if(message === "1"){ body = "迎えに来て!"; } else if(message === "2"){ body = "行ってきます!"; } else if(message === "3"){ body = "ただいま!"; } GmailApp.sendEmail(address, subject, body); }
「1」の値を受け取った時には「迎えに来て!」
「2」の値を受け取った時には「行ってきます!」
「3」の値を受け取った時には「ただいま!」という本文のメールを送るプログラムにしました。
※値は文字列として受け取るので、ifの条件式では""で囲んでいます。
それでは、デプロイしてウェブアプリを公開しましょう。
ブラウザのアドレスバーにウェブアプリのURLを貼り付け、そのURLに続けて「?msg=3」を加えてEnterキーを押しましょう。
「ただいま!」とメールが届けば成功です!
IchigoJamからウェブアプリにGETリクエスト(パラメータ付き)を送る
IchigoJam webから送ってみる
(IchigoJam webの使い方は前回のブログを参照)
URLの末尾に「?msg=3」をつけて実行してみましょう。
「ただいま!」とメールが届けば成功です!
20 INPUT "ムカエニキテ:1 イッテキマス:2 タダイマ:3 ",A
30 ?"MJ GETS script.google.com/(中略)/exec?msg=";A
INPUT命令で1〜3どれかを打ち込んでエンターを押せば、そのメッセージがメール本文として送れるようになります!
INPUT命令で変数Aに1〜3の数が代入され、行番号30の最後に「;A」とすることで、パラメータとしてURLに付加することができます。
(行番号20の入力待ち画面)
(2と入力した時)
今回は3つのメッセージ(1〜3)を用意しましたが、もっと多くのメッセージを用意することができますね。
これでメールアドレスを持っていないお子さんもIchigoJamからメールを送れるようになります!
IchigoJam 実機から「キーボード・モニターなし」でGmailを送る
送るメッセージ選択をINポートとジャンパー線1本を使って行う方法を紹介します。
IN1とGNDを接続 → 1番のメッセージを送る(パラメータとして1を送信)
IN2とGNDを接続 → 2番のメッセージを送る(パラメータとして2を送信)
IN4とGNDを接続 → 3番のメッセージを送る(パラメータとして3を送信)
※IN3は初期状態が0のため今回は使用しません
プログラム
プログラム解説
20 もし BTNポートにGNDが接続されているときは この行を繰り返す
30 IN1〜4の状態を調べるためのFOR文(変数IはINのポート番号に対応)
40 IN3ポートは使用しない
50 INポートが0の時(GNDに接続されている時) 変数VにINのポート番号(変数I)を格納
60 変数Iが4未満の時、行番号30に戻る
70 もし 変数Vに4が格納されている時は 変数Vに3を格納する
80 もし 変数Vに何も格納されていない時は 行番号30に戻る
90 変数Vの値をパラメータとしてウェブアプリにGETリクエストを送る
100 音を鳴らして終了
実行方法
上記のプログラムを0番にSAVEし、電源を切りましょう。
ジャンパー線をBTNポートとGNDポートに接続しましょう。
BTN-GNDを接続すると、プログラムの自動実行の際にIchigoJamのボタンを押しておく必要がなくなります。
(また、プログラムを使用しない時のジャンパー線の収納場所として使えます)
IchigoJamの電源を入れるだけで、0番に保存したプログラムが自動実行します。
BTNポートにさしてあるジャンパー線を抜き、IN1かIN2かIN4に差し込みましょう。
これで、IchigoJamだけ(キーボード、モニターなし)でGmailの本文を選択し送ることができます!
まとめ
今回は、GETメソッドというリクエスト方法を使って、パラメータをウェブアプリに送る方法を紹介しました。そしてウェブアプリ側で受け取ったパラメータによって、送るメールの本文内容を変えるGASのプログラムも作成しました。
実践的なHTTP入門としてもご利用いただければ幸いです。
次回はタイピングゲームのスコアをパラメータとして受け取り、スプレッドシートに入力するウェブアプリを作成します。
【IchigoJamとGASでIoT入門(3)】タイピングゲームのスコアをスプレッドシートにセルに入力する - Hana道場【師範】のブログ
<IchigoJam IoTシリーズ>※GAS以外の方法
CC BY shoichi1031da / @shoichi1031da
【IchigoJamとGASでIoT入門(1)】Gmail自動送信ウェブアプリの作成
IchigoJam(+ MixJuice)とGASを組み合わせたIoT入門シリーズになります。
GAS(Google Apps Script)とは、Googleが提供しているJavaScriptをベースにしたプログラミング言語です。
Googleアカウントを持っている人なら無料で使え、ウェブアプリとしても公開することができます。
今回はGASで自動でGmailを送信する簡単なウェブアプリを作成します。
GAS入門の参考:
Google Apps Script(GAS)とは?できることから始め方までの基本|アナグラム株式会社
<必要なもの>
- IchigoJam web ※無料 (もしくはIchigoJam実機とMixJuice実機)
<つくるもの>
目次
GASでGmailを送るウェブアプリをつくる
まずは「URLにアクセスするとそれがトリガーとなり、自動でGmailが送られるウェブアプリ」を作ります。
Googleドライブから「Google Apps Script」を開きましょう。
エディタが開きます。
ウェブアプリにアクセスするとGmailを送るプログラムは下記の通りです。
【GASプログラム】
// GETリクエストに対する処理 function doGet(e){ sendMessage(); return ContentService.createTextOutput("'sended.\n");//ウェブアプリの実行(Gmail送信)が完了した際の表記 } // Gmailの設定 function sendMessage() { let address = "********@gmail.com"; //送信先のGmailのアドレスを入力してください let subject = "***"; //送信するメールの件名を入力してください let body = "***********"; //送信するメールの本文を入力してください GmailApp.sendEmail(address, subject, body); //Gmailを送るメソッド }
ウェブアプリのプログラムができました!
「プロジェクトを保存する」をクリックして保存しましょう。
プロジェクト名も自由に決めてください。
ウェブアプリの公開
「デプロイ」→「新しいデプロイ」を選択
「歯車マーク」→「ウェブアプリ」を選択
「アクセスできるユーザー」を「全員」に設定 →「デプロイ」を選択
プロジェクト内で初めてウェブアプリを公開する際は、アクセスを承認する必要があります。
IchigoJam からウェブアプリを実行する
IchigoJam webで実行する
IchigoJam webを開きましょう。
IchigoJam web by jig.jp
「I/O」を選択し、「MixJuice」にチェックを入れましょう。
※「https://」は不要です。
「IMPORT」をクリックすると、IchigoJam webにインポートできるので、RUNで実行してみましょう。
Gmailが送信されれば成功です。
指定したURLにGETリクエストを送る
IchigoJam実機にセンサーを接続して、IoT防犯センサーを作ろう
プログラム
(1)ネットワークに接続
MixJuiceリファレンス
(2)センサーの閾値を設定
20 ?A
30 GOTO10
ここでは閾値を500と設定してみます。
(3)センサーの閾値(500)を超えたらウェブアプリにGETリクエストを送る
(4)防犯IoTプログラムを完成させ、SAVEする
20 IF A<500 GOTO10
30 ?"MJ GETS script.google.com/(中略)/exec
40 BEEP20,300:WAIT300
50 GOTO10
SAVE0
プログラムを0番にSAVEし、電源を切りましょう。
プログラムを自動実行(IchigoJamのボタンを押しながら電源スイッチを入れる)し、玄関や窓の近くに設置して置けば、簡単な防犯IoTセンサーの完成です。
まとめ
GASを使ってGmailを送るウェブアプリを作成、公開まで行いました。
ブラウザのアドレスバーにウェブアプリのURLを貼り付け、アクセスするだけでGmailが送られます。
ウェブアプリのURLにIchigoJam webのMixJuice機能を使ってGETリクエストを送るだけで、IchigoJamからGmailを送ることができました。
次回は、数種類のメール本文を送るためのGASとIchigoJamプログラムを作成していきます。
hanadojo-sihan.hatenablog.com
<IchigoJam IoTシリーズ>※GAS以外の方法
CC BY shoichi1031da / @shoichi1031da
【失敗は最高の学び】プログラミングのクラブ活動や授業で起こったトラブル&対処法まとめ【IchigoJam】【鯖江市】
福井県鯖江市では2018年度から全12小学校と全3中学校でIchigoJamを使ったプログラミングクラブ活動が行われています。
2019年度からは総合学習の時間に全小学4年生を対象に授業も行っています。
2018〜2021年度の3年間、私中村もメイン講師として色んな学校へ支援させていただきました。
その中でも多く起こったトラブルを【セッティング時】と【プログラミング時】に分けてご紹介します!
※ごく稀に起こるものも念の為記載しています。
※ハードのエラーも仮説を立てて解決する大切な学びです。
【セッティング時】
■モニターがつかない
最も多いのがIchigoJamの電源を入れてもモニターがつかないトラブル。
原因を見つけるのにまず確認して欲しいのがこれです。
IchigoJamに電源を入れた時、キーボードが光るかどうか
光らない(キーボードに給電されていない)場合
IchigoJamへの給電が行われていない可能性が高いです。
(以下原因の多い順)
① microUSBケーブルの故障
最も多いです。真っ先に他のケーブルと変えてみましょう。
※ごく稀にmicroUSBケーブルのUSB端子をキーボード用の端子に繋いでいる場合もあり
② IchigoJamのスイッチもしくはmicroUSB差し込み口の故障
IchigoJam TやUなど少し古いIchigoJamはスイッチが壊れやすいです。
microUSBの差し込み口は、力尽くで抜き差しをして壊れることもあります。
その場は交換して、後で修理しましょう。
③ 電源アダプタの故障
ほとんどない例ですが、①②でもない場合は電源アダプタの故障が考えられます。
④ コンセント自体の故障
理科室や家庭科室のコンセントは各テーブルにあります。
古い小学校ですと、テーブル単位で故障している時があります。
その場合は、テーブル全員が同じ症状になるので、テーブルを変えるか延長コードで対応しましょう。
光る(キーボードには給電されている)場合
IchigoJamには給電されているので、モニター側の不良です。
(以下原因の多い順)
① ビデオ端子の差し込みが甘い
IchigoJamのビデオ端子を確認しましょう。控えめな子は奥まで差し込むのに躊躇していることが多いです。
② モニターの電源コードが繋がっていない
IchigoJamの接続に安心して、肝心のモニターの電源が繋がっていないことが多いです。
③ モニターの故障
最終的にはモニター自体の故障を疑ってください。
他の正常なモニターと交換してみましょう。
■キーボードが効かない(モニターはついている)
ごく稀にモニターはついているのに、キーボードが効かない時があります。
まずはキーボードのUSB端子をIchigoJamに抜き差しして再接続して、電源を入れ直してください。
これで大体は正常に動くようになります。
電源を入れ直しても効かない場合は、キーボード自体の故障の可能性があります。
交換して確かめてください。
【プログラミング時】
■画面が消える
プログラムが残っている可能性もあるので、落ち着いて対処しましょう。
(以下原因の多い順)
①F10キーを押してしまった
F10キーは画面切り替えのショートカットキーで、画面が真っ暗になります。
もう一度F10キーを押せば、復帰しプログラムも残っているので、画面が消えた時はまずF10キーを押しましょう。
②電源部分のmicroUSB端子の接触不良が起きた
こちらは野球ゲームのようなIchigoJam本体のボタンを押すようなゲームの時に起こりやすいです。IchigoJam本体を触る際にmicroUSB端子の接触不良などで切れることが稀にあります。
この場合はIchigoJamの電源が一瞬切れたので、SAVEしていないプログラムは消えます。
バックアップの大切さを知る経験だと思いましょう笑
③他の子がコンセントから抜いてしまった
片付けの時間に起こります。まだ打ち込んでいる子がいて、同じテーブルの子に間違って抜かれてしまう場合です。クラブ活動の時は一斉にSAVEする時間を設けましょう。
■Syntax error
基本的に単なる打ち間違いですが、特にわかりづらいエラーを紹介します。
①カナ入力の「、」や「ー」
コンマ「,」と読点「、」
マイナス「-」と伸ばし棒「ー」
が特にわかりずらいです。
エラーの行でカタカナが使われていたら、疑ってみましょう。
②エンターの押し忘れで、2つの行が1つの行として認識される
IchigoJamは1行32文字打ち込めます。
1行のプログラムがちょうど32文字の時、改行されているのでエンターを押さずそのまま次の行を打ってエラーになることがあります。
(ダメな例:ちょうど32文字の時)
一見、10行目と20行目がミスなく打ち込まれているように見えます。
しかし実行すると
「Syntax error in 10」と返ってきます。
ここでポイントなのが in 10と返ってきているのに20行目も表示されることにあります。IchigoJamのSyntax errorメッセージはエラーの1行分のみ返答があるので、2行分errorが返ってくることはありません。
(正しい例)
32文字ある10行目の最後でエンターを押すと、1行分空いて20行目を書くことになります。
Syntax errorで2行分のプログラムが返ってきた時は、エンターの押し忘れが原因です。
(ごく稀なパターン)
このミスに初めて遭遇した時は、???が並びました笑
LEDが1秒間隔でチカチカするプログラムです。
これも一見正しいプログラムのようですが、実行すると
なんとエンターで改行せずに、スペースを押すことで改行していたのです!
「改行=エンター」は大人の常識で、このミスをした子にはスペースがたくさん空いているように見えたのですね。
これ以降「行の最後にエンター。エンターを押すとプログラムを覚えてくれる」を強く言うようになりました笑
(このミスはHana道場含めて3回ほど経験があります。その内一回は「なわとびさっちゃん」プログラム内でIF文が絡んだ行で、見つけるのに苦労しました。。)
まとめ
冒頭にも書いたように、ハード(機材)もソフト(プログラム)もエラーの原因の仮説を立てて解決することが最高に実践的な学びです。
プログラムでいくら失敗しても怒られませんし、IchigoJamや周辺機器が壊れても安価で直せたり購入できます。
失敗を恐れず、歓迎する気持ちがプログラミング教育の心構えだと思います!
今日の体験会、最高に楽しんでくれました🔥👍
— Hanaわらび (@Hana82638277) February 23, 2021
元気もらいまくりました😚
Lチカゲームを自分たちで作成・改造。#IchigoJam#プログラミング
また新たな可能性が広がりました☀️#Hanaわらび#すべての世代に可能性を#街と共に成長する多世代交流拠点 pic.twitter.com/FwU1pbPKfT
沖縄の哲真くんが「Hanaわらび」オープンに向けて着々と準備中!
2020年11月に鯖江を訪れて約3ヶ月。哲真くんの想いと行動力がすごい!
福島の「寺子屋Hana」に続いてHanaのお仲間が増えて嬉しい限り!
学校や拠点でIchigoJamを教える際のトラブルシューティングとしてご利用ください!
CC BY shoichi1031da / @shoichi1031da
IchigoJamアバターづくり!エルチカ→川下りゲーム→ミニゲームズの次の提案
①エルチカでコンピューターとの会話を楽しみ、②川下りゲームでプログラムを楽しみ、③ミニゲームズで一通りの動作に慣れ親しんだあとに、④としてのおすすめが「アバター(顔)づくり」
使うコマンドは、ゲームづくりには欠かせないLOCATE(LC)とPRINT(?)の2つだけ!写経だけでなく、自分のアイデアをプログラムで実装する経験を④番目としていかがでしょうか?
#IchigoJam プログラミングスクール2021 start!!!
— Hana道場 (@hanadojo_sabae) January 16, 2021
高学年はスゴロクゲーム、低学年はお顔づくりに挑戦!
今年もたくさんつくって学びましょう🌸 pic.twitter.com/dflye3Xqui
↑小学2年生も楽しそうに顔を作っていました^^
途中、眉毛が迷子?になり変な位置に表示されましたが、大笑いしていました。
失敗も楽しい「アバター(顔)づくり」をやってみましょう!
0. 画面の大きさを知ろう!
CLSで一旦画面を消して、Aという文字がヨコに何文字打てるか数えてみましょう!
タテは「1エンター、2エンター、3エンター、...」と打っていくと数えやすいです。
1.IchigoJamの画面について
ヨコは0〜31の32マス、タテは0〜23の24マスあります。
2.左側の目を表示(チュートリアル)
20 ?"o"
40 ?"o"
510 LC 13,5
520 ?"-"
530 LC 17,5
550 WAIT60
560 GOTO10
午前中は #IchigoJam プログラミングスクール🍓
— Hana道場 (@hanadojo_sabae) December 12, 2020
イケメンな?顔をつくるコンテストが始まりました😏
見せ合いっこしてます! pic.twitter.com/iLuuHD196B
CC BY shoichi1031da / @shoichi1031da
楽しく二進法入門!Hana道場発のLEDサイコロ基板がUpverter公式Twitterで紹介されました。
Hana道場発の楽しく二進法が学べるキット「LEDサイコロ基板」をご紹介!
商品ページ:https://hanadojo.official.ec/items/24804122
はんだ付け方法:http://hanadojo.sblo.jp/article/186826146.html
Our users from Japan has created a schematic compatible with IchigoJam pcb products. A simple dice roller that will display the numbers on each individual LED.https://t.co/MNQovDr9Vs@octopart @altium @PCBNGinc #upverterprojects #randomnumbergenerator #dice #board pic.twitter.com/l2A1J5Bgjh
— Upverter (@upverter) 2020年11月11日
Our users from Japan has created a schematic compatible with IchigoJam pcb products. A simple dice roller that will display the numbers on each individual LED , like a dice!https://t.co/uriErvkyFO@gumstix @altiumdesign pic.twitter.com/fr6yoOjWeQ
— Upverter (@upverter) 2020年12月11日
↑僕が初めて基板設計をした作品がこのLEDサイコロ基板(基板データ)
無料・web上で基板設計ができるサービスUpverterの公式アカウントで紹介もされました。
IchigoJamに接続し、LEDをサイコロの目の配置で光らせます。
(接続)
(6の目)明るい場所
(1の目)暗い場所
LEDはそれぞれIchigoJamのOUT1〜7につながっています。
1の目を光らせる時はこのように書きます。
OUT4をオン(1)
簡単ですね。
しかし、サイコロ6の目はどうなるでしょう?
サイコロの6の目を再現するには少々長くなりますね。
ここで登場するのが二進法です。
(この基板は二進法を楽しく学ぶためにつくりました)
二進法は、0と1の二つの数だけで全ての数を表現します。
(ただ、0と1だけでは桁が増えすぎて人間には分かりづらいので、普段は十進法0〜9の十個の数で表現しています)
二進法を使うとサイコロ6の目に光らせるには下のようになります。
IchigoJamのOUTポート1,2,3,5,6,7をオン(1)、4をオフ(0)にしています。
これでも相当短くなりましたが、この二進法を十進法に変換するとより短くなります。
たった「OUT119」だけで6つのLEDが同時に制御されました!
個別に6つ制御
各サイコロの目の十進法への変換はこんな感じです。
(累乗のわかる人向け)
(累乗がわからない小学生向け)
光らせたいLEDに書いてある数字を足せばOK!
例)サイコロ4の目の時
1+4+16+64 = 85
(ランダムにサイコロを振るプログラム)
20 OUT [RND(6)]
(音と光の演出付き)
<やってみよう>
・LED7つ全てを十進法で光らせてみよう!
・LED7つ全てを消してみよう!
・スゴロクを作ってみよう!
ーーーーーーー
(補足)
ロボット(カムロボなど)のモーターを2つ同時に制御するのに十進法表現がよく使われます。
<OUT2とOUT5をオン>
◆二進法の場合
◆十進法の場合
2^4 + 2^1 = 16+2 = 18
<OUT1とOUT6をオン>
◆二進法の場合
◆十進法の場合
2^5 + 2^0 = 32+1 = 33
OUT18やOUT33の謎が解けましたね!
CC BY shoichi1031da / @shoichi1031da
IchigoJamとMixJuiceを「SLEEP」して超省電力のIoTをつくる【IoTインターホン続編】
前回は自宅のインターホン(呼び鈴)をIoT化させました。hanadojo-sihan.hatenablog.com
↑のブログでは、IchigoJamのみSLEEPにしていますが、MixJuice自体もSLEEPにする方法を見つけました。
<参考記事>
IchigoJam + MixJuiceで製作するIoTセンサ – Ambient
今回はIchigoJamとMixJuice両方をSLEEPさせて、「超省電力IoT」に挑戦します!
#IoT インターホン、MixJuiceのSLEEPモードにも対応しました🌟
— 初代 *Hana道場【師範】 (@shoichi1031da) October 22, 2020
インターホンを押すと #IchigoJam と #MixJuice のSLEEPモードが解除され、LINEを送った後どちらもSLEEPモードになります。
省電力!! pic.twitter.com/ikVUiCS4pV
【接続】
MixJuiceのCN4-2(RST)とIchigoJamのBTNをジャンパー線で接続。
今回はインターホン(呼び鈴)のIoTなので、ボタンが押されるとSLEEPから起きるようにしています。
BTNピンにはMixJuice(RST)からの線と、インターホンのボタンからの線、計2本挿さっています(2本挿すためにホッチキスの芯を使っています笑)
【プログラム】
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>ブログをご覧ください。
【プログラム解説】
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行目:ネットワークに接続するまで待機しています。
50行目:CN4-2(RST)がHIGHになる(ボタンが押される)までSLEEPします。
スリープ(節電モード)します。sec には 0-4000(秒) を指定できます。
(sec=0の場合) 無限にスリープします。
CN4-2(RST)をHIGHで復帰します。
(sec>0の場合) CN4-2(RST)とCN4-6(IO16)を接続してください。
sec秒後に復帰します。
60行目:IchigoJamをSLEEPさせます。
プログラムを休止する (ボタンを押すと起動し、LRUN0を実行する)
これでインターホン(ボタン)が押されると、SLEEPが解除されLINEにメッセージを送ります。
メッセージを送った後は、MixJuice→IchigoJamの順番にSLEEPさせます。
<注意>
モバイルバッテリーを電源として使用すると、消費電力が低すぎてモバイルバッテリー自体がスリープしてしまいます。
スリープさせない方法もあるようですが、単三電池を使えば問題なく動きました!
何ヶ月持つか実験中です!!
ご指摘・ご質問はTwitterからお願いします。
CC BY shoichi1031da / @shoichi1031da
IchigoJamで【IoTインターホン】をつくってみた!LINE連携シリーズ<その3>
IchigoJamでLINEを送るシリーズ<その3>では、実践編として「IoTインターホン(呼び鈴)」をご紹介!!
IchigoJamで"UTF-8変換"してLINEを送る方法<その2>
今回挑戦したのはこちら↓
プログラムも接続方法もとてもシンプルなので、<その1>ブログを参考につくってみてください!!
【目次】
1. 必要なもの
- IchigoJam
- MixJuice
- IFTTTのアカウント
- 電池式インターホン(呼び鈴)
- ジャンパー線(オス-メス)2本
(我が家の電池式呼び鈴は古くて検索しても見つかりませんでした)
2. 接続方法
今回IoT化したインターホン(呼び鈴)はこちら
(1)カバーを開ける
2箇所ボタンに繋がる接点を発見!
この2箇所をIchigoJamのピンBTNとGNDにつなげばOK!
(2)ネジを外し、ジャンパー線に接続
銅線が鋼板とネジで留められていました!
銅線をそれぞれジャンパー線メスにねじ込みます。
(3)IchigoJamに接続&テスト
ジャンパー線オスをIchigoJamのピンBTNとGNDにそれぞれ接続します。
のようなプログラムを実行し、実際にインターホンを押してみましょう!
インターホンを押すと1、押さないと0が返って来たら成功です。
3. プログラム概要
【プログラム】
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」を入れるとボタンを押さなくても自動実行されます。
WiFi接続は1回接続すれば、次から自動で接続されます。
MixJuice参考サイト:準備・使い方 - イチゴジャム レシピ
インターホンを押してメッセージが送られてきたら成功です!
(メッセージを GUSET!! にした場合)
【プログラム解説】
20 ?"MJ GETS maker.ifttt.com/trigger/イベント名/with/key/Webhoocksのkey?value1=メッセージ" IFTTTにパラメータvalue1を送信
30 BEEP20,90:WAIT60 ブザーを鳴らす
40 SLEEP スリープ状態にする
10行目:画面表示を停止すると、消費電力を抑え、処理も高速化されます。
20行目:<その1>ブログをご覧ください。
40行目:SLEEP状態にし、消費電力を抑えます。
ボタン(インターホン)が押されると、0番のプログラムが自動実行されます。
そしてなんとSLEEP状態だとIchigoJamの消費電力が1.2μA(0.0012 mA)まで下がるそうです!
単三電池2本(2000mA)だと、約1666時間(約69日)使えます!
2ヶ月に1回交換でokですね。
ただ、MixJuiceもSLEEPにしないと省電力化したとは言えませんね。
後日やってみたのでご覧ください↓
\ #IoT インターホンをつくってみた /
— 初代 *Hana道場【師範】 (@shoichi1031da) October 15, 2020
インターホンが押されるとLINEでメッセージが届きます。
電池式のインターホンの、カバーを外してボタンの線を #IchigoJam に接続。#MixJuice と #IFTTT を組み合わせてLINEに「GUEST!!」と送信します🌟
<LINEを送る方法>https://t.co/RXiDIqad0U pic.twitter.com/wFamnHdFEW
古いインターホン(呼び鈴)だったら簡単に作れちゃう「IoTインターホン」
ぜひやってみてください!
質問などはTwitterからお願いします↓
CC BY shoichi1031da / @shoichi1031da
IchigoJamで"UTF-8変換"してLINEを送る方法<その2>【IchigoJam × MixJuice × IFTTT】
IchigoJamで文字列をUTF-8変換して、文字化けせずLINEにカタカナ(日本語)のメッセージを送るプログラムを紹介します!
IFTTT でLINEにメッセージを送る方法は<その1>のブログをご覧ください。
今回挑戦するのはこちら↓
#IchigoJam × #MixJuice × #IFTTT でLINEにメッセージを送ってみました!動画では「ムカエニキテ」と送っています。
— 初代 *Hana道場【師範】 (@shoichi1031da) October 11, 2020
これでスマホを持っていない小学生でもLINEができる!? pic.twitter.com/zF6tovZnTE
IchigoJamBASICでUTF-8変換しています。
【目次】
【プログラム】
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を押すと
文字化けせず、ちゃんと日本語が送れました!
【プログラム解説】
①文字列入力、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
16進数82を2つ目の値、A2を3つ目の値と呼ぶことにします。
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のカナ表記で気をつける必要があるのは、濁点と半濁点です。
「ガ」で1文字ではなく、「カ」と「゛」の2文字使用しています(半濁点も同様)。
濁点「゛」の文字コードは222、半濁点「゜」の文字コードは223です。
<濁点と半濁点の処理>
30行目:変数Dで常に次の文字に、濁点と半濁点がないか調べる
140行目:もし 次の文字が濁点なら 現在のUTF-8の値に1増やす(ダだけ2つ目の値に影響あり)
150行目:もし 次の文字が半濁点なら 現在のUTF-8の値に2増やす
280行目:もし 次の文字が濁点or半濁点なら それを飛ばして次の文字へ
例えば
「カ゛」なら「カ」の3つ目の値に1増やして(ガの値にして)、次の文字「゛」は飛ばします。
「ハ゜」なら「ハ」の3つ目の値に2増やして(パの値にして)、次の文字「゜」は飛ばします。
プログラムっぽい処理はそれだけで、その他の文字のUTF-8変換はゴリ押しです!
③送信した文字列の表示(おまけのチャットっぽさ)
★完成★
音やチャットっぽさはご自由に演出してください。
<その3>でインターン(呼び鈴)を押すとLINEが届く「IoTインターホン」の紹介もあります。
IchigoSodaでWiFi環境のない場所でもLINEを送れるサービスを実装中のHana道場インターン生がいます。
しかもGPSで自分の位置情報も送れちゃう!?
完成をお楽しみに。
福野さんや師範に死ぬほど助けてもらったので、生まれて初めてのIoTが出来そう pic.twitter.com/KGZv4Z3EmQ
— 水野(もしゃ) (@macoto_1655) 2020年10月1日
何かエラーや文字化けがありましたら、Twitterにてご指摘ください!
CC BY shoichi1031da / @shoichi1031da