09-25-2025 01:56 AM
MicroPythonとLabVIEWで高速プロトタイピングで紹介した8x8LEDのREPL用関数は、手軽だよ!ということを示したくて簡単な関数にしたのですが、64個のLEDを1個ずつコマンドを送っているとさすがに時間がかかります。
import machine
import neopixel
import time
NEOPIXEL_PIN = 14
NUM_PIXELS = 64
np = neopixel.NeoPixel(machine.Pin(NEOPIXEL_PIN), NUM_PIXELS)
def setNRGB(n, r, g, b):
if 0 <= n < NUM_PIXELS:
np[n] = (r, g, b)
np.write()
def clear():
np.fill((0, 0, 0))
np.write()
setNRGB(0, 128, 0, 0) # 明るさを少し抑えています
time.sleep(1)
setNRGB(0, 0, 128, 0)
time.sleep(1)
setNRGB(0, 0, 0, 128)
time.sleep(1)
clear()
N氏作成の任意のLEDを一括で点灯する関数をベースに少し変更した関数を紹介します。
Google AI Studioで作成してもらいました。
「REPLで応答できるようにmicropythonの関数を作っています。waveshare rp2040Zeroの14ピンに64個のネオピクセルを接続しています。64個以下の複数のLEDを点灯する関数を作ってください。led番号とRGB値をカンマ区切りで指定したいです。」
N氏のプログラムはスペース区切りだったので私好みのカンマ区切りにしましたが、基本的に同じだと思います。関数の引数に文字列を使っているのがポイントです。MicroPythonのプログラムは複雑になりますが、そこはAI、サラッと書いてくれます。
import machine
import neopixel
import time
# --- 設定 ---
PIN_NUM = 14 # Neopixelを接続しているGPIOピン番号
NUM_LEDS = 64 # 接続されているLEDの総数
# --- グローバル変数 ---
# Neopixelオブジェクトを初期化します
try:
pixels = neopixel.NeoPixel(machine.Pin(PIN_NUM), NUM_LEDS)
except Exception as e:
print(f"Neopixelの初期化中にエラーが発生しました: {e}")
# オブジェクトが作成できない場合、以降の関数がエラーにならないようにNoneを代入
pixels = None
def clear_leds():
"""
すべてのLEDを消灯します。
"""
if pixels is None:
print("エラー: Neopixelが初期化されていません。")
return
pixels.fill((0, 0, 0))
pixels.write()
print("すべてのLEDを消灯しました。")
def set_leds(led_data_str):
"""
カンマ区切りの文字列で指定されたLEDを点灯させます。
この関数を呼び出すと、以前の点灯状態はクリアされます。
引数:
led_data_str (str): "LED番号,R,G,B, LED番号,R,G,B, ..." の形式の文字列。
例: "0,255,0,0, 10,0,0,255"
-> LED 0を赤に、LED 10を青に点灯します。
"""
if pixels is None:
print("エラー: Neopixelが初期化されていません。")
return
try:
# 入力文字列から空白を削除し、カンマで分割してリストを生成します
parts = [p.strip() for p in led_data_str.split(',')]
# リストが空の場合は何もしません
if not any(parts):
print("入力が空です。")
return
# 各要素を整数に変換します
values = [int(p) for p in parts]
# 入力された数値の数が4の倍数でなければエラーとします
if len(values) % 4 != 0:
print("エラー: データは「LED番号, R, G, B」の4つの数値セットでなければなりません。")
return
# 新しい設定を適用する前に、一度すべてのLEDを消灯します
pixels.fill((0, 0, 0))
# 4つの数値セットごとに処理を繰り返します
for i in range(0, len(values), 4):
led_index = values[i]
r = values[i+1]
g = values[i+2]
b = values[i+3]
# LED番号とRGB値が有効な範囲にあるかチェックします
if not (0 <= led_index < NUM_LEDS):
print(f"警告: LED番号 {led_index} は 0 から {NUM_LEDS - 1} の範囲外です。この指定は無視されます。")
continue
if not (0 <= r <= 255 and 0 <= g <= 255 and 0 <= b <= 255):
print(f"警告: RGB値 ({r},{g},{b}) は 0 から 255 の範囲外です。この指定は無視されます。")
continue
# 指定されたLEDの色を設定します
pixels[led_index] = (r, g, b)
# 物理的なLEDにデータを送信して色を反映させます
pixels.write()
print("LEDを更新しました。")
except ValueError:
print("エラー: 数値に変換できないデータが含まれています。カンマ区切りの半角数値で入力してください。")
except Exception as e:
print(f"予期せぬエラーが発生しました: {e}")
# --- REPLでの使用例 ---
# 以下のサンプルコードを1行ずつREPLにコピー&ペーストして実行できます。
#
# # 起動確認メッセージ
# print("Neopixel制御関数が読み込まれました。'set_leds()' または 'clear_leds()' を使用できます。")
#
# # 例1: LED 0を赤、LED 7を緑、LED 63(最後)を青に点灯 (明るさ100)
# # set_leds("0,100,0,0, 7,0,100,0, 63,0,0,100")
#
# # time.sleep(3)
#
# # 例2: LED 1を白、LED 10を紫に点灯(前の設定はクリアされます)(明るさ50)
# # set_leds("1,50,50,50, 10,50,0,50")
#
# # time.sleep(3)
#
# # 例3: すべてのLEDを消灯
# # clear_leds()
#
# # 例4: 不正なフォーマットの例
# # set_leds("5,255,0") # データが足りない
# # set_leds("abc,0,0,0") # 数値ではない
流れるメッセージのプログラムが速くなりました。
このプログラムを”第61回岩手県発明くふう展”(2025/10/4@岩手県工業技術センター)でデモする予定です。Windows7時代のノートPCをLInux MintにしてLabVIEW Communityをインストールしました。快適ですよ。
ダウンロードして動かないようであればお知らせください。