「32×8のフルカラーLEDマトリクスを4枚連結して32×32の表示器に(MicroPython)」の続編です。
ディスプレイをIKEAのフレームに納めました。光を和らげるためにダイソーのPPシート(乳白色、両面つや消し、0.75/390×550mm)をLEDパネルの前に置いています。
外部電源から給電しているときにUSBケーブルでPCと接続できるようにマイコンボードをラズパイPicoに変更しました。
外部電源のACアダプターは5V 4AのPSE認証付きのものを使っています。
配線
外部電源 5V — LEDパネル 5V, Pico VSYS
外部電源 GND — LEDパネル GND, Pico GND
Pico GP14(19pin) — LEDパネル DIN
ドット絵のデータを別ファイルで管理できるようにプログラムを変更しました。
メインプログラム
ファイル名でドット絵のデータを指定します。画像によってスクロール方向を変えるためにforループの昇順や降順(reversed())を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
from neopixel import Neopixel import utime from serial_pos import serial_pos from read_dot_file import read_data numpix = 1024 # 32*32 = 1024 din_pin = 14 strip = Neopixel(numpix, 0, din_pin, "GRB") strip.brightness(2) def image_window(start_x): for y in range(32): for x in range(32): px_pos = serial_pos(x,y) img_pos = y * 96 + x + start_x pal=image[img_pos] strip.set_pixel(px_pos,(palette[pal][0], palette[pal][1], palette[pal][2])) strip.show() while True: (palette,image) = read_data('fab.py') for start_x in range (64): image_window(start_x) utime.sleep(2) (palette,image) = read_data('mario96a.py') for start_x in reversed(range (64)): image_window(start_x) utime.sleep(2) |
ピクセルの(x,Y)座標とシリアルLEDの番号を変換する関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# 横32ピクセル縦8ピクセルのシリアルフルカラーLEDマトリックスを # 上下方向にに4枚連結した32X32LEDマトリックスで # 座標(x,y)に対応するシリアルフルカラーLEDの番号を返す def serial_pos(x,y): if x < 0 or x >= 32: x = 0 if y < 0 or y >= 32: y = 0 if y < 8: if x % 2 ==0: pos = 8 * x + y else: pos = 8 * x +7 - y pos = pos + 768 elif y < 16: y = y - 8 x = 31 - x y = 7 - y if x % 2 ==0: pos = 8 * x + y else: pos = 8 * x +7 - y pos = pos + 512 elif y < 24: y = y - 16 if x % 2 ==0: pos = 8 * x + y else: pos = 8 * x +7 - y pos = pos + 256 elif y < 32: y = y - 24 x = 31 - x y = 7 - y if x % 2 ==0: pos = 8 * x + y else: pos = 8 * x +7 - y pos = pos + 0 else: pos = 1023 return(pos) |
ドット絵のファイルを読み込む関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# ドット絵ファイルからpaletteとimageを取り出す def read_data(name:str): file_name = f'/{name}' f = open(file_name, 'r') # PicoW内に保存されたHTMLファイルを開く text = f.read() # コンテンツを読み込む f.close() # ファイルを閉じる text=text.replace('\r\n', '\n') pos = text.find('palette') # textをイメージ部分とパレット部分に分割する img_text = text[0:pos] pal_text = text[pos:] text='' # textは不要なので空にする img_text=img_text.replace('\n',',') length=len(img_text) if img_text[length-1] == ',': img_text=img_text[0:length-1] # 文字列の最後にコンマがあれば削除する image = [int(i) for i in img_text.split(',')] # コンマを区切りnにしてリストにする pal_text = pal_text[pal_text.find('\n')+1:] # 1行目を削除 while ',,' in pal_text: pal_text = pal_text.replace(',,', ',') # 重複するコンマを1個にまとめる pal_text = pal_text.replace(',\n', '\n') palette = [] while '\n' in pal_text: line=pal_text[0:pal_text.find('\n')+1] # 1行取り出す line=line[line.find(',')+1:line.find('\n')] rgb_list = [int(i) for i in line.split(',')] palette.append(rgb_list) pal_text = pal_text[pal_text.find('\n')+1:] return(palette,image) |
ドット絵ファイルは表計算ソフトでCSV形式で保存して、拡張子を.pyに変更しました。こうすることでThonnyでファイルを開いてPicoに保存することができます。ドット絵は96×32でパレット番号を記入します。’palette’と書かれた1行後からパレットのデータをパレット番号、R値、G値、B値で指定します。
ラズパイpico内部に保存されたファイル(左下の枠内)