はじめに
手元にある秋月電子通商の購入した赤色ドットマトリクスLED 8x8ドット OSL641501-ARAをMachiKania type Pで動かしてみました。
検証環境
以下の環境でプログラムの作成と検証を行ないました。
- macOS : Tahoe 26.0.1
- MachiKania type P: Phyllosoma 1.6.0
- 赤色ドットマトリクスLED 8x8ドットSL641501-ARA
接続
Raspberry Pi Picoと赤色ドットマトリクスLED 8x8ドットの接続は入門MachiKaniaの43ページを参考にMachiKaniaのOUT8L、OUT8H命令を使用しやすいように次のように接続しました。
列方向のピンは左端をbit7〜0のMSBに、右端をLSBとなるよう接続し、行方向のピンは一番上をbit8〜15のLSBに、一番下をMSBとなるように接続しました。この接続でMachiKaniaのOUT8L命令で点灯するLEDの列の位置を、OUT8H命令で点灯するLEDの行の位置を指定できるようになります。
実際の配線は次のように接続しました。
| 8x8LEDピン | Pico | MachiKaniaのI/Oビット |
|---|---|---|
| 5 | GP28 | bit15 |
| 2 | GP27 | bit14 |
| 7 | GP26 | bit13 |
| 1 | GP22 | bit12 |
| 12 | GP21 | bit11 |
| 8 | GP20 | bit10 |
| 14 | GP9 | bit9 |
| 9 | GP8 | bit8 |
| 13 | GP7 | bit7 |
| 3 | GP6 | bit6 |
| 4 | GP5 | bit5 |
| 10 | GP4 | bit4 |
| 6 | GP3 | bit3 |
| 11 | GP2 | bit2 |
| 15 | GP1 | bit1 |
| 16 | GP0 | bit0 |
8x8 LEDのピンは位置は秋月電子通商の赤色ドットマトリクスLED 8×8ドット OSL641501-ARAに掲載されているデータシートに記載されていものを元にしています。
電流制限抵抗に150Ωの抵抗器を行側(カソード側)のピン(1、2、5、7、8、9、12、14)に接続しています。
LEDとピン、MachiKaniaのI/O bitとの対応を図に示します。
LEDの点灯
LEDを点灯させるには点灯したいLEDが接続されている行をロー(0)に、列をハイ(1)にします。たとえば、左上のLEDを点灯する場合は列方向ではbit7をハイ(1)、bit6〜0をロー(0)にします。また、行方向ではbit8をロー(0)、bit9〜15をハイ(1)にします。
出力するデータは次の値になります。
- bit 7〜0 = 1000 0000 = $80
- bit 15〜8 = 1111 1110 = $FE
bit15〜8の値を得るために点灯する行番号と$FFとの排他的論理和でも得られます。
OUT8L $80
OUT8H $01 XOR $FF
LEDを左から右、右から左へ点灯する
5行目のLEDの点灯を左から右へ、右から左へ移動するプログラムを示します。
LEDの点灯を左から右へ移動するには左端を点灯するデータ$80を1ビットずつ右へシフトしながら出力します。
逆方向は右端を点灯するデータ$01を1ビットずつ左へシフトして出力します。
LEDを点灯する行は5ビット目をローにした値は、1110 1111=EFをbit8〜15に出力します。
REM 左端を点灯するデータ
D=$80
REM 上から5行目だけを点灯する
OUT8H $10 XOR $FF
FOR I=1 TO 8
OUT8L D
D=D>>1
DELAYMS 200
NEXT
REM 右端を点灯するデータ
D=$01
FOR I=1 TO 8
OUT8L D
D=D<<1
DELAYMS 200
NEXT
ASCIIテーブルの文字を表示する
入門MachiKaniaの43ページのタイマ割り込みを利用したコードを利用して8x8 LEDにASCII文字を順に表示するコードは次のとおりです。
ASCIIコードからシステムフォントのデータをタイマ割り込みルーチンで順に取り出してLEDへ出力しています。タイマ割り込みルーチンは1ミリ秒ごとに実行されるので繰り返しLEDに文字のデータを出力し続けることでLEDに文字が表示され続けることになります。
SETIMER 1000
INTERRUPT TIMER,ISRTMR
B=0
REM ASCII文字を順に取得
FOR I=$21 TO $7E
A=SYSTEM(103)+I*8
DELAYMS 500
NEXT
DO:IDLE:LOOP
END
REM タイマ割り込みルーチン:文字データを取得し、LEDへ出力
LABEL ISRTMR
OUT8L 0
OUT8H (1<<B) XOR $FF
OUT8L PEEK(A+B)
B=(B+1) AND 7
RETURN
さいごに
赤色ドットマトリクスLED 8x8ドットとRaspberry Pi Picoの接続と転送するデータとの関係がうまく整理できず、なかなか正しい表示ができなかったが何とか整理できて正しく表示できるようになりました。
文字をスクロールして表示する方法を考えたいと思います。

