Arduino環境でPico-RGB-LED(WS2812)を使う 

コンピュータ、組み込み

Raspberry Pi Picoと合体して使用するWS2812マトリクスボードを使ってみます。
Raspberry Pi Pico のピン配置で合体できるように設計されていますが、単体でも使用できます。

今回紹介するもの

Pico-RGB-LED(WS2812)

特徴

Raspberry Pi Picoと合体して使用するピン配置。
単体で信号を入力して使用することもできる。

電源5V
LED数160個(横16, 縦10)
色諧調R, G, B 各8bit(0 ~ 255諧調)

メーカー情報サイト : Waveshare WIKI Pico RGB LED

外観

前面

背面


Raspberry Pi Picoと合体させました。
配線不要ですっきりと使用することができますが、通常のピンヘッダの場合画像のように他に使用できるピンがなくなります。


Pico-RGB-LEDは背面には電源と信号の入出力のピンが出ています。
こちらを使用することでRaspberry Pi Picoとの合体以外に他のマイコンからも使用したり、WS2812を連結させたりできます。

使用感

GPIOが使用できなくなってしまうので、用途は限定的になってしまいますが、Raspberry Pi Picoと合体させることで簡単に使用することができます。
Raspberry Pi Picoとピン互換のある基板であれば使用することができますが、基板のサイズやピン数が同じでも電源やGNDピンの違う基板を使用するとトラブルの原因になるのでピンの種類を確認してから自己責任で使用してください。

背面のピンを使用することでRaspberry Pi Pico以外のマイコンからも使用することができるので、WS2812ディスプレイとしての用途が広がります。

WS2812は1ドットでも高輝度ですが、160個すべてを最大にするとかなり眩惑されるほど発光するので直視するのは避けてください。
またかなり発熱するので高輝度で使用する場合ファンは必須です。

個人的な感触としては10%の輝度でも十分明るくて使用できると思います。

準備

モジュールライブラリ

WS2812を制御するためのライブラリにはAdafruit NeoPixelライブラリを使用します。

検索neopixel
ライブラリ名Adafruit NeoPixel by Adafruit(x.x.x)※
※x.x.x Jul/2023 使用したバージョンは1.10.6

使い方

Raspberry Pi Picoと合体

説明

1ドットを玉に見立てて、WS2812内を移動します。
壁に当たるたびに速度と色を変えて反射します。

スケッチはRaspberry Pi Picoで動作するスケッチですが、ピン互換のあるボードであればPico-RGB-LEDと合体して使用することができます。
DINのピン番号の定義を変更して使用します。

注意

基板サイズやピン数が同じでも電源やGNDのピンが違うものを使用するとトラブルの原因になるのでピン種類をよく確認して自己責任で行ってください。

配線

ワイヤー配線はありません。
Raspberry Pi Picoのピンにズレなく合わせて合体させます。

スケッチ

/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【スケッチの説明】
動作確認は Raspberry Pi Pico で行っていますが、CPUは不問です。

1ドットを玉に見立てて、WS2812内を移動します。
壁に当たるたびに速度と色を変えて反射します。


【ライブラリ】
Adafruit NeoPixel by Adafruit 1.10.6

【準備】
Raspberry Pi Pico <-> W2182 Matrix 8x8
Vcc(5V)   <-> 5V
GND       <-> GND
GP6       <-> DIN

【バージョン情報】
2023/7/21 : 新規
**********************************************************************/

#include <Adafruit_NeoPixel.h>

//BPI Banana Pi PicoW(ESP32S3) : 12
//Waveshare ESP32-S3-Pico : 17
//Waveshare ESP32-S3-Pico : 14

#define DIN_PIN 6             // NeoPixel の出力ピン番号はGP23
#define LED_COUNT 160         // LEDの連結数
#define WAIT_MS 10            // 次の点灯までのウエイト
#define BRIGHTNESS 16         // 輝度
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);

#define SCREEN_WIDTH  (16)  //WS2812 横方向のドット数
#define SCREEN_HEIGHT (10)  //WS2182 縦方向のドット数

#define PALETTE_MAX (8)       //パレットは8パターン (0~7まで)
#define WAIT_MAX 3            //移動ウエイトの最大

uint32_t Palette[PALETTE_MAX];

long Pos_X = 0;               //現在座標
long Pos_Y = 0;
long ADD_X = 1;               //ドットの加算数
long ADD_Y = 1;
long PaletteIndex = 1;        //現在色のインデックス

long WAIT_X = 1;
long WAIT_Y = 1;
long COUNT_X = 0;             //ウエイトカウンタ
long COUNT_Y = 0;

void setup()
{
  //8色分のパレットを作成
  Palette[0] = pixels.Color(0, 0, 0);                               //黒(無発色)
  Palette[1] = pixels.Color(BRIGHTNESS, 0, 0);                      //赤
  Palette[2] = pixels.Color(0, BRIGHTNESS, 0);                      //緑
  Palette[3] = pixels.Color(BRIGHTNESS, BRIGHTNESS, 0);             //黄
  Palette[4] = pixels.Color(0, 0, BRIGHTNESS);                      //青
  Palette[5] = pixels.Color(BRIGHTNESS, 0, BRIGHTNESS);             //紫
  Palette[6] = pixels.Color(0, BRIGHTNESS, BRIGHTNESS);             //水
  Palette[7] = pixels.Color(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);    //白

  pixels.begin();             //NeoPixel制御開始
}

void loop()
{

//  long PaletteIndex = random((PALETTE_MAX - 1)) + 1;                //黒は使用しないので、7パターンの0~6の乱数を生成後 1を足して1~7の乱数にする

  //移動ウエイトの処理。 0 になるとその軸のドットを移動させる
  COUNT_X--;
  COUNT_Y--;
  
  //ウエイトの判定 水平方向
  if(COUNT_X <= 0)
  {
    Pos_X += ADD_X;                   //移動
    COUNT_X = WAIT_X;
  }

  //ウエイトの判定 垂直方向
  if(COUNT_Y <= 0)
  {
    Pos_Y += ADD_Y;                   //移動
    COUNT_Y = WAIT_Y;
  }

  //画面の淵到達判定 右向きの判定
  if((ADD_X > 0) && ((SCREEN_WIDTH - 1) <= Pos_X))
  {
      ADD_X *= -1;                                                  //符号反転
      PaletteIndex = random((PALETTE_MAX - 1)) + 1;                 //黒は使用しないので、7パターンの0~6の乱数を生成後 1を足して1~7の乱数にする
      WAIT_X = random(WAIT_MAX);       //次のウエイト設定 
      COUNT_X = WAIT_X;
  }

  //画面の淵到達判定 左向きの判定
  if((ADD_X < 0) && (Pos_X <= 0))
  {
      ADD_X *= -1;                                                  //符号反転
      PaletteIndex = random((PALETTE_MAX - 1)) + 1;                 //黒は使用しないので、7パターンの0~6の乱数を生成後 1を足して1~7の乱数にする
      WAIT_X = random(WAIT_MAX);       //次のウエイト設定 
      COUNT_X = WAIT_X;
  }

  //画面の淵到達判定 下向きの判定
  if((ADD_Y > 0) && ((SCREEN_HEIGHT - 1) <= Pos_Y))
  {
      ADD_Y *= -1;                                                  //符号反転
      PaletteIndex = random((PALETTE_MAX - 1)) + 1;                 //黒は使用しないので、7パターンの0~6の乱数を生成後 1を足して1~7の乱数にする
      WAIT_Y = random(WAIT_MAX);       //次のウエイト設定 
      COUNT_Y = WAIT_Y;
  }

  //画面の淵到達判定 上向きの判定
  if((ADD_Y < 0) && (Pos_Y <= 0))
  {
      ADD_Y *= -1;                                                  //符号反転
      PaletteIndex = random((PALETTE_MAX - 1)) + 1;                 //黒は使用しないので、7パターンの0~6の乱数を生成後 1を足して1~7の乱数にする
      WAIT_Y = random(WAIT_MAX);       //次のウエイト設定 
      COUNT_Y = WAIT_Y;
  }

  //ここからWS2812の表示を行う処理
  long WS2812Index = (Pos_Y * SCREEN_WIDTH) + Pos_X;                 //X,Y座標からWS2812のドット番号を求める

  pixels.clear();
  pixels.setPixelColor(WS2812Index, Palette[PaletteIndex]);
  pixels.show();
  delay(WAIT_MS);

}

結果

WS2812Matrix内容ドットが反射し続けました。

スケッチのDINピン定義の番号を変更し、BananaPi PicoWで使ってみました。
遜色なく動作します。

今回のスケッチは、以前に紹介したWS2812マトリクスで使用することもできます。
縦と、横のLED数を変更することで使用できます。

ゲーム

色を使ったゲームを作ってみました。
同じ色のブロックが4個連結すると消える有名なゲームです。

ゲームに使用するコントローラは別のマイコンをI2Cスレーブにして専用でボタンの読み取り処理をさせています。

Raspberry Pi Pico関連リンク

コメント

タイトルとURLをコピーしました