Bus pirate(4) <スクリプトを動かしてみる>
相も変わらず Bus Pirateで遊んでいる。
BusPirateには組み込みscript(BASICのサブセット)がある。
terminalインタフェースではデバイスからのレスポンスを待つのは難しいが、scriptを使うとできるようになる。
以前に買ったLED&KEYを制御してみた。
このモジュールのLEDコントローラにはTM1638が使われている。インタフェースは、クロック(CLK)に同期したシリアル通信で、データ(DIO)は双方向だ。デバイの選択はSTBをLにする。
BusPirateの raw 2-wireで制御してみる。
接続はこんな感じ↓
BusPirate
LED&KEYMOSI---DIOCLK---CLKAUX---STB5V-+-VCCVPU-+
GND---GND
ビットオーダーには注意が必要だ。SPIやI2CはMSBから送るMSB-firstだがTM1368はLSBから送るLSB-firstだから、"L"コマンドでビットオーダーを切り替えなくてはならない。
↓実行結果
HiZ>m 6 1 1 ← raw 2-wire R2W (spd hiz)=( 0 1 )Ready 2WIRE>WPLc ← PowerON,PullUP,LSBfirst,ctrlAUX Power supplies ON Pull-up resistors ON LSB set: LEAST sig bit first ← "L"command a/A/@ controls AUX pin ← "c"command 2WIRE>v Pinstates: 1.(BR) 2.(RD) 3.(OR) 4.(YW) 5.(GN) 6.(BL) 7.(PU) 8.(GR) 9.(WT) 0.(Blk) GND 3.3V 5.0V ADC VPU AUX SCL SDA - - P P P I I I O I I I GND 3.29V 5.02V 0.00V 5.02V H L H H H 2WIRE>a 0x40 A ← DataCommand: WriteRegister,AutoIncremet AUX LOW WRITE: 0x40 AUX HIGH 2WIRE>a 0xC0 ← AUX←L、AddressCommand: 00h AUX LOW WRITE: 0xC0 2WIRE> 0x76,0x00, 0x79,0x00, 0x38,0x00, 0x38,0x00 ← "HELL" WRITE: 0x76 WRITE: 0x00 WRITE: 0x79 WRITE: 0x00 WRITE: 0x38 WRITE: 0x00 WRITE: 0x38 WRITE: 0x00 2WIRE> 0x3F,0x00, 0x40,0x01, 0x40,0x01, 0x40,0x01 ← "O---" WRITE: 0x3F WRITE: 0x00 WRITE: 0x40 WRITE: 0x01 WRITE: 0x40 WRITE: 0x01 WRITE: 0x40 WRITE: 0x01 2WIRE>A ← AUX←H AUX HIGH 2WIRE>a 0x8A A ← DisplayControl: DispON AUX LOW WRITE: 0x8A AUX HIGH 2WIRE> |
表示を動かそうとするとコマンドを何回も入力しなければならないので、scriptで動かしてみる。
BusPireteのscriptはBASICのサブセットなので制限がある。
- 数値は10進数だけ。16進数は使えない
"="コマンドで10進、16進、2進の変換ができるので、10進数にする。 - 変数への代入はLETを使う
×A=10、〇LET A=10 - "DATA"、"READ"コマンドはあるけど"RESTOR"コマンドが無い
- AUXピンが制御できない
"AUXPIN 0"でAUXピンが制御できるはずだが、CSしか制御できない(BUG?) - "SEND"コマンドのビットオーダーは常にMSB-First
ターミナルコマンド"L"を引き継がない。
AUXピンが制御できないのは致命的だ。 仕方がないので、ターミナルコマンドでDataCommand(40h)、DispContorl(88h)を送っておいて、表示データをscriptで送ってみる。
↓ターミナルで送るコマンド
m 6 1 1 ← raw 2-wireWPLc ← PowerON,PullUP,LSBfirst,ctrlAUX a 0x40 A ← DataCommand: WriteRegister,AutoIncremet a 0xC0 ← AUX←L、 AddressCommand: 00h |
scriptを例えば"hello.bas"というファイル名で保存しておいて、ターミナル・ソフトのファイル送信機能でBusPirateに送ると簡単。 BusPirateが処理する時間を確保するために行当たり500msの時間待ちしている。
scriptはこんな感じ↓
10 FOR I=1 TO 10020 GOSUB 1000 30 DELAY 100 40 NEXT I 50 END 999 REM Disp HELLO 1000 IF I<50 THEN SEND 0 1010 IF I<50 THEN SEND 128 1020 SEND 110 1030 SEND 0 1040 SEND 158 1050 SEND 0 1060 SEND 28 1070 SEND 0 1080 SEND 28 1090 SEND 0 1100 SEND 252 1110 SEND 0 1120 SEND 0 1130 SEND 128 1140 SEND 0 1150 SEND 128 1160 IF I<50 THEN SEND 0 1170 IF I<50 THEN SEND 128 1180 RETURN |
↑SENDコマンドで送る数値はビットオーダーを変えてある。 例えば1020行の SEND 110は、表示したいパターンは01110110(76h)なので、01110110b→01101110b→6Eh→110を送る。
scriptでLSBから1bitづつ送るようにすれば、いちいち変えなくてよいのだがどちらも面倒。
↓動いているところ。
←ダウンロード BP-HELLO.mp4 (1110.6K)
↑途中でメッセージが移動する方向が変わる。
待てよ、AUXではなくCSを使えばいいじゃないかと気が付いた。
###
この記事に書いた制限(BUG?)は↓のFirmware固有のものかもしれない。
HiZ>iBus Pirate v3b Firmware v5.10 (r559) Bootloader v4.4 DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8) http://dangerousprototypes.com CFG1:0xF9DF CFG2:0x3F7F |
最新のFirmwareにアップデートしてみるか
- Bus pirate <先割れスプーン的だが便利だ> (2018/09/03)
- Bus pirate(2) <SDカードを読んでみる> (2018/09/11)
- Bus pirate(3) <SDカードをパスワード・ロックしてみる> (2018/09/17)
- IchigoJam(11) (2018/04/15)
« 深く考える力 <「賢明なもう一人の自分」は暗黙知のことか?> | トップページ | 奇跡のレッスン <日本の教育への強烈な批判かも> »
「CPUボード」カテゴリの記事
- 久々の物欲(2022.05.21)
- stcgal <質問に答える>(2021.02.21)
- micro:bitで跳び上がると表示する名札 <ウケ狙い>(2020.11.18)
- micro:bit <BLEが乗った低価格マイコンボード>(2020.09.15)
- Google日本語モールス入力(2020.05.01)
「プログラミング」カテゴリの記事
- GMC-4で動く3連ナイトライダー(2022.12.30)
- プログラミング言語ランキング(2022.11.19)
- AWSでサービス構築(2022.05.29)
- Excelの配列式(2022.01.06)
- ローコード・プログラミング(2021.11.07)
« 深く考える力 <「賢明なもう一人の自分」は暗黙知のことか?> | トップページ | 奇跡のレッスン <日本の教育への強烈な批判かも> »
コメント