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

IchigoJamとLPC810でつくるLED点滅クリスマスアクセサリー

2017/12/23
#IchigoJam #KidsIT #lpc810 

クリスマスのかわいいアクセサリー、マイコン制御でピカピカ光らせてみましょう!

材料
- 光らせたいかわいいアクセサリー
- LPC810 Armマイコン秋月電子通商
- IchigoJam
- ブレッドボード
- ジャンパーワイヤー5本
- LED(ボタン電池で光らせるので、赤か黄色あたりがオススメ)
- CR2032 ボタン電池
- CR2032 ボタン電池ケース
- 線材少々、はんだ少々

一番大きいボタン電池ケースが裏に隠れるくらいな大きさならOK!


1. IchigoJamでArmマイコンLPC810に点滅プログラムを書き込みます

RESETLPC810RXD- IchigoJamのTXD
IchigoJamのRXD -TXDGND- IchigoJamのGND
LEDみじかいほう -PIO0_33.3V- IchigoJamのOUT1
LEDながいほう -PIO0_2ISP- IchigoJamのOUT2
ブレッドボードとジャンパーワイヤー5本で、LPC810とIchigoJamをつなぎ、次のように点滅プログラムを書き込んで動かします。
(RESETの代わりにOUT1をLPC810の電源につなぐことで、ジャンパーワイヤー6本を5本に削減!)

100 'LPC810 WRITER A:ADR L:LEN 110 UART3,2:OUT2,0:OUT1,0:WAIT9:OUT1,1 120 CLS:?"?":GSB@R 130 ?"Synchronized":GSB@R 140 ?12000:?:GSB@R 150 ?"A 0":GSB@R 160 ?"U 23130":GSB@R 170 L=L+L%4:?"W 268435456 ";L:GSB@R:UART1,2:LC0,-1:FORI=0TOL-1:?CHR$(PEEK(A+I));:NEXT:UART3,2:LC0,6:? 180 ?"P 0 0":GSB@R:WAIT9 190 ?"E 0 0":GSB@R:WAIT9 200 ?"P 0 0":GSB@R:WAIT9 210 ?"C 0 268435456 256":GSB@R 220 OUT2,1:OUT1,0:OUT1,1:END 500 @R:K=INKEY():IF K=13 K=INKEY():RTN ELSE CONT SAVE1 10 POKE#700,0,4,0,16,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,251,255,239,20,72,21,73,1,96,21,72 20 POKE#728,1,104,3,34,210,67,17,64,1,96,19,72,19,73,1,96,19,72,12,33,1,96,19,77,4,38,46,96,21,74,1,58,253,209,17,72,3,33,1,96 30 POKE#750,20,48,12,33,1,96,15,72,1,104,4,34,17,67,1,96,13,72,1,104,1,34,17,67,1,96,12,48,12,73,1,96,48,191,0,0,128,128,4,64 40 POKE#778,217,2,0,0,16,0,4,64,192,193,0,64,191,255,255,255,0,32,0,160,0,35,0,160,0,0,2,64,16,237,0,224,0,128,0,64,64,156,0,0 50 POKE#7A0,16,39,0,0 60 A=#700:L=164:LRUN1 SAVE0 RUN

1秒間隔に点滅しましたか?
点滅間隔は簡単に変えられます。

POKE#7A1,13 RUN

3倍速くなります!


2. 書き込み終わったマイコンLPC810とLED、電池ケースをアクセサリーにはんだづけ!


できあがり!
IchigoJamでつくる!LPC810マイコン点滅クリスマスアクセサリー - YouTube

(おまけ)LPC810 Armマシン語プログラムと解説

DATA L #10000400 ' stack top DATA L #21 ' entry point DATA L 0,0,0,0,0 DATA L #EFFFFBDF ' VALID_CODE = 0x100000000-0x10000400-0x21 @ENTRY R0=[@SYSAHBCLKCTRL]L R1=[@USE_DEVICE]L [R0]L=R1 R0=[@FLASHCFG]L R1=[R0]L R2=3 ' flash no wait: set 0b00 R2=~R2 R1&=R2 [R0]L=R1 R0=[@PINENABLE0]L R1=[@PINENABLE0_DATA]L [R0]L=R1 R0=[@GPIO_DIR0]L R1=`1100 ' PIO0_2 and PIO0_3 [R0]L=R1 ' LED R5=[@GPIO_NOT0]L R6=`0100 [R5]L=R6 ' WAIT R2=[@WAIT_CNT]L R2-=1 IF !0 GOTO -1 ' init deep power down R0=[@PMU_PCON]L R1=3 [R0]L=R1 ' PM = deep powerdown R0+=#14 'PMU_DPDCTRL R1=`1100 [R0]L=R1 ' enable 10kHz ' deep power down R0=[@SCB_SCR]L R1=[R0]L R2=4 R1|=R2 [R0]L=R1 ' deep sleep ' wake up timer R0=[@WKT_CTRL]L R1=[R0]L R2=1 R1|=R2 [R0]L=R1 ' use 10kHz R0+=#C ' WKT_COUNT R1=[@SLEEP_CNT]L [R0]L=R1 WFI @SYSAHBCLKCTRL DATA L #40048080 @USE_DEVICE 'WKT, SCT:off, SWT, GPIO, I2C:off, FLASH, FLASHREG, RAM:off, ROM:off, SYS DATA L `1011011001 @FLASHCFG DATA L #40040010 @PINENABLE0 DATA L #4000C1C0 @PINENABLE0_DATA DATA L #FFFFFFBF @GPIO_DIR0 DATA L #A0002000 @GPIO_NOT0 DATA L #A0002300 @PMU_PCON DATA L #40020000 @SCB_SCR DATA L #E000ED10 @WKT_CTRL DATA L #40008000 @WAIT_CNT DATA L 40000 ' 0.01sec (12MHz) @SLEEP_CNT DATA L 10000 ' 1sec (10kHz)

SYSAHBCLKCTRLの設定で使う部分だけに絞って省電力化
FLASHCFGでFlashアクセスのウェイトをなくす
PINENABLE0でGPIOを使える状態にする
GPIO_DIR0でGPIOを出力設定にし、GPIO_NOT0で点灯
WAIT_CNT分だけ待って、消灯(1ループ3clock、12MHz動作なので40000で0.01秒)
消費電流が0.17uA(=0.00017mA)まで下がる低電力モード(deep power down)設定
10kHzのWKT(wake up timer)にSLEEP_CNTを設定(10000で1秒)
SLEEP_CNTのアドレスが、IchigoJamで書き込む際 #7A0からの4byteなので、POKE文で設定できる

links
- はじめてのマシン語 - IchigoJamではじめるARMマシン語その1
- LPC810をあやつろう - IchigoJamプリント
- 時間を創出するツール、80円マイコンLPC810で夜の快適な自転車探し

LPC810をあやつろう - IchigoJamプリント

2017/12/20
#IchigoJam #KidsIT #lpc810 

Arm(アーム)のかわいいコンピューター、NXP社製LPC810は、鯖江の小学生に大人気
IchigoJam用自習教材、IchigoJamプリントとして「LPC810をあやつろう」を追加!

この続きで、点滅させたり、光るカセットテープを操ったり、音楽を鳴らしたりと拡張していきます。

LPC810をあやつろう」 - IchigoJamプリント


LPC810 on 指先
LPC810は残念ながら生産終了ですが、他のLPC8xxシリーズで同様のプログラムが使えるはずっ
マシン語プログラムはこちら「マシン語で作る!75円のかわいいArmマイコン、LPC810用エルチカプログラム

IchigoJamプリント on GitHub、編集協力者大募集!

Arm社訪問! クリスマスはArmマイコン IchigoJam を使ったオリジナルツリーづくりはいかがでしょう? Armマシン語 LPC810 x WS2812B 24MHz版

2017/12/19
#IchigoJam #KidsIT #lpc810 #asm #Arm 

Arm社の日本法人、アーム株式会社を訪問。Armと言えば、に、LPC810に、Z80以来のマシン語、楽しませてもらっています!(連載、Armマシン語入門
* 今年、2017.8.1、Arm社は、ARMからArmへと社名とブランドとロゴを変更(ロゴは全部小文字)。合わせて、本ブログ表記もArmへと変更しました。

内海社長ともお会いできました!クリスマスツリーの電飾は、おなじみWS2812B、Armでコントロールされたました!

おみやげに頂いた厚い本「ディジタル回路設計とコンピュータアーキテクチャ[ARM版]
スイッチサイエンスさんも翻訳出版に協力
原著はなんとKindleでも1万円オーバーの超大作「Digital Design and Computer Architecture: ARM Edition

なぜコンピューターは計算が速いのか?」で解説したスイッチの実体、トランジスタや2進数などの基本もしっかり。

マシン語、アセンブリ言語に関する解説もArmの実アーキテクチャーに添っていて実用的!

HDLや、具体的なCPU設計にまで踏み込むマイクロアーキテクチャの章まで揃っていて読み応え抜群。

サイトからI/Oや、C言語に関する解説などをpdfで読むことができます。
Elsevier · Harris, Harris: Digital Design and Computer Architecture · Welcome

2017.12.25(月)、クリスマス。Yahoo! Japan ロッジにて、Armマイコン、IchigoJamで作るクリスマスツリーづくりワークショップを復興庁さん主催で開催!

Fw:東北Weekly 家族でプログラミングしてみよう! 東北発のほやアートをつくってみよう! | Peatix
小中学生のこどもと保護者の方が対象です。プログラミングがはじめての人でもOK!自分だけのオリジナルキラキラツリーを作りましょうっ

(おまけ)Arm訪問記念マシン語プログラム for LPC810、24MHzで800kHz正確コントロール版。

DATA L #10000400 ' stack DATA L #21 ' entry point DATA L 0, 0, 0, 0, 0 DATA L #EFFFFBDF ' VALID_CODE = 0x100000000-0x10000400-0x21 @ENTRY R0=[@SYSAHBCLKCTRL]L R1=#DF 'SWM, GPIO, I2C:off, FLASH, FLASHREG, RAM, ROM, SYS [R0]L=R1 R0=[@FLASHCFG]L R1=[R0]L R2=3 ' flash no wait: set 0b00 R2=~R2 R1&=R2 [R0]L=R1 ' clock setting 24MHz R0=[@PDRUNCFG]L ' PLL power on R1=[R0]L R2=128 R2=~R2 R1&=R2 [R0]L=R1 R0=[@MAINCLKSEL]L R1=3 ' set PLL [R0]L=R1 R0=[@SYSPLLCTRL]L R1=1 ' 0:12MHz 1:24MHz, 2:36MHz, 3:48MHz, 4:60MHz, 7:96MHz, 8:108MHz NG [R0]L=R1 R0=[@MAINCLKUEN]L R1=0 [R0]L=R1 R1=1 [R0]L=R1 ' GPIO setting R0=[@PINENABLE0]L R1=[@PINENABLE0_DATA]L [R0]L=R1 R0=[@GPIO_DIR0]L R1=`1100 ' PIO0_2 and PIO0_3 [R0]L=R1 R4=[@GPIO_NOT0]L R2=`100 ' PIO0_2 ' WS2812B driver ' R0 - data count ' R1 - data address (G1,R1,B1,G2,R2,B2 ....) ' R2 - OUT value ' R3 - data value ' R4 - GPIO address ' R5 - bit count ' R7 - wait count @WS2812B R0=15 R1=@DATA_LED @LOOP_DATA R5=#80 R3=[R1] @LOOP_BIT [R4]L=R2 R3&R5 IF !0 GOTO @ONE @ZERO ' 10-20clock R7=2 ' wait 2*3 = 6clock R7-=1 IF !0 GOTO -1 NOP [R4]L=R2 R7=3 ' wait 3*3 = 9clock R7-=1 IF !0 GOTO -1 GOTO @JOIN @ONE ' 20-10clock R7=5 ' wait 5*3 = 15clock R7-=1 IF !0 GOTO -1 NOP [R4]L=R2 NOP @JOIN R5=R5>>1 IF !0 GOTO @SKIP2 ' 7clock == 1 R1+=1 R0-=1 IF !0 GOTO @LOOP_DATA GOTO @END @SKIP2 NOP NOP NOP GOTO @LOOP_BIT @END R7=[@WAIT_N]L R7-=1 'wait R7*3+1 clock IF !0 GOTO -1 GOTO @WS2812B ' init @SYSAHBCLKCTRL DATA L #40048080 @FLASHCFG DATA L #40040010 @PINENABLE0 DATA L #4000C1C0 @PINENABLE0_DATA DATA L #FFFFFFBF @GPIO_DIR0 DATA L #A0002000 @GPIO_NOT0 DATA L #A0002300 ' clock setting @MAINCLKSEL DATA L #40048070 @MAINCLKUEN DATA L #40048074 @SYSPLLCTRL DATA L #40048008 @PDRUNCFG DATA L #40048238 ' WS2812B @WAIT_N DATA L 4000000 @DATA_LED DATA B 10,0,0, 0,10,0, 0,0,10, 10,0,10, 0,10,10

正確に10clockと20clockに合わせているので、きれいな800kHzの波形がでているはず!
Flashのwait stateを0にしながら、24MHzが正しいのかはちょっと謎ですが、動いてはいるようです。
asm15 アセンブリ言語、アセンブルは、asm15 Assembler でどうぞ!

LPC810で光るカセットテープ! 富山高専射水キャンパスにてメンタリングとプログラミングの本質体験のススメ

2017/12/18
#IchigoJam #maker #lpc810 #asm #toyama #kosen 

起業家甲子園出場権を手にしたアントレプレナー研究会のある、富山高専射水キャンパスにてメンタリング。
富山高専本郷キャンパスでjigインターンのOB、すがっちとなぽりたんもジョイン!
高専生ならではの感性と創造力で北陸から一石、投じよう!

北陸、福井、鯖江の銘菓、めがね堅パンのハートエディション!

昨日のLPC810 x WS2812Bにバグが見つかり、無事光るカセットテープのLPC810エディションが点灯!

12MHz版だとちょっと信号はいい加減ですが、ちゃんと光りました!
(原因:asm15の DATA B 0,0,0 が、2byteアラインされてしまうため)

マシン語で作る、簡易キラキラプログラムがこちら!
末尾、16byteを変更すると、アニメーションするLEDの色が変わり、その前4byteでウェイトを調整できます。

10 POKE#700,0,4,0,16,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,251,255,239,33,72,223,33,1,96,33,72 20 POKE#728,1,104,3,34,210,67,17,64,1,96,31,72,31,73,1,96,31,72,12,33,1,96,31,76,4,34,15,32,32,161,30,75,14,120,30,112,1,49,1,51 30 POKE#750,1,56,249,209,15,32,26,73,128,37,11,120,34,96,43,66,8,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,96,7,224,0,0,34,96 40 POKE#778,0,0,0,0,0,0,0,0,0,0,0,0,109,8,233,209,1,49,1,56,228,209,13,79,1,63,253,209,10,73,14,120,14,32,79,120,15,112,1,49 50 POKE#7A0,1,56,250,209,14,112,213,231,128,128,4,64,16,0,4,64,192,193,0,64,191,255,255,255,0,32,0,160,0,35,0,160,0,0,0,16,128,26,6,0 60 POKE#7C8,20,0,0,20,20,0,20,0,20,20,20,0,0,20,0,0 70 A=#700:L=216:LRUN1 'FILE1 100 'LPC810 Writer 256byte from ADR:A 110 UART3,2:OUT2,0:OUT1,0:WAIT9:OUT1,1 120 CLS:?"?";:GSB@R 130 ?"Synchronized":GSB@R 140 ?12000:?:GSB@R:GSB@R 150 ?"A 0":GSB@R:GSB@R 160 ?"U 23130":GSB@R 170 ?"W 268436096 ";256:GSB@R:UART1,2:LC0,-1:FORI=0TO255:?CHR$(PEEK(A+I));:NEXT:UART3,2:LC0,6 180 ?"P 0 0":GSB@R 190 ?"E 0 0":GSB@R 200 ?"P 0 0":GSB@R 210 ?"C 0 268436096 256":GSB@R 215 '?"G 268436128 T":GSB@R:END 220 OUT2,1:OUT1,0:OUT1,1:END 500 @R:K=INKEY():IF K=13 K=INKEY():WAIT9:RTN ELSE CONT

マシン語のプログラムはこちら。
データを一旦RAM(#10000000)へ転送し、1ループごとにローテートさせています。

DATA L #10000400 ' stack DATA L #21 ' entry point DATA L 0, 0, 0, 0, 0 DATA L #EFFFFBDF ' VALID_CODE = 0x100000000-0x10000400-0x21 @ENTRY R0=[@SYSAHBCLKCTRL]L R1=#DF 'SWM, GPIO, I2C:off, FLASH, FLASHREG, RAM, ROM, SYS [R0]L=R1 R0=[@FLASHCFG]L R1=[R0]L R2=3 ' flash no wait: set 0b00 R2=~R2 R1&=R2 [R0]L=R1 R0=[@PINENABLE0]L R1=[@PINENABLE0_DATA]L [R0]L=R1 R0=[@GPIO_DIR0]L R1=`1100 ' PIO0_2 and PIO0_3 [R0]L=R1 R4=[@GPIO_NOT0]L R2=`100 ' PIO0_2 @COPYTORAM R0=15 R1=@DATA_LED R3=[@RAM]L @COPYTORAM_LOOP R6=[R1] [R3]=R6 R1+=1 R3+=1 R0-=1 IF !0 GOTO @COPYTORAM_LOOP ' WS2812B driver ' R0 - data count ' R1 - data address (G1,R1,B1,G2,R2,B2 ....) ' R2 - OUT value ' R3 - data value ' R4 - GPIO address ' R5 - bit count ' R7 - wait count @WS2812B R0=15 ' R1=@DATA_LED R1=[@RAM]L @LOOP_DATA R5=#80 R3=[R1] @LOOP_BIT [R4]L=R2 R3&R5 IF 0 GOTO @ZERO NOP NOP NOP NOP NOP NOP NOP [R4]L=R2 GOTO @JOIN @ZERO NOP [R4]L=R2 NOP NOP NOP NOP NOP NOP @JOIN R5=R5>>1 IF !0 GOTO @LOOP_BIT R1+=1 '+6clock R0-=1 IF !0 GOTO @LOOP_DATA @WAIT R7=[@WAIT_N]L R7-=1 'wait R7*3+1 clock IF !0 GOTO -1 R1=[@RAM]L R6=[R1] R0=14 @SLIDE R7=[R1+1] [R1]=R7 R1+=1 R0-=1 IF !0 GOTO @SLIDE [R1]=R6 GOTO @WS2812B ' init @SYSAHBCLKCTRL DATA L #40048080 @FLASHCFG DATA L #40040010 @PINENABLE0 DATA L #4000C1C0 @PINENABLE0_DATA DATA L #FFFFFFBF @GPIO_DIR0 DATA L #A0002000 @GPIO_NOT0 DATA L #A0002300 ' WS2812B @RAM DATA L #10000000 @WAIT_N DATA L 400000 @DATA_LED DATA B 20, 0, 0, 20, 20, 0, 20, 0, 20, 20, 20, 0, 0, 20, 0

asm15 assembler」でアセンブルできます!
WS2812Bの信号は、800kHz(秒間80万回、1.2マイクロ秒に1回)の波の形で、0と1とを区別するので、とても人の手では制御できませんが、マシン語ならたった30円のコンピューターにさせれば余裕です。

切っても切れない、社会とコンピューター。誰にでもオススメしたいプログラミング体験。
IchigoJam BASIC で、プログラミングの基本を、マシン語を使ってコンピューターの真の実力を、それぞれかんたんに体験できます!

WS2812Bを観察しよう!IchigoJamで開発するLPC810でフルカラーLED点灯実験

2017/12/17
#IchigoJam #maker #lpc810 #asm 

光るカセットテープで活躍するWS2812Bを、LPC810を使って自在に点灯できたら簡単、気軽にカセットテープ内にボタン電池も含めて収められてうれしいかも? (IchigoJamを書き込んだLPC1114を使って光るカセットテープを作った例 by JO3GBDさん)


LPC810から制御したWS2812B。
拡大してみると、信号が来るDI側から順に、緑、赤、青と小さく光っている様子が分かります。
データを送信する順も緑、赤、青!

プログラムはこの通り、マシン語部分が長くなってきたら、100行以降を別プログラムとして保存しましょう。

10 POKE#700,0,4,0,16,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,251,255,239,24,72,223,33,1,96,24,72 20 POKE#728,1,104,3,34,210,67,17,64,1,96,22,72,22,73,1,96,22,72,12,33,1,96,22,76,4,34,3,32,22,161,128,37,11,120,34,96,43,66,8,208 30 POKE#750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,96,7,224,0,0,34,96,0,0,0,0,0,0,0,0,0,0,0,0,109,8,233,209,1,49 40 POKE#778,1,56,228,209,7,79,1,63,253,209,222,231,128,128,4,64,16,0,4,64,192,193,0,64,191,255,255,255,0,32,0,160,0,35,0,160,64,66,15,0 50 POKE#7A0,2,2,2,0 60 A=#700:L=164:LRUN1 'FILE1 100 'LPC810 Writer 256byte from ADR:A 110 UART3,2:OUT2,0:OUT1,0:WAIT9:OUT1,1 120 CLS:?"?";:GSB@R 130 ?"Synchronized":GSB@R 140 ?12000:?:GSB@R:GSB@R 150 ?"A 0":GSB@R:GSB@R 160 ?"U 23130":GSB@R 170 ?"W 268436096 ";256:GSB@R:UART1,2:LC0,-1:FORI=0TO255:?CHR$(PEEK(A+I));:NEXT:UART3,2:LC0,6 180 ?"P 0 0":GSB@R 190 ?"E 0 0":GSB@R 200 ?"P 0 0":GSB@R 210 ?"C 0 268436096 256":GSB@R 215 '?"G 268436128 T":GSB@R:END 220 OUT2,1:OUT1,0:OUT1,1:END 500 @R:K=INKEY():IF K=13 K=INKEY():WAIT9:RTN ELSE CONT

ちょうど50行、#7A0からの3byteがG(緑)、R(赤)、B(青)の数を指定しています。
書き換えて、実験してみましょう。


LPC810と光ったWS2812B!

マシン語プログラムの解説

asm15でWS2812Bの制御用マシン語プログラムは、LPC1114用を元に、LPC810用に修正します。
Cortex-M0+のLPC810では、OUTポートの扱いがNOTを使えるので短く、1クロックで読み書きできるので高速!
ただ、標準動作の12MHz用に、ウェイトはループではなく、NOPコマンドで調整しました。
厳密にはデータの区切りで速度が追いついていないので、たくさん光らせようとするとおかしくなってしまうため、周波数を上げるかSPIでの制御にしないといけなさそうです。(追記、勘違いでした12MHzでもいけました!

DATA L #10000400 ' stack DATA L #21 ' entry point DATA L 0, 0, 0, 0, 0 DATA L #EFFFFBDF ' VALID_CODE = 0x100000000-0x10000400-0x21 @ENTRY R0=[@SYSAHBCLKCTRL]L R1=#DF 'SWM, GPIO, I2C:off, FLASH, FLASHREG, RAM, ROM, SYS [R0]L=R1 R0=[@FLASHCFG]L R1=[R0]L R2=3 ' flash no wait: set 0b00 R2=~R2 R1&=R2 [R0]L=R1 R0=[@PINENABLE0]L R1=[@PINENABLE0_DATA]L [R0]L=R1 R0=[@GPIO_DIR0]L R1=`1100 ' PIO0_2 and PIO0_3 [R0]L=R1 R4=[@GPIO_NOT0]L R2=`100 ' PIO0_2 ' WS2812B driver ' R0 - data count ' R1 - data address (G1,R1,B1,G2,R2,B2 ....) ' R2 - OUT value ' R3 - data value ' R4 - GPIO address ' R5 - bit count ' R7 - wait count @WS2812B R0=3 R1=@DATA_LED @LOOP_DATA R5=#80 R3=[R1] @LOOP_BIT [R4]L=R2 R3&R5 IF 0 GOTO @ZERO NOP NOP NOP NOP NOP NOP NOP [R4]L=R2 GOTO @JOIN @ZERO NOP [R4]L=R2 NOP NOP NOP NOP NOP NOP @JOIN R5=R5>>1 IF !0 GOTO @LOOP_BIT R1+=1 '+6clock R0-=1 IF !0 GOTO @LOOP_DATA @WAIT R7=[@WAIT_N]L R7-=1 'wait R7*3+1 clock IF !0 GOTO -1 GOTO @WS2812B ' init @SYSAHBCLKCTRL DATA L #40048080 @FLASHCFG DATA L #40040010 @PINENABLE0 DATA L #4000C1C0 @PINENABLE0_DATA DATA L #FFFFFFBF @GPIO_DIR0 DATA L #A0002000 @GPIO_NOT0 DATA L #A0002300 ' WS2812B @WAIT_N DATA L 1000000 @DATA_LED DATA B 2, 2, 2

開始アドレスを0に変えて、hexファイルに変換したものがこちら。
こちらをLPC810に直接書き込んでも動きます!

:1000000000040010210000000000000000000000BB :10001000000000000000000000000000DFFBFFEF18 :100020001848DF210160184801680322D2431140BB :10003000016016481649016016480C210160164CF3 :100040000422032016A180250B7822602B4208D0C1 :10005000000000000000000000000000000022601E :1000600007E0000022600000000000000000000027 :1000700000006D08E9D101310138E4D1074F013F9B :10008000FDD1DEE78080044010000440C0C1004084 :10009000BFFFFFFF002000A0002300A040420F0090 :0400A0000202020056 :00000001FF

links
- IchigoJamでLPC810マイコン開発!(デプロイ・完結編)
- IchigoJamでも光る大五郎! 300コのフルカラーLEDを簡単コントロール! IchigoJam x WS2812B/SK6812/NeoPixel
- はじめてのマシン語 - IchigoJamではじめるArmマシン語その1

IchigoJamでLPC810マイコン開発!(デプロイ・完結編)

2017/12/15
#IchigoJam #KidsIT #maker #lpc810 

鯖江の小学生に人気かわいいマイコンLPC810をIchigoJamで開発しましたが、書き込みがまだでした。
Flash ROMへと書き込んで、デプロイしましょう(独立動作させること)!

LPC810用のプログラムは、マシン語でつくり、IchigoJamからシリアル信号を使って書き込みます。


まとめ買いで30円(!)のコンピューター、LPC810に電池とLEDをつなぐだけ、好きなように光らせることができちゃいます!


鯖江市長にて、三菱UFJリサーチ&コンサルティングの杉原さんと、こどもむけオンライン教室を展開するLEARNieの南部さん、ルワンダ案内してくれた笠井さんと未来会議。 Hana道場を運営するNPO法人エル・コミュニティ竹部さん含め、地方・東京・世界、いろんなレイヤーでのつながりが熱い!


ますます外との連携を強化する鯖江市!


小学校だけでなく、中学校では部活動の一環で取り組むIchigoJamプログラミング!
教科書を一人ひとりが読みながら、トライ&エラー、ときに友達同士教えあって、オリジナル作品作りにトライというベストな学習環境でした。 このような環境が、オンラインで家に居ながらにして、周りに教室などがない小学生でも継続できる仕組みができるとステキです!


IchigoJamだけを使って、かわいいコンピューターLPC810の点滅プログラムを書き換えるデモ
ゆっくり点滅をIchigoJamと6本のジャンパー線でつながった、LPC810用ブレッドボードに移し、プログラムのひとつのデータを書き換えて、点滅速度を3倍に変更して、元に戻しています。

プログラム、全文はこちら!

1 'LPC810 Blink LED 10 POKE#700,0,4,0,16,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,251,255,239,11,72,223,33,1,96,11,72 20 POKE#728,1,104,3,34,210,67,17,64,1,96,9,72,9,73,1,96,9,72,12,33,1,96,9,72,4,33,9,74,1,112,19,70,1,59,253,209,250,231,0,0 30 POKE#750,128,128,4,64,16,0,4,64,192,193,0,64,191,255,255,255,0,32,0,160,0,35,0,160,128,132,30,0 90 A=#700:L=108 100 'LPC810 WRITER A:ADR L:LEN 110 UART3,2:OUT2,0:OUT1,0:WAIT9:OUT1,1 120 CLS:?"?":GSB@R 130 ?"Synchronized":GSB@R 140 ?12000:?:GSB@R 150 ?"A 0":GSB@R 160 ?"U 23130":GSB@R 170 ?"W 268436096 ";L:GSB@R:UART1,2:LC0,-1:FORI=0TOL-1:?CHR$(PEEK(A+I));:NEXT:UART3,2:LC0,6:? 180 ?"P 0 0":GSB@R:WAIT9 190 ?"E 0 0":GSB@R:WAIT9 200 ?"P 0 0":GSB@R:WAIT9 210 ?"C 0 268436096 128":GSB@R 220 OUT2,1:OUT1,0:OUT1,1:END 500 @R:K=INKEY():IF K=13 K=INKEY():RTN ELSE CONT

10-30行は、こちらでつくった点滅プログラムを、asm15で、IchigoJam BASIC用のデータにしたものです。
30行の末尾「128,132,30,0」が、点滅の周期なので、ここを「128,132,10,0」と変更すると3倍速くなります。いろんな速度に変更して楽しみましょう。

マシン語を変更すれば、光るカセットテープの制御もできそうですね!
音楽を鳴らしたり、たくさんのLEDを制御したり、リモコンの送受信に使ったり、複数のコンピューターを操れるようになるとまた創れるものが広がります!

ちょっと難しいので、IchigoJam BASICをある程度マスターしたら、どうぞ挑戦してみてください!
はじめてのマシン語 - IchigoJamではじめるArmマシン語その1

links
- マシン語で作る!75円のかわいいArmマイコン、LPC810用エルチカプログラム
- IchigoJam「で」LPC810マイコン開発!(まずは実行編)

IchigoJam「で」LPC810マイコン開発!(まずは実行編)

2017/12/11
#IchigoJam #maker #lpc810 

マシン語でLPC810のエルチカができたので、次のステップ、IchigoJamからの書き込みです。
IchigoJamだけで、LPC810の開発に成功しました!


エルチカのプログラムのメイン部分をBASICのPOKE文にasm15で変換して、メモリに書き込んでおきます。

10 POKE#700,11,72,223,33,1,96,11,72,1,104,3,34,210,67,17,64,1,96,9,72,9,73,1,96,9,72,12,33,1,96,9,72,4,33,9,74,1,112,19,70 20 POKE#728,1,59,253,209,250,231,0,0,128,128,4,64,16,0,4,64,192,193,0,64,191,255,255,255,0,32,0,160,0,35,0,160,128,132,30,0 30 A=#700:L=76

LPC810へはシリアル信号でつなぎます。RESETをOUT1、ISPをOUT2へ、TXD/RXDをクロスしてIchigoJamに接続。VCC/GNDもIchigoJamから取りましょう。

プログラムをメモリに書き込み、即実行するIchigoJam BASICプログラムがこちら

100 'LPC810 WRITER A:ADR L:LEN 110 UART3,2:OUT1,0:WAIT9:OUT1,1 120 CLS:?"?":GSB@R 130 ?"Synchronized":GSB@R 140 ?12000:?:GSB@R 150 ?"U 23130":GSB@R 160 ?"W 268435456 ";L:GSB@R:UART1,2:LC0,-1:FORI=0TOL-1:?CHR$(PEEK(A+I));:NEXT:UART3,2:LC0,6:? 170 ?"G 268435456 T":GSB@R:END 180 @R:K=INKEY():IF K=13 K=INKEY():RTN ELSE CONT

110行、LPC810を一度リセット
120行、?を送ることでシリアル信号のbpsを合わせてくれます
130行、bpsが合っていることを確認
140行、周波数12MHzを表します
150行、書き込みや実行権限をゲット
160行、アドレスAから、長さLを書き込み!
170行、書き込んだ場所を即実行!
※1 268435456は、16進数で#10000000、LPC810のRAMの先頭位置を表します。(linecalcで0x10000000)
※2 LPC1114と違って、バイナリで直接書き込めるのでプログラムが短く、速い!


マシン語を書き換えて、点滅速度を高速変えて書き込むデモ動画

マシン語を直接書くも良し、アセンブラやコンパイラを作るも良し。
安くてかわいいコンピューターを使いこなしちゃいましょう!
追記、デプロイ・完結編はこちら!


links
- マシン語で作る!75円のかわいいArmマイコン、LPC810用エルチカプログラム
- はじめてのマシン語 - IchigoJamではじめるArmマシン語その1
- LPCマイコン情報:LPC800 Cortex-M0+搭載-スイッチ・マトリックス
- LPC810 - marutsu
- LPC810 - 秋月電子通商
- IchigoJamでLPC810マイコン開発!(デプロイ・完結編)

マシン語で作る!75円のかわいいArmマイコン、LPC810用エルチカプログラム

2017/11/28
#lpc810 #maker #asm 

小さくても立派な32bit Arm Cortex-M0+のCPU、NXP社製、LPC810、75円 @marutsu
最大動作周波数30MHz、秒間3000万回計算してくれます!

本ブログでも、暗闇で自転車を探すフラッシュライトにしてみたり、おもちゃに音を組み込んだりクリスマス手作りプレゼントや、PCGサウンドライブラリSoundCortexをつかってIchigoJamから三和音鳴らしたりと、活躍。

このかわいいマイコンLPC810をIchigoJamでクロスプロットフォーム開発できる環境を目指し、BASIC風表記なアセンブリ言語 asm15 で、まずは基本にして、コンピューター制御の本質、LEDをチカチカさせる「エルチカ」プログラムをつくってみます。

エルチカは、2ステップあります。まずは、LEDを光らせること。そして、思い通りの時間待たせること。

LPC810のピンをこのように並びで使います。

RESETLPC810RXD
TXDGND
PIO0_33.3V
PIO0_2ISP

LPC1114と同様、電源を入れた時や、RESETがGNDから復帰した際、ISPがGNDになっていると書き込みモードになり、RXD/TXDをつかって、USBシリアルとソフト(FlashMagicやlpc21ispなど)で書き込みます。


ちょっと横着して、PIO0_2にLEDの長い方、PIO0_3に短い方を差し込んでテストします。

DATA L #10000400 ' stack top DATA L #21 ' entry point DATA L 0,0,0,0,0 DATA L #EFFFFBDF ' VALID_CODE = 0x100000000-0x10000400-0x21 @ENTRY R0=[@SYSAHBCLKCTRL]L R1=#DF 'SWM, GPIO, I2C:off, FLASH, FLASHREG, RAM, ROM, SYS [R0]L=R1 R0=[@PINENABLE0]L R1=[@PINENABLE0_DATA]L [R0]L=R1 R0=[@GPIO_DIR0]L R1=`1100 ' PIO0_2 and PIO0_3 [R0]L=R1 R0=[@GPIO_B0]L R1=1 [R0+2]=R1 GOTO 0 @SYSAHBCLKCTRL DATA L #40048080 @PINENABLE0 DATA L #4000C1C0 @PINENABLE0_DATA DATA L #FFFFFFBF @GPIO_DIR0 DATA L #A0002000 @GPIO_B0 DATA L #A0000000

LPC1114はCortex-M0、LPC810はCortex-M0+とマシン語はほぼ一緒ですが、IOの扱い方が違います。
1. LPC810のRAMは#10000000からの1KBなので、スタック初期値を#10000400に設定
2. 書き込みチェック用コードの次、#21にプログラム本体をおく
3. SYSAHBCLKCTRLで、GPIO、SWT(スイッチマトリクス、IOを切り替えるモノ)を設定
4. PINENABLE0で、PIO0_2/PIO0_3をGPIOとして使うよう設定
5. GPIO_DIR0で、PIO0_2/PIO0_3を出力に切り替え
6. GPIO_B0で、PIO0_2に1を書き込むと光る!
7. そのまま実行を続けてしまわなないように GOTO 0 で停止させておく

asm15で、Start Addressを0に設定、「hex file」出力を選択し、USBシリアルで書き込みます。
*3はスキップしても大丈夫でしたが、念のため。(参考、LPC1114の場合

次に、IchigoJam BASICでいう、WAITコマンドを実現して、0.5秒ごとについたり消えたりさせます。

DATA L #10000400 ' stack DATA L #21 ' entry point DATA L 0,0,0,0,0 DATA L #EFFFFBDF ' VALID_CODE = 0x100000000-0x10000400-0x21 @ENTRY R0=[@SYSAHBCLKCTRL]L R1=#DF 'SWM, GPIO, I2C:off, FLASH, FLASHREG, RAM, ROM, SYS [R0]L=R1 R0=[@FLASHCFG]L R1=[R0]L R2=3 ' set 0b00 == no wait R2=~R2 R1&=R2 [R0]L=R1 R0=[@PINENABLE0]L R1=[@PINENABLE0_DATA]L [R0]L=R1 R0=[@GPIO_DIR0]L R1=`1100 ' PIO0_2 and PIO0_3 [R0]L=R1 R0=[@GPIO_NOT0]L R1=`100 ' PIO0_2 R2=[@WAIT_N]L @LOOP [R0]=R1 ' 1cycle single cycle I/O R3=R2 ' 1cycle R3-=1 ' 1cycle IF !0 GOTO -1 'wait R3*3+2 cycles GOTO @LOOP ' 2cycles @SYSAHBCLKCTRL DATA L #40048080 @FLASHCFG DATA L #40040010 @PINENABLE0 DATA L #4000C1C0 @PINENABLE0_DATA DATA L #FFFFFFBF @GPIO_DIR0 DATA L #A0002000 @GPIO_NOT0 DATA L #A0002300 @WAIT_N DATA L 2000000

Cortex-M0+は、Cortex-M0と比較しGPIOアクセスや、GOTOのサイクルが短くなっています。(2→1、3→2、詳細はマニュアル参照

起動時の動作クロックは、内蔵オシレーターの12MHz。ウェイト用の1ループにかかる時間は3cycles。よって、12M/3で400万回ループで1秒。0.5秒のウェイトのために、WAIT_Nに200万を設定すればOK!

GPIO_NOT0という指定したビットに対応するIOを反転させるという便利な機能をつかって、エルチカループ(LOOP)をつくります。

注意点は、FLASHCFGの設定でウェイトを外しておくこと。 初期状態ではFlash ROMへのアクセスにウェイトがついているため、思ったより遅い点滅に悩みました。


2.54mmピッチではんだづけ工作にも優しい、8ピンDIPパッケージ(Dual inline package)のLPC810は、マシン語でさくっと遊べちゃうところもかわいい!

Armマシン語に興味もった方、「はじめてのマシン語 - IchigoJamではじめるArmマシン語」をどうぞ!

links
- [PDF]UM10601 LPC81x User manual - NXP Semiconductors
- LPCマイコン情報:LPC800 Cortex-M0+搭載-スイッチ・マトリックス,LPC824,LPC822,LPC810,LPC811,LPC812,LPC810M021FN8,LPC824M201,LPC822M101,LPC811M001,LPC812M101

PCNベトナムキックオフ、80円コンピューターで拡張するIchigoJam、レキシライブに市長登場

2016/07/18
#IchigoJam #lpc810 #pcn #vietnam #sabae 

ダナンでのIchigoJamこどもプログラミングイベントから、2ヶ月。
PCNベトナム代表、ダン・ロン氏、来福。
PCNこどもプロコン」は、海外からの応募も受付中!(PCN Kids Programming Contest
プログラミングという共通の話題で、ベトナムの子供と日本の子供をつなぎます!

高解像度写真


高解像度360度写真

ここは、福井駅前の新拠点ハピリンにある、福井の料理屋「らでん

旬な野菜を使ったジュレとうなぎ等、逸品ぞろい、負けないくらいいいもの創ろう!

・・・ということで、発見した、LPC1114より更に小さく安いコンピューターLPC810(80円!)を懐かしのPSG音源にするプロジェクトを、USBシリアルで開発しやすいよう、I2Cポートを変更したものをGitHubにアップ「SoundCortex forked
I2Cのスレーブデバイスとしての基本を押さえたので、いろいろ拡張の幅が広げられそう!
LPC1114/LPC810、どちらも話題のArmアーキテクチャ。

PSGで3和音を鳴らすデモ動画 on Vine

同日、鯖江出身アーティスト「レキシ」の福井ライブもありました。

鯖江市長、まさかのライブ出演!こちらは出演前、稲穂と。

レキシ「サングラス大使」栄えある第1号に任命 | ドワンゴジェイピーnews

jig.jp恒例500円プレゼント交換つき忘年会!あるものも創る

2015/12/11
#maker #jig #lpc810 

jig.jp 鯖江の忘年会の恒例企画、500円プレゼント交換会。予算内でいかに工夫するか、腕の見せ所!

今回はサンタさんがプレゼントをランダムに渡していくスタイル。


何が入っているかどきどき。


懐かしの知恵の輪セットでした!
自分では買わないけど、もらうとうれしいゾーン!まさにプレゼントの醍醐味ですね!


私が用意したものは今年人気だったウォッチと残り予算200円でつくる電子ゆきだるま。
LPC810でジングルベルの音楽を鳴らしながら、LEDをピカピカさせます。

ジングルベルMML A8A8AA8A8AA8 <C8>F8.G16A4R4 B-8B-8B-8.B-16B-8A8A8A16A16A8G8G8F8G8<C>R8 A8A8AA8A8AA8 <C8>F8.G16A4R4 B-8B-8B-8.B-16B-8A8A8A8<C8C8>B-8G8F4R


100均のライトを分解したものを電池ケース&台座として使って、ゆきだるまをモデリング(Thingverse)。
はんだづけしてできあがり!


ちっちゃくつくるためにLPC810を使いましたが、IchigoJamを使うと同じようなものBASICで簡単につくれます。

何をあげるかより、誰があげるかが大事なプレゼント。あるかどうかの調査はすっ飛ばして、思いをこめてまず創って成立するプレゼント。 自分で創れば、世界にたった一つのオリジナル、かぶる心配はいりません!

良い、忘年会を!

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