create every day - 福野泰介の一日一創

体育とプログラミング教育、GPS x IchigoJamで校庭に絵を描いたり新スポーツ創ったり

2017/10/05 23:55:00
#KidsIT #IchigoJam #maker 

自分たちで外で遊ぶコンピューターゲームを創って遊ぼう!

IchigoJamで色を変えるボタンとsakura.ioをつなげば、サーバーに送ってみんなでお絵かきしたり、オープンデータを使って近所の宝探しをしたり、いろいろと遊べそうです! データを外部記憶装置(EEPROM)にどんどん書き込んでいく形にすれば、自分だけの地図を作ることもできちゃいます。

鯖江市のバスIoTの「つつじバス x sakura.io」GPSデータも合わせて送信する版の準備も兼ねて、 日本の衛星、みちびき対応のGPSモジュール「GPS受信機キット AE-GYSFDMAXB 2,200円(秋月)」をIchigoJamにつないで使ってみました。


緯度経度のデータをGPSモジュールからシリアル信号で受け取って、緯度経度の部分を切り出して分で表示するプログラムを、液晶モジュールと単3電池のモバイルバッテリーで動かしている様子。

まずはモジュールをはんだづけ。GPSモジュールから5ピン、ピンヘッダーやピンソケットなどを使って配線。

電源は5V、GNDをIcigoJam TのCN5につないで、IchigoJamの方をシリアル通信速度を9600bpsに合わせて準備。

BPS9600

GPSモジュールのTXDをIchigoJamのRXDに接続すると、画面にデータがつぎつぎと表示されます。
* IchigoJam 1.2では、「OK0」というコマンドでエラーメッセージが出ないようにできるので、データの確認に便利です。「OK」または「OK1」で元に戻ります。

データは、NMEAセンテンスといってGPSモジュールの標準の形式です。多すぎるので緯度経度だけを取得するシンプルなメッセージ$GPRMCだけを、3秒に1度だけ送ってもらうよう設定します。 GPSモジュールのTXDの線を一旦抜き、RXDからIchigoJamのTXDに接続して、次のコマンドを実行。

UART3:?:?"$PMTK314,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*2B":UART0

UART3は、GPSモジュール向けの改行コードCR+LFを送信するモード。PMTK314で受け取るメッセージを設定します。 GPSモジュールのTXDをIchigoJamのRXDにつないでみて確認しましょう。

9600bpsではちょっと遅いので、RXDを抜き、IchigoJam標準の115200bpsに設定して高速化!

UART3:?"$PMTK251,115200*2F":UART0:BPS0


GPSモジュールとIchigoJamは4本の線で接続。設定はGPSモジュールに記憶されるので、設定が終わったらGPSモジュールからのTXDは不要です。
初回だけ位置測位に時間がかかりますが、次からの起動では数秒で位置データが来るので、必要なときだけ電源をいれる用途にも使いやすい!

次に受け取ったデータを変数にいれます。
シリアルからの信号は、INKEY()で取得できるので、開始記号「$(=36)」を目印に、画面先頭に表示します。

10 UART0,1 20 K=INKEY():IF K!=36 CONT ELSE CLS 30 ?CHR$(K);:K=INKEY():IF K!=13 CONT ELSE ? 40 GOTO 20

UART0,1で、シリアル送信は止めて、シリアル受信だけを有効にしています。
開始記号でCLS、改行コード13が来るまで表示します。

$GPRMCメッセージのフォーマットは、時間、A(正常) or V(警告)、緯度、経度・・・となっているので、Aを受信していれば、緯度経度の読み取りをします。 数値の読み取りは画面上の文字コードから"0(=48)"を引けばOKです。

300 @ATOI:M=0:FORI=1TOL:M=M*10+PEEK(A)-48:A=A+1:NEXT:RTN

画面の左上に123と書いておき、呼び出すと値123となります。(Lは長さ、2にすると12になる)

LC 0,0:?"123" A=#900:L=3:GSB@ATOI:?M A=#900:L=2:GSB@ATOI:?M

応用して、dddmm.mmmmと度と分で表されている緯度経度を、整数と小数部分それぞれに分けて読み取るプログラムを作ります。

100 @PRS:A=#900+18:IF PEEK(A)!=65 RTN 110 GSB@GETM:LET[0],N,M:GSB@GETM:LET[2],N,M:RTN 200 @GETM:A=A+2:L=3-(PEEK(A+4)=46):GSB@ATOI:N=M 210 L=2:GSB@ATOI:N=N*60+M 220 A=A+1:L=4:GSB@ATOI 230 A=A+1:IF PEEK(A)=83 OR PEEK(A)=87 N=-N 240 ?N,M:RTN

画面先頭に$GPRMCのメッセージを表示し、@PRSを呼び出すと配列の0〜3に緯度経度が分数の小数表記で入ります。

液晶モジュールを接続したモバイルバージョンのプログラム全文がこちら。

10 UART0,1:SWITCH1:LED1 20 K=INKEY():IF K!=36 CONT ELSE CLS 30 ?CHR$(K);:K=INKEY():IF K!=13 CONT ELSE ? 40 GSB@PRS:GOTO 20 100 @PRS:A=#900+18:IF PEEK(A)!=65 RTN 110 GSB@GETM:LET[0],N,M:GSB@GETM:LET[2],N,M:RTN 200 @GETM:A=A+2:L=3-(PEEK(A+4)=46):GSB@ATOI:N=M 210 L=2:GSB@ATOI:N=N*60+M 220 A=A+1:L=4:GSB@ATOI 230 A=A+1:IF PEEK(A)=83 OR PEEK(A)=87 N=-N 240 ?N,M:RTN 300 @ATOI:M=0:FORI=1TOL:M=M*10+PEEK(A)-48:A=A+1:NEXT:RTN

*シリアル受信がおかしくなる現象対策版をIchigoJam-FANにて、β版1.2b51として公開中

GPSを持って外に出よう!

英語とプログラミング教育、壊して理解するBASICプログラム - 鯖江市へ教員向け教科書寄贈

2017/10/04 23:55:00
#KidsIT #IchigoJam #sabae 

いよいよ最後の敵(Enemy)が現れた、こちらのレーザー砲はあと1発分のエネルギーを残すのみ。
君は地球を守れるか!?・・・という、シリアスなシーンを再現した、シューティングゲームです。

まずは意味わからなくてOK!
次の7行のIchigoJam BASICのプログラムを、ゲームで遊ぶためにがんばって入力して、RUN!

10 E=RND(22):Y=12 20 CLS:LC31,E:?"E":LC0,Y:?">"; 30 Y=Y-BTN(UP)+BTN(DOWN) 40 IF BTN(SPACE) GOTO 60 50 WAIT 2:GOTO 20 60 FOR I=1TO30:?"-";:NEXT 70 IF Y=E ?"*SUCCEEDED!" ELSE ?"-FAILED..."

登場、14英単語の解説
RND: RANDOM(ランダム、でたらめ)の略
CLS: CLEAR SCREEN(クリアスクリーン、画面をきれいに)の略
LC: LOCATE(ロケート、位置を決める)の略
BTN: BUTTON(ボタン)の略
IF: イフ、もし
GOTO: ゴー・トゥー、〜へ行け
UP: アップ、カーソル上キーのキーコード
DOWN: ダウン、カーソル下キーのキーコード
SPACE: スペース、スペースキーのコード
WAIT: ウェイト、待て
FOR: フォー、〜へ向けて(FOR I=1 TO 30、NEXTまでを変数Iを30までくりかえす *プリントFOR/NEXT
NEXT: ネクスト、次
SUCCEEDED: 成功した(SUCCEED+ED過去形)
FAILED: 失敗した(FAIL+ED過去形)

すばやく敵(E)を正確に破壊しよう!

効果音を付けた豪華版への改造法(下記、60と70行を編集しよう!)

60 FOR I=1TO30:?"-";:BEEPI:NEXT 70 IF Y=E ?"*SUCCEEDED!":FOR I=1TO90:BEEP40+RND(20):NEXT ELSE ?"-FAILED..."

追加登場英単語
BEEP: ビープ、ピーと鳴らす

一旦、SAVEで保存して、プログラムを壊していきましょう。

60 70 LIST 10 E=RND(22):Y=12 20 CLS:LC31,E:?"E":LC0,Y:?">"; 30 Y=Y-BTN(UP)+BTN(DOWN) 40 IF BTN(SPACE) GOTO 60 50 WAIT 2:GOTO 20

60エンター、70エンターで、エンディングの60行と70行を消してプログラムを見ます。
この状態で RUN すると・・・?

>Line error in 40 40 IF BTN(SPACE) GOTO 60

エラーで止まりました、GOTO 60 としているのに 60行がもう無いからですね。
では、エラーがでる40行も消しちゃいましょう。

40 LIST 10 E=RND(22):Y=12 20 CLS:LC31,E:?"E":LC0,Y:?">"; 30 Y=Y-BTN(UP)+BTN(DOWN) 50 WAIT 2:GOTO 20

スペースを押しても無反応になりました。
30行、Y=Y-BTN(UP)+BTN(DOWN) の謎に迫ってみましょう。
変数Yは、10行で12にしていて、20行で自機(>)を表示する縦の座標として使っていますね

1 ?BTN(UP),BTN(DOWN):GOTO1 RUN 0 0 0 0 1 0 1 0

実行すると 0 0 が表示され、上を押すと左の数、下を押すと右の数が1になります。
つまり、上だけを押している時の Y=Y-BTN(UP)+BTN(DOWN) は、Y=Y-1+0 であり、LET Y,Y-1+0 と同じ意味で変数YをY-1+0をいれる、つまり、Yを1減らし、自機を1つ上げることになります。

1 30 Y=Y+1 RUN

1行を消して、試しに30行を足す1だけにしてみて RUN してみましょう!

Yが解読できたので、Yに関するプログラムなどを消して、10行と20行だけにしましょう。

10 E=RND(22) 20 CLS:LC31,E:?"E"

Eは敵の縦の座標、ランダムに決めて、横の座標31、つまり右端に敵を表示しています。
RUNするたびに場所が変わります。
縦は24コあるはずですが、なぜ、RND(22)なのでしょう?
いろいろ試して謎に迫ってみてください。

学校は、学び方を学ぶ場所

PCN鯖江から鯖江市に20冊寄贈した書籍「小学校教員のためのプログラミングで考える教育の実践入門」(Kindle版
市長、教育長、著書の吉村さんとのプログラミング教育ディスカッション。

いろんな教科を題材に、いろんな学び方があって、自分でいろいろ学べるのだと気づくこと。
どんなことでも自分で学べる方法さえ身につけばそれでOK!

コンピューターはすばやく、かつ、決して諦めることなく、怒ることなく、正確にYESかNOかを答えてくれるある種、完璧な先生です。 人間の先生は、人間の先生でしかできないことに集中できる環境づくりをお手伝いしていきます。

算数と英語が弱いという鯖江市、プログラミングで算数と英語が好きになってもらいましょう!

IchigoJam、AOTECHスリムミニキーボードでのネコ入力に対応ベータ版

2017/10/03 23:55:00
#KidsIT #IchigoJam 

IchigoJam、人気の裏技、左ALTキーを押しながら「C」を押すと出るネコ。
PS/2対応のコンパクトなキーボード、AOTECHのスリムミニサイズキーボードを使っている方からのご要望で、無変換キーを左ALTとして使えるバージョンをつくってベータ公開。

容量が溢れて、モバイル液晶対応をOFFにして容量を空けた暫定版ですが、一度お試しください!
IchigoJam-FAN ファイル


また、左ALTキーを押しながら、0〜9とA〜VまでだったのをWXYZも0〜3と同等と割り当て、子供がいろいろ押して試しやすくもしています。
キャラクター太字化プログラム」と合わせて使うと便利です!

ブラウザでお試し、IchigoJam web でも対応!

links
- AOTECH スリムミニ日本語78キー キーボード レッド AOK-78RE-A 赤縁取り!
- AOTECH PS/2&USB接続 日本語88キー +7ホットキー スリムミニキーボード AOK-88UPBK-A ホットキー付き!
- ichigojamデスクトップ型 ケース製作、その1 暇つぶし工作/ウェブリブログ 赤縁取りとお揃いのケース加工例!

自分で作る電飾!4足の数珠つなぎできるコンピューター内蔵LED「PL9823でいろあそび - IchigoJamプリント」

2017/10/02 23:55:00
#KidsIT #IchigoJam #maker 

WS2812Bと同じように数珠つなぎにできるコンピューター付きフルカラーLED「PL9823
赤緑青(RGB)を0〜255の256段階で順に指定してマシン語を呼び出すだけ!

色、自由自在!(PL9823、選べる大きさ5mm8mm


一番長いピンがGND、データシートに習って右から2番目にくるように見ます。
左から、DIN(データ信号入力)、VCC(電源5V、3.3Vでも動く)、GND、DOUT(次のPL9823のDINへ)


IchigoJamプリントPL9823へいろあそび」(PDF)
マシン語はWS2812Bと共通ですが、色の並びが異なります(WS2812B GRB、PL9823 RGB)


2つつないだ例。1つ目のDIN、VCC、GNDを2つ目のDOUT、VCC、GNDにつなげばOK!
数珠つなぎで数百コ接続してもOKです!(明るく光らせる場合は電源の追加は必要です)


アイオーデータ、細野さん、会長就任おめでとうございます!記念写真 with IchigoDake

全10か所相互中継、第7回小中学生対象のプログラミングコンテスト「PCNこどもプロコン表彰式」

2017/10/01 23:55:00
#KidsIT #IchigoJam #IoT #maker 

PCN(プログラミング クラブ ネットワーク)主催の小中学生対象のプログラミングコンテスト、7回目となる「PCNこどもプロコン2017夏」の表彰式がありました。 賞が決まって、大喜びする子供達、賞を逃した子供達にも審査委員からのコメントと参加賞をお届けしますよ!

今回は、イギリスのラズベリーパイ財団とケニアのアイダーアフリカから、海外からの初の特別協賛!
シンガポール在住、チームラボの高須さんから子供たちへの講演からも、世界との近さ、感じてくれたはず!

創って、見せて、また創りたくなる。誰かの創ったのを見て創りたくなる。何かを創ることつながる、創る仲間に国境なし。創ること好きの輪、世界中に広げましょう!


サテライト会場の人も含めて記念写真!


全国9か所を相互中継!


IchigoJamで作られた「300円を入れたら利用できる富士山トイレ」
心打たれる、身近な社会課題に切り込んだ作品!


印象深い「スマホ使いすぎ防止マシーン」
ゲームしすぎと怒られた時代とは隔世の感がありますね!子供が親をマシーンでたしなめる時代です。


シンプルな機構、安定した動作、筐体のインパクト、大きな音(音量調整可能)。
抜群の完成度の高さを誇っと、足でひくピアノ「Step on(音) the piano(IchigoJam BASIC)」


アルミホイルとダンボール、各端子からの配線をブレッドボードにまとめ、音量は100均のアンプとスピーカーを改造して強化!


回線の契約がないiPod touchでもプログラムの受け渡しするために、画像化エンコード・デコードを独自研究によって実装、検証した作品「EasyAppExchange」 子供ならではの課題をテクノロジーで解決しちゃう感がナイス!


子供の作品にうなる大人


シンガポール、メイカーが大事すぎて大臣もメイカーに!?
国連で演説するヴェヴィアン外務大臣!


ヴィヴィアン外務大臣は、なぜつくるのか? → 楽しいから
大人だって楽しいからつくるのだから、子供はもっともっとつくって楽しんでほしい。
やってみないとわからない、つくってみないとわからないのは大人も子供も一緒!
じゃんじゃんつくって、たくさん失敗すればするほど強くなる!


仙台と福井をむすんだ、IoT(インターネット オブ シングス)デモ!
スマホに表示される距離センサーの値をみながら、福井のロボットを仙台からちゃんと制御できるのか!?
こどもでも遊べるIoT!ネットネイティブな子供にとってはネットにつながるのは極自然なことなのかも。


ラズベリーパイ財団賞には創始者Eben Upton(エベン・アプトン)さんも賞賛「スマホ使いすぎ防止マシーン」
お母さんのスマホ使いすぎを子供がオリジナルのマシンを発明して、注意する時代です!


アイ・オー・データ機器を授与する細野会長!いい笑顔です!


テレビ会議サービスZoomを使って双方向につないだ、各地サテライト会場となったPCNへ協賛賞パネルをこっそり事前送付。


今回は北海道から東京サテライトへ参加してくれたスマホ使いすぎ防止装置をつくった森下くん!


金沢から福井会場に来てくれました!


SwiftでiPhone用クイズアプリ「IchigoJam Mania」をつくったMASAHARU、永和システムマネジメント賞を受賞!


jig.jp賞は、Scratchでつくったカブトムシキャッチャー。吸引しちゃうアームがコミカル、採ったら減点のハエ、高得点の金のカブトムシ。得点計算の演出がかわいい!

副賞のIchigoJam詰め合わせに、楽しい「コンピューター付きフルカラーLED WS2812B」とその使い方も同梱。
IchigoJamプリント「WS2812Bでいろあそび」ぜひチャレンジしてみてください!

IchigoJam用に買った7インチディスプレイ、電源にACアダプターソケットがないことあり!?

はんだづけテクニックがあれば、大丈夫!(高電圧は危険なので気をつけて!)

審査委員として、CoderDojo から安川さんにも参加いただきました!
全国103か所以上の子どものためのプログラミング道場「CoderDojo」もぜひ訪ねてみてください!

経験値を貯めるほどに上がる、ものづくりレベル!
第8回もお楽しみに!

links
- PCNこどもプロコン

IchigoJamで計算する色相環、色相・彩度・明度を光の三原色に / HSV2RGB in BASIC

2017/09/30 23:55:00
#IchigoJam #maker 

虹みたいなグラデーション、色相を学んで自分で作ろう!
赤→橙→黄→緑→青→藍→紫→赤、と色がループするものと捉えるのが色相環。
色は、色相(Hue)と、鮮やかさ(発色の良さ)を彩度(Saturation)、明るさを明度(Value)でも表せます。


低価格コンピューター内蔵フルカラーLED「WS2812B」を使って、色相をぐるぐる変えてみました。


切ってもつないで自在に使えるWS2812B、3つだけカットし、ピンヘッダーを付けたコンパクト版。
5V/DI/GNDを、IchigoJamのVCC/GND/OUT1にそのままさして手軽に実験できます!

プログラムはこちら(10/20行はWS2812Bコントロール用マシン語)

10 POKE#700,240,181,114,182,64,24,80,33,9,2,1,49,9,4,4,136,1,48,128,37,1,48,3,120,255,34,74,96,3,39,10,38,43,66,1,208,10,39,3,38 20 POKE#728,1,63,253,209,0,34,74,96,1,62,253,209,109,8,239,209,1,60,234,209,98,182,240,189 100 POKE#800,3*3,0 110 V=30:S=80 115 FOR I=0 TO 359 STEP 1 120 H=I:GSB@HSV2RGB:POKE#802,G,R,B 130 H=I+60:GSB@HSV2RGB:POKE#802+3,G,R,B 140 H=I+120:GSB@HSV2RGB:POKE#802+6,G,R,B 145 U=USR(#700,#800) 150 NEXT 160 GOTO 115 500 @HSV2RGB 505 R=V:G=V:B=V:IF S=0 RTN 510 D=H/60%6:C=V-(59-H%60)*V/60*S/100:E=V-H%60*V/60*S/100:F=V*(100-S)/100 520 IF D=0 G=C:B=F 530 IF D=1 R=E:B=F 540 IF D=2 R=F:B=C 550 IF D=3 R=F:G=E 560 IF D=4 R=C:G=F 570 IF D=5 G=F:B=E 580 RTN

H、S、Vに値を指定して GSB@HSV2RGB で、光の三原色RGBに変換します。
Hは色相、0-360で指定します。0が赤です。
Sは彩度、0-100で指定します。100で一番鮮やか、0でモノクロ。
Vは明度、指定した値がRGBそれぞれの最大輝度になります。
変数C/E/Fを使っているので注意!
(変換方法の詳細は「HSV色空間 - Wikipedia」などを見てみよう)

WS2812Bを3つ、色相を60度、120度ずらしたものと合わせてグラデーションさせながら点灯させています。 110行の明度と彩度をいろいろ変えてみましょう。普通のフルカラーLEDをPWMで制御するものにも使えます!

彩度(S)を使わない HV2RGB だともうちょっとシンプル。

500 @HV2RGB 510 D=H/60%6:E=H%60*V/60 520 IF D=0 R=V:G=E:B=0 530 IF D=1 R=V-E:G=V:B=0 540 IF D=2 R=0:G=V:B=E 550 IF D=3 R=0:G=V-E:B=V 560 IF D=4 R=E:G=0:B=V 570 IF D=5 R=V:G=0:B=V-E 580 RTN

過去の一日一創作品より、色相関係をピックアップ

HSVの3パラメーターを3本指で!(マルチタッチ用)カラーセレクター / colsel」 2016年


簡単に色調が整えられる TinyHSVTinyHSV」 2013年


hsb2rgb」 2012年

色、たった3パラメーターなのに奥深い!

冷蔵庫IoT、25円の温度センサーで温度異常を検出せよ! IchigoJam x sakura.io x MCP9701

2017/09/29 23:55:00
#IchigoJam #IoT #maker 

冷蔵庫が壊れて温度上昇!?うっかり開けっ放しで外出してしまって大変!
そんな時、温度センサーをつなげた冷蔵庫IoTがあれば安心です。

温度センサーは誤差0.5度の高級なものもありますが、温度異常を調べるだけなら安くてOK。 相対温度の誤差1度のtempeXにも使われているMCP9700/MCP9701がお手軽です。


MCP9701-E/TO 温度センサーIC、8コで200円、1コあたり25円!
電源は3.1V-5.5VまでOKなので、IchigoJamの3.3Vを使いましょう。出力はアナログ電圧1度の変化が19.5mVの変化になるようです。


データシートからピン配置を調べると、平らな文字面を表にして左からVDD,VOUT,GND
IN2がアナログ入力なので、VDDをIN1へ、VOUTをIN2、GNDをIN4へ差し込みます(IN3はI2Cで使うので飛ばします)
次のプログラムで、温度の値がとれることを確認しましょう。(手で持って温めたりすると変化します)

10 OUT8,1:OUT11,0 20 ?ANA(2):WAIT10:CONT RUN 307 309 308 307

アナログ入力は、0V-3.3Vの変化を0-1023の値で教えてくれます。
19.5mVは、6.045の差。6変わったら1度変わったことになるので、6以上変化したらsakura.ioで通知してみましょう。(sakura.io x IchigoJam 接続方法

Nに送信したい値をいれて、GSB@SENDN で送るプログラムを準備します。

100 @SENDN:POKE#800,#21,10,1,76,N,N>>8,0,0,0,0,0,0,N>>8^N^102:U=I2CR(79,#800,13,#820,3):RTN

*即時送信バージョン(4Gの正式版はこれだけでOK!)

100 @Q:POKE#800,#20,10,1,76,N,N>>8,0,0,0,0,0,0,N>>8^N^103:U=I2CR(79,#800,13,#820,3):RTN 110 @SENDQ:POKE#800,#24,0,#24:U=I2CR(79,#800,3,#820,3):RTN 120 @CHK:POKE#800,1,0,1:U=I2CR(79,#800,3,#820,4):C=PEEK(#822)&~U:RTN 130 @SENDN 140 GSB@CHK:IF C<>128 WAIT30:?".":CONT 150 GSB@Q:GSB@SENDQ:?"SENT! ";N:RTN

*LoRaのα版/4Gのβ版は送信キューにいれる必要があります(回線状況チェック付きバージョン)

通信モジュールが1回点滅になるのを待ってから、sakura.ioのコンソール、WebSocketのページを見ながら、テストしてみましょう

N=15:GSB@SENDN OK

うまくいったら、温度異常を検出するプログラムを加えてできあがり!

1 'TEMP-D WATCHER 10 OUT8,1:OUT11,0 20 N=ANA(2) 30 @L 40 WAIT10:M=ANA(2):?"ANA(2) ";M 50 IF ABS(N-M)>6 N=M:GSB@SENDN 60 GOTO @L

ABSはabsoluteの略で、絶対値を求める関数です。差が6以上あったら、基準の値Nを書き換えて、送信!


どんどん温度が下がっていく様子が分かりますね!
* 注意、冷蔵庫内の冷媒に引火して火災になるリスク、湿度が高いため結露による故障リスクなどがあるので、短時間の実験までに留めておきましょう!

来週10/7、広島県尾道にて、
IchigoJamとsakura.ioを使った、プログラミングの基本からIoTづくりまでのセミナー開催決定!
【IoT入門】~はんだづけ、プログラミング、sakura.ioを使ったIoTづくりまでを実体験〜

ジョンバーガーのランチ付き!

7行のプログラムで捉えるアプリづくりの本質、研究イノベーション学会にて講演、オープンデータ活用人材の育成と成果

2017/09/28 23:55:00
#opendata #KidsIT #IchigoJam 

魚沼産が有名なコシヒカリが実は福井産なように。
イギリスで生まれのオープンデータにこどもパソコンムーブメント、鯖江で大きく育てます!

研究・イノベーション学会、プロデュース研究分科会にて講演と、 イギリスつながり、ZESDA代表の桜庭大輔さんモデレートによるミニパネル。
大学からの技術移転(TLO = Technology Licensing Organization)を手がけるキャンパスクリエイトの安田さん、須藤さんとの出会いも貴重です!

桜庭さんの掲げる「タテ」から「ヨコ」へ、さまざまな業界での集中によって磨かれてきた日本の技術や文化、「ヨコ」や「ソト」にちょっとつなげて起こる化学反応、熱いですね!
ベトナムで開催された『APEC BEST Award2017』にて、和える代表の矢島が『APEC BEST Award(大賞)』」(日本の伝統工芸xこども、aeru

こちらオープンデータとIoT、こどもプログラミングによって加速する鯖江イノベーションについて話したスライドです。

今回の参加者中、プログラミング経験ある方は3割ほど。
子供も大人もひとまず体験してもらう、かわくだりゲームのロジックをさらっと紹介。

10 CLS:X=15 20 LOCATE X,5:?"O" 30 LOCATE RND(32),23:?"*" 35 WAIT 3 36 X=X-BTN(LEFT)+BTN(RIGHT) 37 IF SCR(X,5) END 40 GOTO 20

初期化(10行)と繰り返し(20-40行)が基本構造。
スピード調整にウェイトをいれて(35行)、押したら反応(36行)、当たったら終了(37行)
と、とってもシンプルですが、普段使っているアプリの基本構造そのものです。

ちょっと応用してゲームプログラム「CURSOR」をつくりました。
あなたは、コンピューターの指示に従って、すばやくカーソルの上下左右を押さなければなりません。
無事、10回正確に押すことができたら、コンピューターが評価してくれます。


タイトル画面、スタート待ち、ゲーム中、スコア表示、そして、タイトルへ。
このように画面は移り変わっていきますが、それぞれの構造が単純に増えているだけだとわかります。

10 CLS:LC13,8:?"CURSOR" 20 WAIT180:CLK 30 LC8,12:?"PRESS KEY TO START" 40 IF INKEY()=0 CONT 45 S=0:CLT 50 CLS:N=RND(4):LC9,11:?"HIT "; 55 WAIT 30 60 IF N=0 ?"LEFT" 70 IF N=1 ?"RIGHT" 80 IF N=2 ?"UP" 90 IF N=3 ?"DOWN" 100 IF INKEY()-28!=N CONT 110 S=S+1:IF S<10 GOTO 50 115 BEEP8,10:WAIT20:BEEP8,25 120 T=TICK():CLS:LC9,12:?"TIME:";T 124 LC9,14 125 IF T<1200 ?"GREAT!" 126 IF T<1500 AND T>=1200 ?"GOOD" 127 IF T>=1500 ?"NOT BAD.." 130 WAIT 300 140 GOTO 10

伝えたいことは3点。
1. コンピューターとプログラミングの基本
2. オープンデータとIoTなど技術で広がる可能性
3. 未来は自分の力で切り開けること

3年前、IchigoJamでプログラミングを学び始めた一期生は、福井ご当地ロボットの販売に到達!
レーザーカッターで作った筐体、モータードライバーを持つ専用プリント基板を発注し、組立説明書もあります。 大人と混じってハッカソンで活躍するだけでなく、自分のプロダクトをもつエンジニアへとレベルアップしました。


鯖江Hana道場にて、87(ハナ)価格(8,700円)で登場!
Hana道場発「越前がにロボット」完成&販売開始!!: Hana道場
15(イチゴ)価格のIchigoJamは付属しません。


越前がにロボット開発者、メカ担当 MASAHARU(中2) & 基板担当 MISAKI(高2)
かにロボ事前講習会場にて)

イノベーションを、おもてなしの如く、オペレーションに。やればできる日本人!

ZESDAのプロデューサーシップあふれる楽しい懇親会!

多様性あふれる少数精鋭ユニットのゆるいヨコ連携でいきましょう。

links
- 研究・イノベーション学会 | Japan Society for Research Policy and Innovation Management
- NPO法人ZESDA - プロデューサーシップで新しい市場を拓く
- ZESDA's blog

Kindle版「小学校教員のためのプログラミングで考える教育の実践入門」とプログラミングと一緒に学ぶ英語「えいごのかずをマスターしよう」IchigoJamプリント

2017/09/26 23:55:00
#IchigoJam #KidsIT 

教員向けシニア向けと、小学校でのプログラミング必修化に向けて準備が進む福井から、小学校教員向けの電子書籍「小学校教員のためのプログラミングで考える教育の実践入門」が登場!

IchigoJamを題材に、なぜプログラミングか?国語、算数、理科、社会、英語、音楽、図工、それぞれの科目にどのように採り入れるかなど、ヒントが詰まった全270ページ。

スマホ、PC、タブレットなどでぜひどうぞ!Kindle unlimitedの読み放題の対象です。
こちらは先日持ってきてくれた、通常書籍版(一般向け未発売)

全教科横断的に「考える教育」としてプログラミングが採り入れられる小学校のカリキュラム用に英語とプログラミングの例が掲載されています。 IchigoJam BASICのコマンドは、簡単な英単語と対応!自然と英語に馴染めます。

プログラムの読解は、英文の読解にも通じます。何がどうのようにどうするか、構造を把握して、ひとつひとつの単語(=コマンド)の意味を読み解けば、自分で組み立てかえることもできるようになりますね。

えいごのかずをマスターしよう」(PDF/PNG) - IchigoJamプリント (IchigoJam ver 1.2以上向け)
英単語が出題されて、キーで答えるゲームに仕立て、スコアを加えて競い合うまでと、各自のチャレンジを促すところまでをサポート。 「IchigoJamはじめのいっぽ」をやったことある人が対象です。


写真左が、著書の元福井高専の先生、吉村忠与志さん(再掲
プログラミングいちねんせい!」の著書でもあるPCNの原さんも共著として参加してます。

画面をイチゴで埋め尽くす12の方法 / IchigoJamではじめるARMマシン語その11

2017/09/24 23:55:00
#IchigoJam #asm 

IchigoJamのキャラクターコード255は、イチゴ。
これで画面を埋め尽くす12の方法、まずはBASICから!


1. 延々イチゴを表示して埋め尽くす(GOTO編)

10 ?CHR$(255);:GOTO10 RUN

2. 延々イチゴを表示して埋め尽くす(CONT編)

1 ?CHR$(255);:CONT

再開するCONTコマンドは、プログラム内に書くとその行を再度実行として機能します

3. FOR/NEXTコマンドで埋め尽くす(768=32*24)

FORI=1TO768:?CHR$(255);:NEXT

4. VIDEO0で一旦画面出力を止めて高速化(画面表示OFFで約3倍速)

VIDEO0:FORI=1TO768:?CHR$(255);:NEXT:VIDEO1

5. LOCATE(短縮計LC)を使って縦に埋める

FORI=0TO31:FORJ=0TO23:LCI,J:?CHR$(255);:NEXT:NEXT

6. VRAMに直接書き込む(HELPコマンドでVRAMのアドレスが確認できます)

FORI=#900TO#BFF:POKEI,255:NEXT

7. COPYコマンドを使って一瞬で埋める

POKE#900,255:COPY#901,#900,768-1

実用的にはこれで十分ですが、マシン語を使って究極を目指してみます

8. マシン語を使って埋める (22byte 5383cycle)

R2=9 R2=R2<<8 R1=R1+R2 R2=32 R3=24 R2*=R3 @LOOP [R1]=R0 R1+=1 R2-=1 IF !0 GOTO @LOOP RET

32*48で768、数値が1byteの上限255を超えるので、掛け算命令で設定。

POKE#700,9,34,18,2,137,24,32,34,24,35,90,67,8,112,1,49,1,58,251,209,112,71 U=USR(#700,255)

ハンドアセンブルか、asm15アセンブラを使ってマシン語を作成しUSRコマンドで実行!
1cycle = 21nsec、割込が無いとすれば、113usec、つまり0.1ミリ秒で処理完了です。

9. マシン語、4byteまとめて埋めて高速化 (32byte 1356cycle)

R2=9 R2=R2<<8 R1=R1+R2 R2=R0 R2=R2<<8 R2=R2+R0 R2=R2<<8 R2=R2+R0 R2=R2<<8 R2=R2+R0 R0=192 @LOOP [R1]L=R2 R1+=4 R0-=1 IF !0 GOTO @LOOP RET

メモリへの書き込みは1byte、2byte、4byteと3種類。まとめて4byte書くように変更することで、プログラムは10byte増えてしまいましたが、約4倍速に!

10. マシン語、まとめて転送命令STMを使って高速化 (42byte 381cycle)

PUSH {LR,R4,R5,R6,R7} R2=9 R2=R2<<8 R1=R1+R2 R2=R0 R2=R2<<8 R2=R2+R0 R2=R2<<8 R2=R2+R0 R2=R2<<8 R2=R2+R0 R3=R2 R4=R2 R5=R2 R6=R2 R7=R2 R0=32 @LOOP STM R1,{R2,R3,R4,R5,R6,R7} R0-=1 IF !0 GOTO @LOOP POP {PC,R4,R5,R6,R7}

ARM Cortex-M0にあるまとめて転送命令STMは、アドレスR1へ複数指定したレジスタの値をアドレスの値を変更しながら高速に転送してくれます(転送時間=転送数+1クロック)。 R2からR7まで6レジスタ、24byteまとめて転送できるので32回ループすれば画面全部を埋められます。

11. マシン語、ループ展開 (92byte 251cycle、転送部分220cycle)

PUSH {LR,R4,R5,R6,R7} R2=9 R2=R2<<8 R1=R1+R2 R2=R0 R2=R2<<8 R2=R2+R0 R2=R2<<8 R2=R2+R0 R2=R2<<8 R2=R2+R0 R3=R2 R4=R2 R5=R2 R6=R2 R7=R2 R0=R2 STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3,R4,R5,R6,R7} STM R1,{R0,R2,R3} POP {PC,R4,R5,R6,R7}

ループのために分岐すると3cycle時間を消費してしまうので、ループの数がそれほど多くなければ展開して高速化できます。 ループ用の変数が不要になるので、7レジスタ使ってSTMの回数も減らせて一石二鳥。 ただ、プログラム量は必然的に多くなりがちなので、容量に余裕がある時に使いましょう。

12. キーボードで ALT+V 押しっぱなし(手動)
プログラムを作ることはあくまで手段。手でやったほうが速いこともあります。

目的を達成するための方法は様々です。

同じマシン語でも8番のシンプルなマシン語に比べ、11番のプログラムでは、24倍も速くできました。
ターゲットのCPUに合わせた最適化を行うことで、ぐっと効率が上げられたりします。

BASICであってもコマンドの使い方次第でぐっと速くできます。
リファレンスを見直して、いろいろな使い方を探ってみるのもいいですね。

速度重視?容量重視?作りやすさ重視?
目的に合わせて選択できる手段を増やしておくと、叶う夢の幅が広がります!

(追記)
13. マシン語、ループ展開 PUSH編 (90byte 250cycle、転送部分214cycle)
IchigoJam-FANにて、PUSHを使った更に速い方法が発見されました!(Thanks Amanagi-san)
転送部分のみで214cycle、方法11と仕様を合わせても90byte/250cycleと、2byte減って1cycle/21nsec高速!

PUSH {LR,R4-R7} R2=#C R2=R2<<8 R1=R1+R2 R2=R0 R2=R2<<8 R2=R2+R0 R2=R2<<8 R2=R2+R0 R2=R2<<8 R2=R2+R0 R12=R13 R13=R1 R1=R2 R3=R2 R4=R2 R5=R2 R6=R2 R7=R2 R0=R2 R14=R2 PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {LR,R0-R7} PUSH {R0-R2} R13=R12 POP {PC,R4-R7}

* スタックポインタ(R13)を破壊可能なR12に退避し、VRAMの末尾アドレスに変更、LR(R14)も使って36byte(9レジスタ*4byte)転送するという技!埋めるキャラクターがイチゴ(#FF)なのを利用して、更に縮めることも!?

- 連載、IchigoJamではじめる、ARMマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語
8. アセンブラを使って楽しよう
9. マシン語で高速SPI
10. マシン語を制するもの時間を制す
11. 画面をイチゴで埋め尽くす12の方法

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image