北東北 LabVIEWユーザー会

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

8x8シリアルフルカラーLEDのREPL用関数とLabVIEWプログラム(高速化)

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") # 数値ではない

 

流れるメッセージのプログラムが速くなりました。

FP.png

 

BD.png

 

このプログラムを”第61回岩手県発明くふう展”(2025/10/4@岩手県工業技術センター)でデモする予定です。Windows7時代のノートPCをLInux MintにしてLabVIEW Communityをインストールしました。快適ですよ。

 

ダウンロードして動かないようであればお知らせください。

メッセージ1/1
119件の閲覧回数