【Raspberry Pi Pico入門 – 9】NeoPixelを制御してみる

2023年9月4日Raspberry Pi Pico入門,基本編Arduino,NeoPixcel,Raspberry Pi Pico

概要

今回はNeoPixelとよばれているRGB LEDを制御してみます。
NeoPixelにはマイコンが内蔵されており、GPIOを1ピンだけ使った通信で信号を送り、RGB LEDの明るさや色を調整することが出来ます。また通信線を デイジーチェーン で複数のNeoPixcelに接続し、同じくGPIOの1ピンだけですべてを制御することも出来ます。

実行環境

IDE:Arduino IDE 2.1.1
MCU:Raspberry Pi Pico

NeoPixel:Freenove 8 RGB LED Module

スターターキットに付属しているものを使用します。おそらく以下リンク先のものと同等品が8個並んでいるモジュールと思われます。

今回のテーマ

  • Arduino IDEでライブラリを導入して使ってみる

回路

以下のように配線します。今回からは回路図を用いて解説していきます。これまでのLEDやスイッチの回路を参考に配線してみてください。

ライブラリのインストール

回路図のSIGNALを単純なON/OFFで制御するのはかなり難しいコーディングが必要となります。そのような時に便利なものが ライブラリ です。Arduino IDEでは簡単な操作でライブラリをインストールすることができます。(これがArduino IDEの強みです)
今回はAdafruit社(色々なモジュールを作っているメーカー)が無料で公開しているNeoPixel用のライブラリをインストールします。

Arduino IDEを起動して①ライブラリマネージャーをクリックし、②検索画面に「Adafruit NeoPixel」と入力します。
いくつか候補が出てくるので、「Adafruit NeoPixel by Adafruit」と書かれているものを探し、④インストールをクリックします。
※byの後が作者の名前です。似たようなライブラリが多いので、必ずライブラリ名と作者が一致しているか確認してください。

ライブラリ~~のインストールに成功しました。」とメッセージが出ればインストール成功です。

コーディング

新しくスケッチを作成し、以下の内容をコピペしてください。

#include <Adafruit_NeoPixel.h>

const int PIN_SIG = 16;
const int NUM_PIXELS = 8;

Adafruit_NeoPixel pixels(NUM_PIXELS, PIN_SIG, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
  pixels.setBrightness(20);
}

void loop() {
  pixels.clear();
  for (int i = 0; i < NUM_PIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(255, 0, 0));
    pixels.show();
    delay(500);
  }

  pixels.clear();
  for (int i = 0; i < NUM_PIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(0, 255, 0));
    pixels.show();
    delay(500);
  }

  pixels.clear();
  for (int i = 0; i < NUM_PIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(0, 0, 255));
    pixels.show();
    delay(500);
  }
}

動作確認

NeoPixelが一つずつ点灯し、色が「赤 → 緑 → 青」の順に変われば成功です。

解説

C言語にはない構文

今回から以下のようなC言語では使われない構文が使われています。

Adafruit_NeoPixel pixels(NUM_PIXELS, PIN_SIG, NEO_GRB + NEO_KHZ800);
pixels.begin();

これはC言語ではなく、C++の構文です。実はArduinoの言語はC++をベースにしています。ただ、初心者の範囲ではC++の構文は上記のような形以外はほとんど使用せず、C++はC言語も動かすことが出来るため、基本的にはC言語の知識で大丈夫です。

まず6行目のコードの意味ですが、これは「pixelsという名前でパラメータを設定している」というイメージでOKです。
初期設定のパラメータはカッコの中で設定します。

pixelsという名前に含まれるものは変数だけでなく、ライブラリで定義した関数も含まれています。9行目のコードは「pixelsという名前で初期設定したものを使ってbegin()という関数を実行」というイメージです。
※イメージを伝えるための説明なので厳密にはちょっと違います。この辺りの概念について詳しく知りたい方は「オブジェクト指向プログラミング」とググってみてください。Adafruit_NeoPixelがクラス、pixelsがインスタンス、begin()がメソッドです。

コードの解説

今回使った関数の一覧です。

  • begin()
    NeoPixelの初期設定をします。Adafruit_NeoPixel pixels(NUM_PIXELS, PIN_SIG, NEO_GRB + NEO_KHZ800)はbegin()で使うパラメータを設定しているだけなので、実際の初期設定はbegin()で実行します。
  • setBrightness(20);
    0~255の範囲で明るさを設定します。
  • clear()
    全てのNeoPixelを消灯に設定します。
  • pixels.setPixelColor(i, pixels.Color(R, G, B))
    R、G、Bで指定した色をi番目のNeoPixelに設定します。
  • show()
    設定した内容を通信でNeoPixelに送ります。
    ここで初めて通信するので、この関数が実行されない限りNeoPixelの光りかたは変わりません。なので設定を変更する度にshow()を実行してください。