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

国立高専、正式には「独立行政法人 国立高等専門学校機構 〇〇工業高等専門学校」と長い。
高専は日本独自の教育カリキュラム、「高専はKOSENであり訳さない!」と、高専機構理事長の谷口さん。


高専の英語サイトは「KOSEN」とシンプルで目立つ表記。


こちら、高専の日本語サイト、文字が長い。

もし改名すれば各学校は相当シンプルになる。例えば福井高専で、次のように12文字短縮。
独立行政法人国立高等専門学校機構 福井工業高等専門学校
独立行政法人高専機構 福井高専

ちなみに、福井高専のドメインは、fukui-nct。 以前の英語名称 Fukui National Collage of Technology だった頃の名残り。
現在書いてある訳語「National Institue of Technology」は、国立の研究所?と誤解を生むだけなので削除したい。


初開催となる、高専の未来を語る会、食事しながらざっくばらんスタイルで開催(写真ぶれでスミマセン)
高専機構谷口理事長による高専への熱い思いからスタート!


高専OB、10名による、3分間で自己紹介と高専の未来への提言!


高専機構と高専卒起業家。
未来の高専に関して、提案、提言は多岐に渡った、2時間半にも及んだ、愛あるディスカッション。
次回も楽しみです!

1つ、追加の提言「高専の目的を変更」
現行の目的:深く専門の学芸を教授し、職業に必要な能力を育成する
新しい目的:深く専門の学芸を教授し、複雑な世界に対処できる能力を育成する

専門性はそのままに、国際バカロレアのエッセンスを混ぜ、社会との関わりを強化しました。
職業という言葉は従事するイメージが強く、起業家、イノベーターに結びつかないので廃止希望。
教育の基本理念(目的・方針)に関する教育基本法の規定の概要
* 過去、改正の動きもあったようです


生きる力は、変化できる力、創り出す力。高専起業家OBパワー発揮していきましょう!
(*OBは、OB。boyの意味は忘れます)


この日のお昼は、専攻科インターン成果発表会のため石川工業高等専門学科へ。
この看板をパッと見て高専だと認識できる人は少ないと思ったほうがいいでしょう。
ここも「石川高専」とすれば、わかりやすいし目に付きやすい。


高校で必修となるGIS、高専ではもう一歩先いっておくべきですね。
jigインターン生、ナリによるSPARQL入門はこちら。
SPARQL初心者の学習日誌 :: 開発者サイト|オープンデータプラットフォーム


福井県内のIT企業と、地域ICTクラブで開催した、越前がにロボコンを大会前からサポートしてくれました!
高専生の実践力と、地域とIT力が共にアップするローカルロボコン、ローカルプロコン、ぜひ広めたい。

約3ヶ月という長期インターンを専攻科(5年卒業後の2年間課程)にて実施している石川高専。インターンについて発表する学生は皆、社会との関わりで学ぶ大切さを感じている様子。 まさに体験に勝る学習なし。できるだけ早いタイミングでのインターンと、その単位認定化を進めると、一層強い高専生になるでしょう。

地域のおもしろい企業の社会人による招待講義や、地元自治体へのヒアリングなど、実社会との接点を増やし、成果を埋めば、知名度問題、やる気問題共に解決!


女の子向けのプログラミングを実践する、神戸高専出身、激レア高専卒女性起業家、幸田フミさんとも再会!
児童養護施設の女児のために、働く女性ができること。:FUMITALK – FUMIKODA JOURNAL【フミコダ】
高専生の女性割合は20%。海外での工学部では女子の方が多いなど、性差の問題ではなく、日本の問題。

理系思考と女子比率が低い、日本の特徴は、小中学校の先生が理系ではないことがきっと原因。
日本の女子高生はなぜ理系になりたがらないのか | 舞田敏彦のデータで読み解くDUALな疑問 | 日経DUAL、)

理系、かつ、自分に近いお兄さんお姉さんから学ぶプログラミングによるインパクトは大きく、文系男子偏重を正す大きなチャンス!
総務省|若年層に対するプログラミング教育の普及推進事業|「IchigoJamでものづくり」~地域人材を活かして行うもの作りを通した科学技術体感型授業~」福井高専学生が小学生向けメンターに
高専生が伝える小学生プログラミング at スゴイ津幡町まちなか科学館、高専生先生の意気込み&感想動画 / KidsVenture x 石川高専

こちら本日の装備品、コンパクトにまとめた光るネクタイ LPC810 x 単4電池バージョン。

七色に輝くネクタイのプログラム(LPC810をあやつろうを使って、IchigoJamから書き込む)

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,47,72,223,33,1,96,47,72,1,104,3,34,210,67,17,64,1,96,45,72,45,73,1,96,45,72,12,33,1,96,1,36,36,7,50,38,48,2 20 POKE#746,32,96,0,32,0,33,2,70,2,42,0,221,3,58,0,35,1,37,40,66,0,208,51,70,91,26,0,43,0,218,91,66,163,84,127,180,0,240,21,248,0,240,51,248,127,188,33,74,163,24,31,70,3,63,3,58,1,59,1,63,61,120 30 POKE#784,29,112,1,58,249,209,1,49,177,66,221,209,1,48,6,40,217,209,215,231,24,72,33,70,21,76,4,34,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,0,0,0,0,0,0 40 POKE#7C6,0,0,0,0,0,0,109,8,233,209,73,28,1,56,228,209,112,71,7,79,1,63,253,209,112,71,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,26,6,0,96,0,0,0 50 A=#700:L=256:LRUN1 SAVE0 NEW 1 'LPC810 Writer 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 ";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 190 ?"E 0 0":GSB@R 200 ?"P 0 0":GSB@R 210 ?"C 0 268436096 256":GSB@R 220 OUT2,1:OUT1,0:OUT1,1:LED1:END 300 @R:K=INKEY():IF K=13 K=INKEY():WAIT9:RTN ELSE CONT SAVE1 LRUN0

続いて、電子工作。

単4電池2本の電池ボックスをDOUT側5VとGNDへ。
制御用マイコン LPC810 のVCC、GND、PIO0_2 を、DIN側の5V、GND、DINにはんだづけ!

asm15、Armマシン語のプログラムはこちら
(IchigoJamで慣れた小中学生向け「やさしいArmマシン語入門」を読むと解読できます)

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 @MAIN R4=1 R4=R4<<28 ' = RAM #10000000 R6=50 ' =V R0=R6<<8 [R4]L=R0 ' HUE ' R0, R1: loop ver ' R4 : ram ' R6 : V ' R2, R3, R5, R7 : temp @HUE ' R4 color address R0=0 ' 0 to 5, =I @HUE_LOOP1 R1=0 ' to T, =H @HUE_LOOP2 R2=R0 R2-2 IF LE GOTO @HUE_SKIP1 ' if A>2 R2-=3 @HUE_SKIP1 R3=0 R5=1 R0&R5 IF 0 GOTO @HUE_SKIP2 R3=R6 ' =V @HUE_SKIP2 R3=R3-R1 R3-0 IF GE GOTO @HUE_SKIP3 R3=-R3 @HUE_SKIP3 [R4+R2]=R3 PUSH {R0-R6} CALL @WS2812B CALL @WAIT POP {R0-R6} @SLIDE_DATA R2=[@LED_N]L R3=R4+R2 R7=R3 R7-=3 R2-=3 @SLIDE_DATA_LOOP R3-=1 R7-=1 R5=[R7] [R3]=R5 R2-=1 IF !0 GOTO @SLIDE_DATA_LOOP R1+=1 R1-R6 ' =V IF !0 GOTO @HUE_LOOP2 R0+=1 R0-6 IF !0 GOTO @HUE_LOOP1 GOTO @HUE 'WS2812B x1 driver 'param ' R4 - address (B, R, G) 'use ' R0 - data count (ex WS2812B x 3) == 3 ' R1 - address (B, R, G) ' R2 - OUT value ' R3 - data value ' R4 - GPIO address ' R5 - bit count @WS2812B R0=[@LED_N]L R1=R4 R4=[@GPIO_NOT0]L R2=`100 ' PIO0_2 @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=R1+1 '+6clock R0-=1 IF !0 GOTO @LOOP_DATA RET 'WAIT 'use ' R7 - wait count @WAIT R7=[@WAIT_N]L R7-=1 'wait R7*3+1 clock IF !0 GOTO -1 RET ' 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 400000 @LED_N DATA L 32*3 ' length of WS2812B * 3

高専機構も後援、PCNこどもプロコン2018
過去最多作品数を集め、現在審査に入っています。
高専賞の受賞者には、宮崎県、都城高専が主管校となる高専プロコン30周年記念大会への招待が決定!
第30回都城大会(2019) 2019/10/13-14」
お楽しみに!

鯖江のものづくり友達、きものサロンまるよさんからスズムシがうるさすぎると相談あり。 一定間隔でスズムシの鳴き声が聞こえる、スズムシボックスを秋の店内にあると風流でいいのだけれど、ちょっと鳴く間隔が短すぎて、鬱陶しい、と。

9V電池を電源に、鳴き声電子回路が入っていることがわかったので、できるだけ非破壊による改造を試みる。 電源ケーブルを延長する形にして、トランジスタによる電子スイッチと、マイコンによる時間制御、マイコン用の3.3V生成が必要。


ブレッドボードで定期的に電源がONになる動作を確かめて、何秒間隔がいいか実験する
IchigoJam BASICなら、確認簡単!

10 OUT 1 20 WAIT 22*60 30 OUT 0 40 WAIT 180*60 50 GOTO 10

ONにしてから鳴くまでに間があるので、22秒間ONにすることで、ちょうど1ループ鳴く。そのままONにしておくと10秒たらずで何度も鳴くのは確かに鳴きすぎ。 ひとまず、3分間待って、再度鳴くようにしてみると、風流さが出た。


このままでは、箱に納まらないので、回路図を書いて、ユニバーサル基板にはんだづけする。 トランジスタを2段、3.3Vレギュレーター1つとIC3つ。どのようにつなぐかがパズルのようで楽しい。 Upverterなどで基板を起こしてもいいが、時間とお金が少々かかる。


IchigoJamよりコンパクトな、IchigoDakeでも、まだ納まらなかったのと、ちょっとオーバースペックなのも気になるので、LPC810へ移植する。 22秒間 ON にして、180秒は低電力モード(deep power down)で OFF にするプログラムを、IchigoJamからLPC810へ書き込む。

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,22,72,23,73,1,96,23,72,1,104,3,34,210,67,17,64,1,96,21,72,21,73,1,96,21,72,12,33,1,96,21,77,4,38,46,96,25,72 20 POKE#746,23,74,1,58,253,209,1,56,250,209,17,72,3,33,1,96,20,48,12,33,1,96,15,72,1,104,4,34,17,67,1,96,14,72,1,104,1,34,17,67,1,96,12,48,13,73,14,74,81,67,1,96,48,191,128,128,4,64,217,2,0,0,16,0 30 POKE#786,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,0,9,61,0,16,39,0,0,22,0,0,0,180,0,0,0 50 A=#700:L=180 100 UART3,2:OUT2,0:OUT1,0:WAIT9:OUT1,1:CLS:?"?":GSB@R 110 ?"Synchronized":GSB@R:?12000:?:GSB@R:GSB@R:?"A 0":GSB@R:GSB@R 120 ?"U 23130":GSB@R:?"W 268436096 ";L:GSB@R:UART1,2:LC0,-1:FORI=0TOL-1:?CHR$(PEEK(A+I));:NEXT:UART3,2:LC0,6:? 130 ?"P 0 0":GSB@R:?"E 0 0":GSB@R:?"P 0 0":GSB@R 140 ?"C 0 268436096 256":GSB@R:OUT2,1:OUT1,0:OUT1,1:END 150 @R:K=INKEY():IF K=13 K=INKEY():WAIT9:RTN ELSE CONT

180byteのArmマシン語をLPC810へ、書き込む(接続方法は、IchigoJamプリント参照)。30行の末尾、22と180の部分は、ONとOFFの秒数、好きな値に変えられる。(Armマシン語のソースプログラムは本記事末尾)


LPC810をIchigoDakeとピン配置をあわせるボードをはんだづけしてつくる。(LPC810の2番ピンWAKEUPをプルアップしないと、低電力モードが動作しないので注意!)


納まった!


元の箱に戻って、3分おきに鳴るように改造されたスズムシボックスのできあがり!

(LPC810を定期実行させる、Armマシン語 in asm15

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 (WAIT_CNT * ON_SEC) R0=[@ON_SEC]L R2=[@WAIT_CNT]L R2-=1 IF !0 GOTO -1 R0-=1 IF !0 GOTO -4 ' init deep power down R0=[@PMU_PCON]L R1=3 ' PM = deep powerdown [R0]L=R1 R0+=#14 'PMU_DPDCTRL R1=`1100 ' enable 10kHz [R0]L=R1 ' deep power down R0=[@SCB_SCR]L R1=[R0]L R2=4 ' deep sleep R1|=R2 [R0]L=R1 ' wake up timer R0=[@WKT_CTRL]L R1=[R0]L R2=1 ' use 10kHz R1|=R2 [R0]L=R1 R0+=#C ' WKT_COUNT (SLEEP_CNT * OFF_SEC) R1=[@SLEEP_CNT]L R2=[@OFF_SEC]L R1*=R2 [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 4000000 ' 1sec (12MHz) @SLEEP_CNT DATA L 10000 ' 1sec (10kHz) @ON_SEC DATA L 22 ' (sec) @OFF_SEC DATA L 180 ' (sec)

2017年のクリスマス時に作ったものをベースに小変更。
@ON_SEC、@OFF_SEC 部分が、ONにする時間と、OFFにする時間。IchigoJam BASICからPOKE文でも簡単に変更可能。

毎年恒例、鯖江の忘年会用の500円のクリスマスプレゼント、今年の和紙あかり!
色相をゆったりと変えながらほのかに光るオブジェです。

水風船、木工用ボンド、ハケを購入、300円(今回使用した和紙はもらいもの)
マイコンLPC810 75円電池ケース110円、WS2812B 12円、と合わせて500円!

和紙をいい感じにちぎります。

和紙を水に浸し、水で溶いた木工用ボンドをハケで塗って、膨らませた水風船に貼っていきます。

和紙で包んだ水風船。

ドライヤーでざっと乾かしますが、時間がかかりそうだったので吊り下げて放置。

乾いたら風船を割って、ハサミで形を整えてできあがり!

LPC810の開発は、IchigoJam上で可能!
マシン語をIchigoJamからLPC810へシリアルケーブルと制御信号を使って書き込み!
(接続方法、LPC810 - IchigoJamプリント

こちら書き込みプログラムと、WS2812Bで色相環のマシン語プログラム(ソースは末尾に)

1 'LPC810 Writer 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 ";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 190 ?"E 0 0":GSB@R 200 ?"P 0 0":GSB@R 210 ?"C 0 268436096 256":GSB@R 220 OUT2,1:OUT1,0:OUT1,1:END 300 @R:K=INKEY():IF K=13 K=INKEY():WAIT9:RTN ELSE CONT SAVE1 NEW 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,41,72,223,33,1,96,41,72,1,104,3,34,210,67,17,64,1,96,39,72,39,73,1,96,39,72,12,33,1,96,40,76,10,38,48,2,32,96 20 POKE#746,0,32,0,33,2,70,2,42,0,221,3,58,0,35,1,37,40,66,0,208,51,70,91,26,0,43,0,218,91,66,163,84,127,180,0,240,10,248,0,240,40,248,127,188,1,49,177,66,232,209,1,48,6,40,228,209,226,231,3,32 30 POKE#782,23,73,21,76,4,34,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,0,0,0,0,0,0,0,0,0,0,0,0,109,8,233,209,73,28,1,56,228,209,112,71,8,79,1,63,253,209,112,71 40 POKE#7C8,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 50 A=#700:L=232:LRUN1 SAVE2 RUN

LPC810へ書き込んだら、電源をつなぐだけで光ります!

立てて使いたいので、単4電池2本のスイッチ付き電池ケースの線を出す方向を変更。

照明を正面にすることにこだわった結果、マイコンLPC810がちょっとはみ出しました。

できあがり!

とっておいたちょうど箱でパッケージング!

ラベルプリンターで製品名を貼り付け。リボンは自分では結べませんでした。

喜んでくれて何より!
和紙とのりの工作、簡単で良い仕上がりになるのでおすすめ!
中身のライト、IchigoJam制御にしたり、100均で買ってきてもいいですね。


IchigoJamからLPC810へ書き込んでいる様子

WS2812Bを色相環制御するLPC810用 Armマシン語プログラム、asm15表記
@MAIN内のR6が最大輝度、@WAIT_Nが色を切り替える待ち時間
色相環アルゴリズムは、PCN秋葉原 Assemblage 発のBASICプログラムから移植

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 @MAIN R4=[@RAM]L R6=10 ' =V R0=R6<<8 [R4]L=R0 ' HUE @HUE ' R4 color address R0=0 ' 0 to 5, =I @HUE_LOOP1 R1=0 ' to T, =H @HUE_LOOP2 R2=R0 R2-2 IF LE GOTO @HUE_SKIP1 ' if A>2 R2-=3 @HUE_SKIP1 R3=0 R5=1 R0&R5 IF 0 GOTO @HUE_SKIP2 R3=R6 ' =T @HUE_SKIP2 R3=R3-R1 R3-0 IF GE GOTO @HUE_SKIP3 R3=-R3 @HUE_SKIP3 [R4+R2]=R3 PUSH {R0-R6} CALL @WS2812B CALL @WAIT POP {R0-R6} R1+=1 R1-R6 ' =T IF !0 GOTO @HUE_LOOP2 R0+=1 R0-6 IF !0 GOTO @HUE_LOOP1 GOTO @HUE 'WS2812B x1 driver 'param ' R1 - address (B, R, G) 'use ' R0 - data count (ex WS2812B x 3) == 3 ' R2 - OUT value ' R3 - data value ' R4 - GPIO address ' R5 - bit count @WS2812B R0=3 R1=[@RAM]L R4=[@GPIO_NOT0]L R2=`100 ' PIO0_2 @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=R1+1 '+6clock R0-=1 IF !0 GOTO @LOOP_DATA RET 'WAIT 'use ' R7 - wait count @WAIT R7=[@WAIT_N]L R7-=1 'wait R7*3+1 clock IF !0 GOTO -1 RET ' 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

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

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

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

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

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


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

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

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 でどうぞ!

起業家甲子園出場権を手にしたアントレプレナー研究会のある、富山高専射水キャンパスにてメンタリング。
富山高専本郷キャンパスで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を、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

鯖江の小学生に人気かわいいマイコン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マイコン開発!(まずは実行編)

マシン語で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マイコン開発!(デプロイ・完結編)

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