【Raspberry Pi Pico W】ダイソーの¥550 フルカラーテープLED で工作

ダイソーの¥550 フルカラーテープLED と Raspberry Pi Pico WでPCのPythonから通信(UDP)で自由に色を変えられるようにしてみました‼
何かと同期して光らせられますね‼

ダイソー フルカラーテープLEDについて

ダイソーの¥550 フルカラーテープLEDはIRリモコンで色を変えられるようになっています。
IRリモコンも工作に使えそうですね!
これで¥550は破格です!

テープの端にコネクタが付いていて、コードを切断せずに工作ができます。
黒コードのコネクタが+なので注意です。

下図は黒に+5V、緑をGNDに接続したところです。

Raspberry Pi Pico Wとの接続

下写真のように接続しました。

左側のトランジスタは2SK2232というNチャンネルFETです。秋月で100円で販売しています。秋月で30円で販売している2SK4017でも良いと思います。
今回はPicoとFETを直結していますが、1KΩぐらいの抵抗を挟んだ方が良いです。

Raspberry Pi Pico Wのプログラム1

まずは動作の確認のために点滅するプログラムを作ってみます。
開発環境はArduino(EarlePhilhower版)を使用しています。


#define R_PIN 18
#define G_PIN 19
#define B_PIN 20

void setup() {
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT); // 内蔵LED (動作確認用)

  digitalWrite(R_PIN, LOW);  // 消灯
  digitalWrite(G_PIN, LOW);
  digitalWrite(B_PIN, LOW);
}

void loop() {
  digitalWrite(R_PIN, HIGH);
  digitalWrite(G_PIN, HIGH);
  digitalWrite(B_PIN, HIGH);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  
  digitalWrite(R_PIN, LOW);
  digitalWrite(G_PIN, LOW);
  digitalWrite(B_PIN, LOW);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}

Raspberry Pi Pico Wのプログラム2

次は明るさを滑らかに変化させてみます。


#define R_PIN 18
#define G_PIN 19
#define B_PIN 20

void setup() {
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT); // 内蔵LED (動作確認用)

  digitalWrite(R_PIN, LOW);  // 消灯
  digitalWrite(G_PIN, LOW);
  digitalWrite(B_PIN, LOW);
}

int v = 0;  // 明るさ
int d = 1;  // 1:明るくする -1:暗くする

void loop() {
  v += d;
  if (v >= 30 || v <= 0) { // 30以上は明るさは変わらないみたい
    d = -d; // 明るくする <-> 暗くする の切り替え
  }

  analogWrite(R_PIN, v);
  delay(20);
}

PCのPythonから色を制御

最後にPCのPythonプログラムから通信(UDP)で色を制御してみます。

■Raspberry Pi Pico W側


#include 
#include 

const char *SSID = "xxxxxxxx";    // 環境に合わせる
const char *SSID_PASS = "xxxxxx"; // 環境に合わせる

// IPを指定する場合 ※指定しない場合はWiFi.config()の行をコメントアウトする
const IPAddress LOCAL_IP(192, 168, 0, 2);   // 環境に合わせる
const IPAddress SUBNET(255, 255, 255, 0);   // 環境に合わせる
const IPAddress GATEWAY(192, 168, 0, 1);    // 不要な場合はLOCAL_IPと同じにする
const IPAddress DNS(192, 168, 0, 1);        // 不要な場合はLOCAL_IPと同じにする

const unsigned int LOCAL_PORT = 24790;     // 受信ポート

#define BUF_SIZE 1400   // 1400バイト以上は分割して送信すること

WiFiUDP udp;

#define R_PIN 18
#define G_PIN 19
#define B_PIN 20

void setup() {
  Serial.begin(115200);

  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT); // 内蔵LED (動作確認用)

  digitalWrite(R_PIN, LOW);  // 消灯
  digitalWrite(G_PIN, LOW);
  digitalWrite(B_PIN, LOW);

  // IPを指定する (DHCPで割り当てられる場合は不要)
  WiFi.config(LOCAL_IP, DNS, GATEWAY, SUBNET);

  WiFi.begin(SSID, SSID_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.print("Connected! local IP: ");
  Serial.println(WiFi.localIP());

  udp.begin(LOCAL_PORT);
}

uint16_t count = 0;

void loop() {
  // UDP受信
  int packetSize = udp.parsePacket();
  if (packetSize > 0) {
    uint8_t recvBuffer[BUF_SIZE];
    int recvSize = udp.read(recvBuffer, BUF_SIZE);
    if (recvSize >= 3) {
      analogWrite(R_PIN, recvBuffer[0]);
      analogWrite(G_PIN, recvBuffer[1]);
      analogWrite(B_PIN, recvBuffer[2]);
    }
    count++;
  }

  digitalWrite(LED_BUILTIN, count % 2);
}

■PC側(Python)
今回はランダムに色をゆっくり変えるようにしてみました。
UDP送信用のクラス(UDPSend.py)と本体プログラム(daiso_led_tape_ctrl.py)を同じフォルダにおいてください。

〇UDP送信用のクラス UDPSend.py


import socket

# 送信用
class UDPSend:
    # dest_ip   : 送信先IP 
    # dest_port : 送信先PORT
    def __init__(self, dest_ip, dest_port):
        self.dest_ip = dest_ip
        self.dest_port = dest_port

        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # ar_data : bytearray型
    # 1400バイト以上になる場合は分割すること
    def send(self, ar_data):
        send_data = bytes(ar_data)
        #print(get_array_str(send_data))

        self.sock.sendto(send_data, (self.dest_ip, self.dest_port))

    def close(self):
        self.sock.close()

〇本体プログラム daiso_led_tape_ctrl.py


import UDPSend
import time
import random

IP = '192.168.0.2'
PORT = 24790

udp_send = UDPSend.UDPSend(IP, PORT)    # UDP送信

r = 0
g = 0
b = 0
N = 30  # 分割数
while True:
    next_r = random.randint(0, 30)
    next_g = random.randint(0, 30)
    next_b = random.randint(0, 30)

    d_r = float(next_r - r) / N
    d_g = float(next_g - g) / N
    d_b = float(next_b - b) / N

    for i in range(N):
        r += d_r
        g += d_g
        b += d_b

        send_data = bytearray([int(r), int(g), int(b)])
        udp_send.send(send_data)
        time.sleep(0.02)

    r = next_r
    g = next_g
    b = next_b

動かすと▼のようにランダムに光ります。

本体プログラムを変更すれば何かに同期して光らせることも可能ですね!
たとえば、音楽に合わせて光らせる、タイマーで光らせる、PC起動時に光らせる、など。

今回使用したダイソーのフルカラーテープLEDはIRリモコンもついていて破格ですが、Picoなどマイコンで制御する場合はFETが必要なので少し面倒ですね。
マイコンでフルカラーテープLEDを制御するだけなら、Amazonで1000円/mぐらいで販売しているWS2812が載ってるテープLEDの方が簡単かもしれません。

■Raspberry Pi Picoの関連記事
【Raspberry Pi Pico W】ダイソーの¥550 フルカラーテープLED で工作
【Raspberry Pi Pico W】WiFi UDP通信 サンプルプログラム
Raspberry Pi Pico+Arduinoでサーボをたくさん動かしたい
会話ができる「ぴよロボ」作りました! (Raspberry Pi + Pico + ChatGPT)
Raspberry Pi Pico W でPCとBluetooth(シリアル)接続する
Raspberry Pi Pico/Pico WをArduino開発環境で使うためのメモ
超音波距離センサー + Raspberry Pi Picoで潜水艦ソナー風
コップの水がこぼれない台 MPU6050 + Raspberry Pi Pico(Arduino)
MPU6050 + Raspberry Pi Pico(Arduino) -> PCで3Dのキューブを回転表示

本格派対局将棋 ぴよ将棋
本格派対局将棋アプリ ぴよ将棋
[Android] [iOS]

かわいい「ひよこ」と対局する将棋アプリ。かわいいけどAIは本格派!
対局後の検討機能や棋譜管理機能も充実!棋譜解析機能も搭載!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です