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

画面をイチゴで埋め尽くす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 352cycle)

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

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

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

ファミコンMIDI音源「ふぁみみみっでぃ」音声出力簡単改造 x IchigoJam

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

コミケC92で入手したファミコンをMIDI音源にしてしまうカセット「ふぁみみみっでぃ by @hekekekun」をちょっとだけ改造してIchigoJamに接続。


起動音がかわいい、ふぁみみみっでぃ、IchigoJamでいろいろ鳴らしてみるプログラムがこちら。普通のMIDI音源として使えます。

10 UART0:BPS31250:V=127 20 FOR I=30 TO 100 30 C=#90:GSB100 40 C=#93:GSB100 50 IF BTN() END 60 NEXT 70 GOTO 10 100 UART1:?CHR$(C,I,V);:WAIT10:?CHR$(C,I,0);:UART0:RTN

普通のファミコンの場合、音声出力がRF(アンテナ)なので、AV改造などが必要でしたが、カセットの仕様を見ると音声がカセット端子にでています(45ピン)。 これを使って鳴らしてみた今回ですが、ちょっとノイズがひどいのでもうちょっと解析と対策が必要な様子。

ふぁみみみっでぃのBACK側、真ん中あたりの青い線がSOUND INにあたる45ピン。 ついでに、VCCにIchigoJamからの5Vをつなぐので、ファミコンのACアダプターもいらなくなってコンパクト!

links
- ファミコン実機とMIDI連携できるカセット「ふぁみみみっでぃ」のご紹介!MIDINES欲しかった人は要チェックです! | ハイレゾスタイル
- へけけくん (@hekekekun) | Twitter (ふぁみみみっでぃの作者さんのTwitter)
- 極楽ほんげら (ふぁみみみっでぃの作者さんのサイト)
- IchigoJam BASIC 15行、バンブラ奏法で奏でるMIDI楽器

プログラム容量4倍、IchigoJam 4k on web、失敗を楽しむ教育を!

2017/09/21 23:55:00
#js #IchigoJam 

容量4倍、プログラム領域を4kにしたIchigoJamの拡張おためし版を使った、大作ゲーム「IchigoTrek-4K」登場! IchigoJam web も4kバージョンを用意して動かしてみました。


IchigoJam web 1.3b」- プログラム4kbyte version (IchigoTrek by shiro0922 動きます!)

元になったゲーム「スタートレック」は1971年生まれで、1980年前後にかけて大流行したBASICのゲームとのこと。 実感ありませんが、78年生まれがスーパーマリオに熱狂したような感じかも。

こどもプログラミング教育などに取り組む、ICT CONNECT 21のイベント「 シリーズ:プログラミング教育の世界での取り組み ~英国における低学年でのプログラミング教育の取組~」へ参加。 イギリスでコンピュテーショナル・シンキングを学ぶためのロボット「Bee-Bot」を学校へ販売・指導しているTTS GroupのAndrewさんによるイギリス事情とロボット実演がありました。

パソコン上のシミュレーター、上下左右などのパネルを並べた「ならべたじゅんにうごく(逐次実行)」でクイズ。 動くと思う人は、サムアップしてくださいと会場に語りかけるも誰も反応せず・・・。 せっかくなので、サムアップ!

日本で長く続いた「間違いを怖れる」教育の縮図を見ました。
遠慮?間違えたら恥ずかしい?実は逐次処理も自信がない?

こどもプログラミングを、どんどん間違ってOK!という新習慣をつくるいいきっかけにしましょう!

プログラムのいいところは、間違っても淡々と何度も粘り強く正確に指摘してくれるコンピューターが相手してくれるところ。 コンピューターは絶対根負けしないので、安心していくらでも失敗させてくれます。失敗は成功の母。自転車を転ばずに乗れるようにならないのと同様、失敗こそ最大の学習です。 失敗を見守るという人間にとっては辛い仕事は、実にコンピューター向きです。


Andrewさん、遠くUKからありがとうございました!
Thank you very much Mr. Andrew!! Next time we'll meet in UK!
Here is English documents of IchigoJam.
"$15 Computer IchigoJam meets Cute Manufacture Pimoroni in UK, and connects SkyWriter HAT!"

続々と公開予定の各地で実証が進む「若年層に対するプログラミング教育の普及推進報告2017
ご関心ある方、ICT CONNECT 21への入会もぜひご検討ください!

links
- 鯖江市全15小中学校を結んだ教員向けプログラミング研修とネクストステップ、総務省実証事業と同日開催
- KidsVenture&教員職員向けIchigoJamワークショップ at 大阪/さくらインターネット本社、IchigoJamのつなぎかた
- 新書籍「小学校教員のためのプログラミングで考える教育の実践入門」とIchigoJamプログラミング シニア講師育成講座@Hana道場
- 大人のプログラミング入門、プログラミングをもっと身近に!iOS11とフルスクリーンに対応 IchigoJam web
- こどもパソコンIchigoJam

大人のプログラミング入門、プログラミングをもっと身近に!iOS11とフルスクリーンに対応 IchigoJam web

2017/09/20 23:55:00
#js #IchigoJam 

子供のプログラミングはじめはゲームがテッパン。
一方、興味関心が多様化しているため、難しかった大人向け入門。

コンピューターとネットワークの低価格化によって一気に身近になった今こそオススメしたいのがこちら。
マイコンを使ったプログラミング入門!

マイコンとは、マイクロコンピューターの略で、大人には懐かしい炊飯器「マイコンジャー」などでおなじみの小さなコンピューター。 マイコンを使えば、身の回りのちょっとしたことを自動化できるので実用的!(例、ねこIoTイノシシIoT


こちら指先に見えるたくさん足が生えた四角いチップが、IchigoJamの心臓部のマイコン「NXP LPC1114」。
値段は約100円。たった100円のくせに秒間約5000万回の処理速度を誇ります。
* 値段はロットと為替次第@digikey / 190円で1コから購入可能 / はんだづけが用意な大きなパッケージは400円
* スマホ用CPUとして圧倒的シェアを持つ、ソフトバンクグループになったARM社の設計、NXP社製造のコンピューター

電気で動くコンピューター。その正体はとってもシンプル!
コンピューターは電源を入ると予め決められた通りに、その足につながった先の何かを自在にコントロールしたり、つながったセンターからON/OFFを受け取ったりするだけのものです。 どのように動かすかを決めているのが「プログラム」。「プログラム」を作ることを「プログラミング」といいます。

コンピューターの足にLEDをつないで光らせてみましょう。

LED1

100円の心臓部をもつIchigoJamなら、キーボードで打てば即、コントロールできます。

1秒光らせる

LED1:WAIT60:LED0

1分たって点滅してから消す

LED1:WAIT60*60:LED0:WAIT10:LED1:WAIT10:LED0

運動会のプログラムと同様、予め記憶する時は番号をつけます

1 LED1:WAIT60*60 2 LED0:WAIT10:LED1:WAIT10 3 LED0 RUN

ずっと点滅させるプログラム

1 LED1:WAIT30 2 LED0:WAIT30 3 GOTO1 RUN

変数を使ってだんだん速くしたり、センターからの入力を使って速さを変えたり自由自在。
コマンドをひとつ使えるだけで、表現の幅がどんどん広がるのが、プログラミングの楽しいところです。

単純なON/OFFですが、LEDの代わりにブザーをつなげば音がなり、モーターをつなげばモノが動き、スイッチにつなげば家電が動き、ネットにつなげばスマホへの通知や、遠く離れたモノをもコントロールもできるわけです。(ネット接続するIoT、sakura.ioなら月額61円〜

ちょっとやってみたくなった方、今お使いのパソコン上でお試しできます。
ChromeかSafariで「IchigoJam web」を開いたら、「LED1」と打って、エンター!
LEDが光る感動には程遠いですが、縁が反転し、言うことを聞いた証「OK」メッセージが返ってきます。


IchigoJam web」 for Chrome/Safari/Android/iOS11
[fullscreen]ボタンを押すと画面いっぱいに広がるIchigoJam。
フルスクリーン時、動き続けるタイプのプログラムを止めるには、ESCの代わりに、CTRL-Cを使うと便利です。


IchigoJam web、iPhone/iPadでも新OS「iOS11」で動くようになりました!
Bluetoothキーボードを接続すれば、パソコンと同じように使えます。

プログラムの表現方法はたくさんあります。
iPhoneアプリをつくるためのSwift、AndroidならJava、WebならJavaScript、AIで活躍Pythonなど用途によって様々。 IchigoJamで使っているのはBASICという言語。53年前に作られた歴史ある、わかりやすさには定評ある言語です。 プログラミング学習用言語として作られているので、スマホアプリがつくりたくなったら、Swift/Java/JavaScriptへステップアップしましょう!


10月放送のTokyo MXのテレビ番組の収録、パックンにもマイコン、プログラミング体験してもらいました!
「エトス、パトス、ロゴス」伝え方3種がおもしろい、パックン著書にサインもらいました!

IchigoJam BASIC 15行、バンブラ奏法で奏でるMIDI楽器

2017/09/18 23:55:00
#IchigoJam #sound 

バンブラ奏法BEEP音源を応用してIchigoJamとスーファミコントローラーでMIDI楽器をつくってみました。
KORG plugkeyを使うと、iOSが楽器に早変わり!

iOSで使えるMIDI楽器は、懐かしいアナログ音源、FM音源から最新音源までたくさん!
今回はApple標準のGarageBandを使って、切り替えながら鳴らしてみました。

バンブラ奏法(コントローラーの上下左右、ABXYボタンで鳴る。Rで半音上がり、Lでオクターブが上がる)のためのスーファミコントローラー接続。 さよなりωさんのコネクターがあると便利ですが、自分で切って作っちゃうのも手です。
(赤:IN1、白:VCC、茶:GND、橙:OUT1、黄:OUT2)

ホットボンドで固めておきましょう。

近日発売、MIDI入出力ボードとスーファミコントローラーをつなげて準備完了!

プログラムを作ってできあがり!(遅れを少なくするためにVIDEO0で画面消しています)

1 'SFC-MIDI 10 POKE#700,16,181,80,35,27,2,28,70,36,4,91,28,27,4,1,34,18,3,164,24,0,34,90,96,0,33,0,34,154,96,34,104,146,10,138,64,128,24,2,34 20 POKE#728,154,96,1,49,16,41,244,209,1,34,90,96,16,189 30 OUT1,1:OUT1,2:A=#700:B=0 32 LET[0],9,7,-1,-1,4,0,2,5,11,12 35 BPS31250:UART1:VIDEO0 40 N=~USR(A,0):P=N&~B:R=~N&B:B=N 60 FORI=0TO9:IF[I]<0GOTO80 70 IF P&(1<<I) V=100:GSB90 75 IF R&(1<<I) T=[I+10]:V=0:GSB92 80 NEXT 85 IF BTN() UART0:VIDEO1:END 86 GOTO40 90 T=[I]+N>>11+N>>10&1*12 91 [I+10]=T 92 ?CHR$(#90,60+T,V);:RTN

10-20行 スーファミコントローラードライバ(マシン語)
35行 MIDI信号は31250bpsのシリアル信号、ビデオ出力を切って3倍速!
85行 IchigoJam本体のボタンで安全な終了(シリアルを切って、ビデオ出力を戻す)
90行 バンブラ奏法の肝!
92行 MIDI信号出力(#90でチャンネル1をノートオン、ボリューム0でノートオフ)

コンピューターで音楽をもっと楽しく!

MSXのZ80マシン語解析と、IchigoJamの太字化マシン語プログラム

2017/09/17 23:55:00
#IchigoJam #asm #MSX 

IchigoJamの太字化、MSXの例に習ってマシン語化してみました。

POKE#800,7,34,18,2,137,24,10,120,19,70,82,8,26,67,10,112,1,49,1,56,247,209,112,71

PCGの#700に使いたい文字のパターンをコピー(この例は0〜9の数字をALT+0〜9へコピー)

COPY#700,ASC("0")*8,10*8

あとは太字化処理したいバイト数を指定してマシン語呼び出し!(2度実行すると更に太字に!)

U=USR(#800,10*8)

ALT+0〜9で書いてみましょう!プログラムでももちろん使えます

FOR I=0 TO 9:?CHR$(224+I):NEXT

ベースのアイデアはこちらMSX版

MSX BASICのプログラム、70行で書き込んでいる23byteのマシン語部分を解析(逆ハンドアセンブル)してみました。(表示用につくった MSXLIST

Z80のニーモニックを、asm15表記風に書いてみるとこんな感じです。

BC=#700 HL=#100 @LOOP CALL @RDVRM E=A A>>=1 A|=E CALL @WRVRM HL+=1 BC-=1 A=B A|=C IF !0 GOTO @LOOP RET

Z80のレジスタは基本8bitなので、16bitとして使うBCレジスタの0判定がおもしろいですね! MSXのVRAMはRAMに割り当てられていないので、BIOSというMSX組み込みのコードを呼び出していました(RDVRM/WRVRM)。 どうもこの呼出が結構遅い様子。VDPという一種のGPUを使って高速化するのが常套手段だったようです。(VDPはGPUの元祖かも?)

IchigoJam用に書き換えたマシン語がこちら(asm15 assemblerでアセンブルできます)

R2=7 R2=R2<<8 R1=R1+R2 @LOOP R2=[R1] R3=R2 R2=R2>>1 R2|=R3 [R1]=R2 R1+=1 R0-=1 IF !0 GOTO @LOOP RET

ほぼ一緒ですね!

このようにCPUが違うとそのCPUで使えるレジスタや、コマンドが違いますが、やっていることは基本的に同じ。 C言語やJavaなどは、このようなCPU毎の差を埋めるプログラム(コンパイラ)が助けてくれているわけです。

何でも作れちゃう感がアップする「マシン語」おすすめです!
連載、IchigoJamではじめる、ARMマシン語入門 1. はじめてのマシン語

IchigoJamのメモリマップと太字化プログラム

2017/09/16 23:55:00
#IchigoJam 

雰囲気が変わって楽しい、フォント変更。
IchigoJamでもアルファベットを太文字にしてみよう!(元ネタ on MSX by @ksasao

「太字化 on IcigoJam」 IchigoJam web で RUN!

太文字化には、好きなキャラクターパターンが作れるPCG機能を使います。
まずは、アルファベットの「A」キャラクターパターンをコピーしてみましょう。

?ASC("A"),CHR$(234) 65 10 OK FOR I=0 TO 7:POKE234*8+I,PEEK(65*8+I):NEXT OK

ALT+Aを押してでる「10」のキャラクターがAに変わりました!(CLPで元に戻せます)

太字にするのは簡単、元のパターンにそのパターンを1bitシフトしたものの論理和を書き込めばOK!

FOR I=0 TO 7:N=PEEK(65*8+I):POKE234*8+I,N|N>>1:NEXT OK

アルファベットA〜Zまでの26文字を全部変更してみましょう。

FOR J=0 TO 25:FOR I=0 TO 7:N=PEEK((65+J)*8+I):POKE(224+(10+J)%32)*8+I,N|N>>1:NEXT:NEXT OK

PCGで変更できるのは32コまで、ALT+Vまでしかないので、はみ出したW/X/Y/ZはALT+0〜3に割り当てるようプログラムしてみました。

FOR I=0 TO 7:N=PEEK(65*8+I):POKE234*8+I,N|N>>2:NEXT OK

2bitずらすとおもしろ文字になります。いろいろ実験してみましょう!

PEEK(ピーク)はメモリの値を取得するコマンド
POKE(ポーク)はメモリを書くコマンド(ただし#000〜#6FFのROM領域は書き込みできない)

IchigoJamのメモリマップをまとめてみました。
コンピューターの頭の中をいろいろ探検してみましょう!


「IchigoJam メモリマップ」

おまけ、冒頭のデモプログラム!(RUN on IchigoJam web

10 CLS 20 LC11,10:S="ICHIGOJAM":GSB@PUTB 30 LC4,14:S="BOLD CHARACTER WITH PCG":GSB@PUTB 40 FOR I=0 TO 31:POKE #920+I,64+(I+23)%32:POKE#960+I,224+I:NEXT 50 CLP 60 FOR I=0 TO 32*8-1:C=64+(I/8+23)%32:POKE #700+I,PEEK(C*8+I%8):NEXT 70 FOR J=0 TO 1 80 FOR I=0 TO 32*8-1:A=PEEK(#700+I):POKE#700+I,A|A>>1:NEXT 90 NEXT 100 ?:?:?"TYPE ALT+A!":END 110 @PUTB:FOR I=0 TO LEN(S)-1 120 IF ASC(S+I)=SPACE ?" "; ELSE ?CHR$(224+(ASC(S+I)-55)%32); 130 NEXT:RTN

マシン語で太字化にも挑戦してみましょう!
(追記、マシン語解答例

links
- オリジナルキャラをつくるPCG - IchigoJamプリント
- asm15アセンブラ for IchigoJam
- 連載、IchigoJamではじめる、ARMマシン語入門 1. はじめてのマシン語
- ベーマガ復活11号、近日発売!

元ネタ on MSX

IchigoJam/Ichigolatteで使えるマシン語生成、アセンブリ言語&アセンブラ、asm15 on GitHub

2017/09/15 23:55:00
#IchigoJam #arm 

ゲームづくりの醍醐味は、どういう仕掛けでプレイヤーを喜ばせようかとあれこれ考えること。 プログラミングすればすぐに実現。まずは自分が楽しめて、人に喜んでもらって二度美味しい!

ゲームづくりに慣れてくるとやってみたくなる複雑な仕掛け。複雑になればなるほど高速なコンピューターといえども、遅くなります。 そこを、いかに効率がいいロジックを考えるかが腕の見せどころ!IchigoJamでのゲームづくりは、限界が低い分、すぐにその成長のチャンスに巡り会えます。

アルゴリズム(=考え方、作り方)でなんとかするのが常套手段ですが、奥の手に「マシン語」があります。

IchigoJam BASICは、インタプリタといって、分かりやすく書かれたプログラミング言語をプログラムでコンピューターが分かる言葉「マシン語」にひとつひとつ翻訳しながら動く仕組みでできています。 もし直接「マシン語」で話せたら、翻訳者(インタプリタ)が必要ない分、速くなるわけです。

IchigoJamをお持ちであれば、すぐに試せるマシン語入門。
はじめてのマシン語 - IchigoJamではじめるARMマシン語その1

0と1の羅列であるマシン語を分かりやすくするためのアセンブリ言語。
初心者にもわかりやすい表記でつくったオリジナルのアセンブリ言語「asm15」としてまとめました。
Cortex-M0 ARMマシン語表(抜粋)

Cortex-M0とは、ARM規格のCPUに要求される処理速度別のラインナップの内、最も遅い部類のシリーズ名です。 遅い代わりに、回路が小さく、省エネで、機能が少なくわかりやすいという大きな利点があります!

BoxHeadRoomさんが開発した、この「asm15」表記のアセンブリ言語をマシン語に変換するプログラム(アセンブラといいます)に足りなかった命令などを加えた「asm15 assembler」をGitHub上へのアップしました。
asm15 assembler for IchigoJam / IchigoLatte

まだ使い勝手が悪い部分や、足りない命令があります。
ぜひオープンオースプロジェクト「as15 on GitHub」にご参加ください!

電子工作マガジンの常連、田木屋商店さんのIchigoJam作品、ミサイル防衛ゲームや、落ちものゲームなどには効果的にマシン語が使われています。 まずは遊んで、改造して、少しずつ自分のモノにしていきましょう。

試しに、逆アセンブラを作ってみるのも楽しかも?
座学より体験、体験よりものづくり。ものづくりに勝る学習なし!

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

IchigoJamでも光る大五郎! 300コのフルカラーLEDを簡単コントロール! IchigoJam x WS2812B/SK6812/NeoPixel

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

ギャル電さんの「光る大五郎」やキラキラウェアラブルを創りたい?
1つ数十円で買えるコンピューター内蔵フルカラーLED、WS2812B。
IchigoJamへダイレクト接続、超簡単にコントロールできます。


10x10、100コ並んだSK6812(WS2812B+ホワイトLED)や、テープ状に300コ連なったWS2812Bや、8コのスティック状WS2812Bの制御実験の様子です。

LEDがいくつあっても接続電源に信号線1本だけというシンプルな配線。

IchigoJam - WS2812B
VCC - 5V
OUT1 - DIN (DOUT - 次のDIN...)
GND - GND

DIN端子に、0/1をパルスの長さで表し、GBB(SK6812ではGRBW)の順に8bitずつ上位からまとめて送ると、フルカラーLEDに内蔵されているマイコンが、先頭の自分の分のデータを抜き取りDOUTから出力。数珠つなぎにしたLEDをまとめて自在にコントロールできます!

WS2812Bの電源は3.5V〜5.5V。ちょっと足りませんが、IchigoJamの3.3V(VCC)でも一応動きました。電源を5Vを使い、3.3Vの信号のまま変換なしでも動いてくれましたが、ちゃんと作るときにはWS2812Bなど仕様書をチェック!

パルスは300nsec(ナノ秒)単位なので、ARMマシン語入門その10と同様、マシン語のループを使って時間調整しつつOUT1を制御するプログラム(ソースコードは末尾)を打ち込んで、早速実験!

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,1,39,8,38,43,66,1,208,8,39,1,38 20 POKE#728,0,240,11,248,0,34,74,96,55,70,0,240,6,248,109,8,238,209,1,60,233,209,98,182,240,189,1,63,253,209,112,71 RUN

まずは、WS2812B、1つを点灯してみましょう。

POKE#800,3,0,0,1,0:IF USR(#700,#800)

POKE#800,3,0,1,0,0:IF USR(#700,#800)

POKE#800,3,0,0,0,1:IF USR(#700,#800)

先頭2byteで送信するデータサイズをリトルエンディアンで指定します。
3つのLEDを使って、緑、黄、赤の信号色に光らせる時はこんな感じです。

POKE#800,9,0,20,0,0,20,20,0,0,20,0:IF USR(#700,#800)


(WS2812B、SK6812、NeoPixelで検索するといろいろ楽しい照明が見つかります!)

マシン語へデータを受け渡し用に#800の変数領域を使っていますが、画面用メモリ(VRAM)を使ってもOKです。

POKE#900,9,0,10,0,0,10,10,0,0,10,0:IF USR(#700,#900)

NコのLEDをランダムな全部同じ色で光らせる場合はCOPYコマンドをつかいます。(102コの配列の204byteなので68コ以上制御しようとすると変数が壊れてしまうので注意!)

N=8:M=4:POKE#800,N*8,0,RND(M),RND(M),RND(M):COPY#805,#802,N*3-3:IF USR(#700,#800)

Nコの全部、ランダム色(N<=67)

200 N=8:M=4:POKE#800,N*3,N*3>>8 210 FOR I=0 TO N*3-1:POKE#802+I,RND(M):NEXT 220 U=USR(#700,#800) 230 GOTO 210 GOTO200

ランダム色をスクロール(N<=67)

300 N=8:M=4:POKE#800,N*3,N*3>>8 310 COPY#802+N*3-1,#802+N*3-4,-N*3+3 320 POKE#802,RND(M),RND(M),RND(M) 330 IF USR(#700,#800) 335 WAIT5 340 GOTO310 GOTO300

300コで3,280円(1コ11円)!300コのテープ状LEDを制御するには、300*3+2の902byte必要になります。 VRAM領域768byteだけでは足りないので、#800からの変数領域も使います。ただし、変数が破壊されてしまうので、直接数で指定した「ランダム色をスクロール」300コ対応版です。

300 POKE#800,300*3,300*3>>8 310 COPY#802+300*3-1,#802+300*3-4,-300*3+3 320 POKE#802,RND(3),RND(3),RND(3) 330 IF USR(#700,#800) 335 WAIT5 340 GOTO310 GOTO300


WS2812Bが8コついたスティック状

応用編、8コをランダムな色でゆっくりつけたり消したり

100 N=8:M=16:POKE#900,N*3,N*3>>8 110 R=RND(M):G=RND(M):B=RND(M) 120 FOR I=0 TO 19 125 L=I:IF I>10 L=19-I 130 FOR J=0 TO N-1 135 P=N-J 140 POKE#902+J*3,G*L*P/80,R*L*P/80,B*L*P/80 150 NEXT 160 IF USR(#700,#900) 170 NEXT 180 GOTO 110 GOTO100


10x10、100コのフルカラーLED(SK6812)でなんと1,440円!?(1コ14円)
好きなように切ってつないでも使えるSK6812を10x10のマトリクスLEDにしてみました。


5V/GND/信号線をはんだづけしていきます

SK6812は、WS2812に加えて白色LEDが増えて入る分、1つあたり4byte使って制御します。
4byte目を使って白く光らせる。

POKE#800,4,0,0,0,0,10

100コのランダム色がスクロール RGBW版

500 N=100:M=4:POKE#800,N*4,N*4>>8 510 COPY#802+N*4-1,#802+N*4-5,-N*4+4 520 POKE#802,RND(M),RND(M),RND(M),0 530 IF USR(#700,#800) 535 WAIT5 540 GOTO500 GOTO500

応用編、文字表示 for 10x10 SK6812

10 S="IchigoJam" 20 FOR I=0 TO LEN(S)-1 25 P=#900:POKEP,400,400>>8:P=P+2 26 R=RND(2):G=RND(2):B=RND(2) 27 FORJ=0TO9:POKEP,G,R,B,0:P=P+4:NEXT 30 C=ASC(S+I) 40 FOR J=0 TO 7 45 POKEP,G,R,B,0:P=P+4 50 FOR K=0 TO 7 70 N=PEEK(C*8+J)>>(7-K)&1 75 POKEP,G,R,B,N*8:P=P+4 80 NEXT 85 POKEP,G,R,B,0:P=P+4 90 NEXT 91 FORJ=0TO9:POKEP,G,R,B,0:P=P+4:NEXT 92 IF USR(#700,#900) 95 NEXT 96 GOTO20


文字をランダムな背景色と合わせて表示

ド派手な電子工作から硬派な電車風電光掲示、ほんわかステキな演出など、手軽に作れちゃいますね!

アセンブラ「asm15」でコンパイルできる、WS2812用マシン語のソースコードはこちらです。

' OUT1 WS2812B DOUT [R1+`1]を変更でOUTnに変更可能 ' R0 - 開始アドレス 送信byte数low,送信byte数high,G1,R1,B1,G2,R2,B2 .... ' R1 - base address (初期はRAM offset) ' R2 - OUT value 0/#FF ' R3 - data value ' R4 - data count ' R5 - bit count ' R6 - wait count buf ' R7 - wait count @WS2812B PUSH {LR,R4,R5,R6,R7} CPSID R0=R0+R1 R1=#50 'R1=#50010000 GPIO1 R1=R1<<8 R1+=1 R1=R1<<16 R4=[R0]W R0+=1 @LOOP_DATA R5=#80 R0+=1 R3=[R0] @LOOP_BIT R2=#FF [R1+`1]L=R2 R7=1 '9+(4*1+1)=14 <- 16.8+-7.2 R6=8 '8+(4*8+1)=41 <- 43.2+-7.2 R3&R5 IF 0 GOTO @SKIP R7=8 '9+(4*8+1)=42 <- 43.2+-7.2 R6=1 '8+(4*1+1)=13 <- 16.8+-7.2 @SKIP CALL @WAIT R2=0 [R1+`1]L=R2 R7=R6 CALL @WAIT R5=R5>>1 IF !0 GOTO @LOOP_BIT R4-=1 '+6clock IF !0 GOTO @LOOP_DATA CPSIE POP {PC,R4,R5,R6,R7} @WAIT ' wait R7*4+1 clock R7-=1 IF !0 GOTO @WAIT RET

SK6812用にウェイト調整しなくても動きました。仕様に合わせて高速化したい場合、R6/R7のウェイトを調整しよう!

links
- マシン語を制すもの時間を制す「DMX512事例」 / IchigoJamでまなぶARMマシン語入門その10
- yhironaka/IchigoLamp: シリアルLED WS2812B をLPC810を使ってIchigoJamから光らせるっ!

泰越日 International IoT workshop with IchigoJam at Shiramine / 白峰の未来を創る国際IoTプログラム

2017/09/09 23:55:00
#IchigoJam #ishikawa #doc 

We PCN went to Shiramine KIT event at Ishikawa prefecture to teach the basics of IoT with IchigoJam to 15 students from Tai, Vietnam and Japan. タイ・ベトナムからの学生を迎えたKIT金沢工業大学による石川県白峰開催の国際イベントへ、IoT未来創造講座してきました。


slide "Make Own IoT for Our Future"
IchigoJam basic, LED, WAIT, GOTO for loops
External circuits LED, servo, light sensor and WiFi with MixJuice


They planed future of Shiramine. Our today's mission is to add IoT/IT technology to them.


Let's make own computer with soldering iron!


You can customize the colors of IchigoJam.


Let's make the simplest network to chat!


Let's discuss how to improve our plan with IoT!


They talked about IoT prototype to make.


This is pre prototype of Shiramine's IoT fountain(噴水).


日越泰 International dinner!


Delicious Tochi-mochi soup (とち餅のお吸い物) โลหะผสม! (アロイ、おいしい!)


Is it IchigoJam in Tai language!?


MEM-NUM - Memorize the Numbers (RUN on IchigoJam Web)
(Japanese edition, Vietnamesse edition, Swahili version) Let's learn numbers in Swahili! I modified from the . Swahili only use 24 types of alphabets.

This is a sample program to start to learn Tai language.
First step is numbers! (Thanks! คิดเลข 計算 | カティちゃんの楽しいタイ語)


My score reached 21! It's good way to learn with making a game on IchigoJam.

1 'MEM-NUM TAI 10 LET[0],"suun","nung","soong","saam","sii","haa","hok","jet","paet","gaao" 15 CLS:FOR I=0 TO 9:?I,STR$([I]):NEXT:?:?"HIT ANY KEY" 16 IF !INKEY() CONT 20 S=0:W=30 30 N=RND(10):Y=1:IF S>H H=S 40 CLS:LC 10,Y:?STR$([N]) 45 LC 6,0:?"SCORE:";S;" HISCORE:";H 46 LC 10,19:?"======" 50 K=INKEY() 60 IF K=N+48 S=S+1:W=W-1:GOTO30 62 WAIT W 65 IF K<>0 OR Y=18 LC 10,20:?"ANSWER:";N:WAIT60:RUN 70 Y=Y+1:GOTO40

We're very happy to meet them!
Thank you! And see you on Facebook or real!


at SHIRAMINE-SPA. 白峰温泉総湯

links
- ベトナム、タイ、シンガポール、インドネシアの学生が金沢工業大学、金沢高専の学生と多国籍チームを組み、金沢工業大学でイノベーション創出に取り組みます。 | ニュース | KIT金沢工業大学
- 2018年4月、金沢高専から国際高専へ - 日経ビジネスオンラインSpecial

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