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

材料
- 光らせたいかわいいアクセサリー
- 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で夜の快適な自転車探し

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS