【Arduino】XIAO RA4M1を使う

it

Seeed StudioのXIAO RA4M1を使ってみた内容を記事にしました。
Arduino環境で同等性能機種XIAO SAMD21との比較をしながら使ってみます。

記事の概要

簡単なスペック説明や購入時の情報を記載しました。
先発のXIAO SAMD21と性能と使い勝手の比較を主に記事にしています。
環境作成から開発時のトラブルと対処法をまとめました。
実際に使用したサンプルスケッチと配線を掲載しています。

XIAO RA4M1

簡単紹介

◆パッケージ
SeeedStudioのパッケージで、本体に7ピンシングルピンヘッダが1セット付属します。

SeeedStudio 製品サイト:Getting Started with Seeed Studio XIAO RA4M1 | Seeed Studio Wiki

◆入手

国内電子部品販売店サイト、AliExpressで入手できます。
価格の目安は1,200~1,500円(送料込み)

◆XIAOシリーズの記事

XIAO SAMD21XIAO SAMD21を使った記事。
基本的なGPIOの操作とDAC出力、書き込み時のトラブルについてまとめた記事です。
XIAO RP2040XIAO RP2040を使った記事。
使っている時に発生したI2CのWireとWire1問題、WS2812の点灯などトラブルを中心に記載しました。
XIAO ESP32-C3XIAO ESP32-C3を使った記事。
GPIOを使った基本スケッチ、BLE UARTを使った内容を記事にしました。
XIAO ESP32-S3XIAO ESP32-S3/XIAO ESP32-S3 Sense を使った記事。
GPIOを使った基本スケッチの他静電容量タッチセンサ、カメラWebサーバーを使った内容を記事にしました。
XIAO nRF52840XIAO nRF52840/XIAO nRF52840 Senseを使った記事。
GPIOを使った基本スケッチ、BLE UART他、XIAO nRF52840 SenseのIMU 6軸センサ、PDM Microphoneを使った内容を記事にしました。
XIAO RA4M1XIAO RA4M1を使った記事。
基板特有のトラブルと基本的なGPIOの操作について記事にしました。
XIAO RP2350XIAO RP2350を使った記事。
XIAO RP2040との比較を中心に搭載機能を使った内容を記事しました。
XIAO ESP32C6XIAO ESP32C6を使った記事。
基本的なGPIOの使い方からWiFiServerにして読み取ったDA値を表示してみた内容を記事にしました。

ピン配置

外観

使ってみた

CPUクロックが同周波数帯のXIAO SAMD21との比較を中心に使ってみます。

◆スケッチの互換

ライブラリ不要で使用する基本的なスケッチで気になった関数をピックアップします。
(ライブラリの流用は後述します)

pinMode()
信号の方向を決定するパラメータにINPUT以外にINPUT_PULLDOWN, INPUT_PULLUPを使用できますが機能しません。
実回路でのプルアップ、プルダウン抵抗が必要です。(回路サンプル

printf()
オブジェクトのメンバにprintf()がありません。
AVR系と同じくprint()とprintln()関数の組み合わせで出力します。

◆ピン互換

Arduinoスケッチ上から通信ピンの任意選択はできません。
RP2040系の[object].setTX()や、ESP32系の[object].begin()などで、任意設定できるシリーズもありますが、XIAOはデフォルトピンで使用する方が作成した配線や基板に互換性が出るのでよさそうです。

SAMD21と比較するとPWMに設定できるピンが少ないです。

◆性能

プロセッサがCoretex-M4で48MHzで、同じSeeedStudioのXIAO SAMD21と同値の48MHz。
単純なGPIOのLow/HighとFPUの性能比較をしてみました。

Low/Highの繰り返しでは、RA4M1が1.83us(544kHz)、SAMD21が3.08us(323kHz)でした。
同じCPUクロックですが、約1.7倍ほど早いです。

FPUの性能を見るために立方体を回転させてみました。
動画の左がXIAO SAMD21, 右がXIAO RA4M1です。

演算に使用するパラメータは倍精度浮動小数点(double型)を使っています。
1フレーム表示するのに6回の割り算、10回のsin/cosの計算をしています。

更新速度では掲載した動画の通り、回転を繰り返し1回転するまでの時間は
XIAO RA4M1 : 10.162秒
XIAO SAMD21 : 17.485秒
XIAO RA4M1は約1.7倍速いです。

GPIOのLow/Highの速度とあまり変わらない速度差の結果から、FPUの差なのかわかりません。

◆モジュールライブラリ

当サイトで使用頻度の高いモジュールについて使用できるかを試してみました。
・OLEDモジュール(SSD1306)
・LCDモジュール(ST7735)
・LCDモジュール(ILI9341)

サンプルに使用したモジュールライブラリはAdafruit製です。
サンプルスケッチの流用元は当サイトで使用しているXIAO SAMD21です。
OLED(SSD1306)は修正の必要なくコンパイルと実行ができました。

LCDモジュール(ST7735)はライブラリの修正をすることでコンパイルと実行ができました。
修正方法についてはSPI(ST7735)で紹介します。

LCDモジュール(ILI9341)はライブラリの修正をすることでコンパイルと実行ができました。
修正方法についてはSPI(ILI9341)で紹介します。

準備

Arduino環境の作成

◆開発環境

開発環境はArduinoを使用します。
Arduino環境の作り方はこちらを参照します。

◆ボードライブラリ

Arduino IDEのボードマネージャからRP2040用のライブラリのインストールとボードの選択をします。
ボードライブラリには「Raspberry Pi Pico/RP2040 by Earle F. Philhower, III」を使用します。

ボードマネージャのURLhttps://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
検索ra4
ボードライブラリSeeed Renesass Board by Seeed Studio※
選択するボードSeeed Renesas Board > XIAO RA4M1
※動作確認はバージョン 1.2.0 です

◆モジュールライブラリ

I2CのサンプルではSSD1306 OLED、SPIのサンプルではILI9341を使用します。
サンプルを使用しない場合はインストール不要です。

SSD1306

OLED(SSD1306)を使用する場合にインストールします。

ライブラリ名検索確認時のバージョン
Adafruit SSD1306 by AdafruitSSD13062.5.11
Adafruit GFX Library by AdafruitGFX1.11.10

ST7735

LCD(ST7735)を使用する場合にインストールします。

ライブラリ名検索確認時のバージョン
Adafruit ST7735 and ST7789 Library by AdafruitST77351.10.4
Adafruit GFX Library by AdafruitGFX1.11.10

ILI9341

LCD(ILI9341)を使用する場合にインストールします。

ライブラリ名検索確認時のバージョン
Adafruit ILI9341 by AdafruitILI93411.6.1
Adafruit GFX Library by AdafruitGFX1.11.10

WS2812B

WS2812Bを使用する場合にインストールします。

ライブラリ名検索確認時のバージョン
Adafruit NeoPixel by Adafruitnexpixel1.12.3

コンパイルと書き込み

Arduino IDEの書き込みボタンから書き込みができます。

作業中書き込みができなくなるトラブルが何回かありました。
トラブル「書き込みができない」で紹介しています。

トラブル

書き込みができない

◆症状

ArduinoIDE上で書き込みを行うマイコンボードのシリアル(COM)を選択し書き込みを行います。
XIAO RA4M1で作業をしていると時々書き込みができなくなることがある。

◆対応

現象発生時にはXIAO RA4M1のResetボタンを素早く2回(1秒以内に2回程度)押します。
Arduino IDEのPortの dfu portsにXIAO RA4M1が追加かされるので、選択して書き込みボタンを押すことで書き込みができるようになります。

プルアップ/プルダウンできない

◆症状

XIAO RA4M1のpinMode()ではINPUT_PULLDOWN, INPUT_PULLUPを設定できるが機能しない。

◆対応

実回路でプルアップ、プルダウン抵抗を使う。
プルダウンのサンプルは「GPIOデジタル入出力」で紹介します。

ユーザーLEDの点灯

◆症状

スケッチを実行させるとユーザLEDが点灯状態になる。

◆対応

Setup()で出力をLowにする。
実害の程度によりますが、気になる場合は2行追記することで解消します。

pinMode(25, OUTPUT);
digitalWrite(25, LOW);

スケッチ

GPIOデジタル入出力

◆説明

GPIOのデジタル入出力をします。
ボタンを押している間LEDを点灯します。

ピンの入出力を設定するpinModeの設定ではINPUT_PULLUP, INPUT_PULLDOWNを使用できますが、信号はプルアップ、プルダウンしません。
プルアップ、プルダウンを回路で作ります。

このスケッチではINPUTを使用しますが、配線上はプルダウン抵抗によりボタンを離している間はLOW、ボタンを押している間はHIGHが入力されます。

◆配線

◆スケッチ

#define BUTTON_PIN    (0)
#define LED_PIN       (1)

void setup()
{
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLDOWN);
}

void loop()
{
  int iStat = digitalRead(BUTTON_PIN);
  digitalWrite(LED_PIN, iStat);
}

◆結果

アナログ入力/PWM出力

◆説明

アナログ入出力をします。
アナログ入力電圧に比例してLEDの明るさを調整します。

サンプルではアナログ入力にGPIO0、LEDのPWM出力にGPIO6を使用します。
XIAO RA4M1ではアナログに使用できるGPIOとPWMに使用できるGPIOに制限があるのでピン配置表を確認して使用するピンの選択と配線をします。

XIAO RA4M1のアナログ出力はPWM出力で3.3V 約500Hz、Dutyは256階調(8bit, 0~255)です。
アナログ入力は3.3Vで、1024階調(10bit, 0~1023)です。

読み取ったAD値(電圧)は10bit、出力するDA値は8bit なので、スケール変換するために読み取った値を1/4にしています。

◆配線

◆スケッチ

#define ANALOG_PIN    (0)
#define LED_PIN       (6)
//pwm 10, 9, 8, 7, 6, 5

void setup() 
{
  pinMode(ANALOG_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
}

void loop()
{
  int16_t AIN = analogRead(ANALOG_PIN);
  uint8_t AOUT = AIN / 4;
  analogWrite(LED_PIN, AOUT);
}

◆結果

スライダを移動させるとLEDの明るさが変化しました。

PWM信号をオシロスコープ(HDS272)でモニタしました。
Duty50%の時の波形です。
電圧は3V強、周期は490Hzでした。

アナログ出力(DAC)

◆説明

アナログ出力をします。
XIAO RA4M1にはDACが搭載されていて、0~3.3Vの信号を256階調(8bit, 0 ~ 255)の分解能で設定できます。

DACとPWMでのLED点灯具合を比べてみます。
DACとPWMの信号をオシロスコープでモニタします。

◆配線

◆スケッチ

#define DAC   (0)
#define PWM   (5)

//pwm 5, 6,7,8
void setup()
{

  pinMode(DAC, OUTPUT);
  pinMode(PWM, OUTPUT);
}

void loop()
{
  for(int i = 0; i < 256; i ++)
  {
    analogWrite(DAC, i);
    analogWrite(PWM, i);
    delay(2);
  }

  for(int i = 0; i < 256; i ++)
  {
    analogWrite(DAC, 255 - i);
    analogWrite(PWM, 255 - i);
    delay(2);
  }
}

◆結果

黄色のLEDがDAC、青色のLEDがPWMでの信号点滅です。
黄色の方が消灯時間が長く点灯時の輝度変化も急峻ですが、青色は緩やかな輝度変化を続けています。

信号をオシロスコープでモニタしました。
黄色がDACで青色がPWM信号です。

黄色は0~3.3Vに直線的な変化が見られ、青はLowとHigh時間の入れ替わりが確認できます。
分解能が粗いためわかりにくいですが、青プロットの中心は上部にラインがあり、下部にはラインがないことから電圧状態がHighなことがわかります。

UART

◆説明

UARTの対抗通信をします。
通信相手はXIAO SAMD21で同じスケッチを書き込みます。

XIAO RA4M1のTXの通信相手は、XIAO SAMD21 のRXです。
XIAO SAMD21のTXの通信相手は、XIAO RA4M1 のRXです。

それぞれ、パソコンとのCOM通信に使用するオブジェクトは[Serial]で、UART通信に使用するオブジェクトは[Serial1]です。

パソコンから読み取った電文はTXに出力し、RXから読み取った電文はUSB-COMに出力します。

◆配線

◆スケッチ

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

void loop()
{
  if(Serial.available() != 0)
  {
      Serial1.write(Serial.read());
  }

    if(Serial1.available() != 0)
  {
      Serial.write(Serial1.read());
  }

}

◆結果

結果はTeratermを2つ起動して確認します。
(ローカルエコーはON)
その時々によりCOM番号が変化するので都度確認します。
今回XIAO RA4M1はCOM7、XIAO SAMD21は COM15で認識されました。

XIAO RA4M1(COM7)側に”ra4m1 “と入力すると、XIAO SAMD21(COM15)側に同じ電文が表示されました。(黄のライン)
XIAO SAMD21(COM15)側のに”samd21″と入力すると、XIAO RA4M1(COM7)側に同じ電文が表示されました。(青のライン)

I2C(SSD1306)

◆説明

XIAO RA4M1のI2CからSSD1306を表示制御します。

使用するモジュールライブラリはAdafruitです。
SSD1306のI2Cアドレスは3c(h)です。

画面には
“SSD1306_WHITE”
“TAMANEGI”
“OLED 0.96”
と表示します。

◆配線

◆スケッチ

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH    (128)
#define SCREEN_HEIGHT   (64)

#define OLED_RESET      (-1)
#define SCREEN_ADDRESS  (0x3C)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
                                        
void setup()
{  

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

  display.clearDisplay();
  
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(20, 0);
  display.print(F("TAMANEGI"));
  display.setCursor(15, 25);
  display.print(F("OLED 0.96"));
  display.setCursor(25, 45);
  display.print(F("SSD1306"));
  
  display.display();
}

void loop()
{
}

◆結果

XIAO RA4M1でAdafruitのSSD1306ライブラリを使った表示ができました。
ライブラリやXIAO SAMD21のスケッチを修正することなく使用できました。

SPI(ST7735)

◆説明

XIAO RA4M1のSPIからST7735を表示制御します。
使用するモジュールライブラリはAdafruitです。

画面には
“TAMANEGI”
“1.8inch LCD”
“Res=128 x 160”
“ST7735”
と表示します。

◆ライブラリの修正

XIAO RA4M1でAdafruitライブラリ[Adafruit ST7735 and ST7789 Library by Adafruit]を使用できるように修正します。
Adafruitライブラリをインストール後、サンプルスケッチをコンパイルすると以下コンパイルエラーが発生します。

c:\Users\[xxxx]\Documents\Arduino\libraries\Adafruit_ST7735_and_ST7789_Library\Adafruit_ST77xx.cpp:30:10: fatal error: wiring_private.h: No such file or directory
 #include "wiring_private.h"
          ^~~~~~~~~~~~~~~~~~
compilation terminated.
exit status 1

Compilation error: exit status 1

※[xxxx]はアカウント名です。

以下パスのライブラリファイルを修正します。
※作業前に当該ファイルをバックアップすることをお勧めします。
C:\Users\[xxxx]\Documents\Arduino\libraries\Adafruit_ST7735_and_ST7789_Library
Adafruit_ST77xx.cpp をメモ帳などエディタで開きます。
図中赤□枠の “#include “wiring_private.h”行をコメントアウトして保存します。

※注意

ライブラリを更新すると編集したファイルは上書きされます。

◆配線

◆スケッチ

#include <Adafruit_GFX.h> 
#include <Adafruit_ST7735.h>
#include <SPI.h>

#define TFT_CS    0
#define TFT_RST   1
#define TFT_DC    2

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

void setup(void) 
{
  tft.initR(INITR_BLACKTAB);
  tft.fillScreen(ST77XX_BLACK);
  
  tft.setRotation(3);
  tft.setTextSize(3);
  
  tft.setCursor(0, 10);
  tft.setTextColor(ST77XX_GREEN);
  tft.println("TAMANEGI");

  tft.setCursor(0, 50);
  tft.setTextSize(2);
  tft.setTextColor(ST77XX_RED);
  tft.println("1.8inch LCD");
  tft.setTextColor(ST77XX_YELLOW);
  tft.println("Res=128 x 160");
  tft.setTextColor(ST77XX_BLUE);
  tft.println("ST7735");
}

void loop()
{
}

◆結果

AdafruitのST7735ライブラリを一部修正することで表示ができました。

SPI(ILI9341)

◆説明

XIAO RA4M1のSPIからILI9341を表示制御します。
使用するモジュールライブラリはAdafruitです。

ラインアートアニメーションを表示します。
2点がランダムに直線移動し間を線で結びます。
画面端で移動方向を反転し速度を変更します。
線はランダムで徐々に変化しながら複数の残影を残します。

◆ライブラリの修正

XIAO RA4M1でAdafruitライブラリ[Adafruit ILI9341 by Adafruit]を使用できるように修正します。
Adafruitライブラリをインストール後、サンプルスケッチをコンパイルすると以下コンパイルエラーが発生します。

c:\Users\[xxxx]\Documents\Arduino\libraries\Adafruit_ST7735_and_ST7789_Library\Adafruit_ST77xx.cpp:30:10: fatal error: wiring_private.h: No such file or directory
 #include "wiring_private.h"
          ^~~~~~~~~~~~~~~~~~
compilation terminated.
exit status 1

Compilation error: exit status 1

※[xxxx]はアカウント名です。

以下パスのライブラリファイルを修正します。
※作業前に当該ファイルをバックアップすることをお勧めします。
C:\Users\[xxxx]\Documents\Arduino\libraries\Adafruit_ILI9341
Adafruit_ILI9341.cpp をメモ帳などエディタで開きます。
“#include “wiring_private.h”行をコメントアウトして保存します。

#include "Adafruit_ILI9341.h"
#ifndef ARDUINO_STM32_FEATHER
#include "pins_arduino.h"
#ifndef RASPI
//#include "wiring_private.h"  <-コメント化
#endif
#endif
#include <limits.h>

※注意

ライブラリを更新すると編集したファイルは上書きされます。

◆配線

◆スケッチ

#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

#define Palette(r, g, b) ((r << 11) | (g << 6) | (b))
#define COLMAX (0x1f)
#define MOVE (8)

#define ILI9341_CS   (0)
#define ILI9341_RST  (1)
#define ILI9341_DC   (2)

Adafruit_ILI9341 tft = Adafruit_ILI9341(&SPI, ILI9341_DC, ILI9341_CS, ILI9341_RST);


void setup()
{
  tft.begin();
  tft.fillScreen(ILI9341_BLACK);
  randomSeed(100);

}

void loop() {

  int16_t index = 0;
  int16_t icount = 30;
  int16_t bufx1[icount];
  int16_t bufx2[icount];
  int16_t bufy1[icount];
  int16_t bufy2[icount];

  int16_t x1 = 0;
  int16_t y1 = 0;
  int16_t addx1 = 5;
  int16_t addy1 = 5;
  int16_t x2 = 0;
  int16_t y2 = 0;
  int16_t addx2 = 3;
  int16_t addy2 = 3;
  int16_t rnd = 0;

  int32_t col_r = 0x1f;
  int32_t col_g = 0x1f;
  int32_t col_b = 0x1f;
  int8_t cindex = 0;
  int32_t add_r = 1;
  int32_t add_g = 0;
  int32_t add_b = 0;

  while(1)
  {
    //消去用のラインとリングバッファの更新
    tft.drawLine(bufx1[index], bufy1[index], bufx2[index], bufy2[index], ILI9341_BLACK);
    bufx1[index] = x1;
    bufx2[index] = x2;
    bufy1[index] = y1;
    bufy2[index] = y2;
    index ++;
    if(index >= icount)index = 0;

    //表示ラインの更新
    x1 += addx1;
    y1 += addy1;
    x2 += addx2;
    y2 += addy2;

    //画面端まで移動したら反転動作+移動量の設定
    if(x1 < 0) addx1 = (random(MOVE) + 1);
    if(x1 > tft.width()) addx1 = -(random(MOVE) + 1);
    if(y1 < 0) addy1 = (random(MOVE) + 1);
    if(y1 > tft.height()) addy1 = -(random(MOVE) + 1);
    if(x2 < 0) addx2 = (random(MOVE) + 1);
    if(x2 > tft.width()) addx2 = -(random(MOVE) + 1);
    if(y2 < 0) addy2 = (random(MOVE) + 1);
    if(y2 > tft.height())addy2 = -(random(MOVE) + 1);
    
    tft.drawLine(x1, y1, x2, y2, Palette(col_r, col_g, col_b));

    //色情報の更新
    col_r += add_r;
    if(col_r < 0)col_r = 0;
    if(col_r > COLMAX)col_r = COLMAX;
    col_g += add_g;
    if(col_g < 0)col_g = 0;
    if(col_g > COLMAX)col_g = COLMAX;
    col_b += add_b;
    if(col_b < 0)col_b = 0;
    if(col_b > COLMAX)col_b = COLMAX;
  
    cindex ++;
    if(cindex >= COLMAX)
    {
      cindex = 0;
      add_r = (random(3) - 1);
      add_g = (random(3) - 1);
      add_b = (random(3) - 1);
    }
    delay(10);
  }  
}

◆結果

WS2812

◆説明

WS2812をグラデーションでレインボー変化させます。

XIAO RA4M1のWS2812は電源をONしてから制御を開始する必要があります。
電源IOは21をHIGHにします。

LEDの発光は各色(青, 赤, 緑)最大256階調(8bit)で255まで設定できますが、輝度が高いため各色の設定値を16までに抑えています。

現在発行中のパレット情報から次に変化する色にパレットを変化させながら発光させます。

◆配線

不要

◆スケッチ

#include <Adafruit_NeoPixel.h>

#define DIN_PIN     (20)
#define LED_COUNT   (1)
#define WAIT_MS     (30)
#define BRIGHT_MAX  (16)        //最大輝度   (最大  255まで)
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);

//パレット 0 to 255 の 256諧調
long PaletteR = 0;
long PaletteB = 0;
long PaletteG = 0;


void setup()
{
  pinMode(PIN_RGB_EN, OUTPUT);          //WS2812の電源ON
  digitalWrite(PIN_RGB_EN, HIGH);

  pixels.begin();
}

void loop()
{

  for(int i = 0; i < 8; i ++)
  {
    for (long Count = 0; Count < BRIGHT_MAX + 1; Count ++)
    {
      switch(i)
      {
        case 0:       //黒(無発光)
          //全色減衰
          PaletteR = (PaletteR > 0) ? PaletteR - 1 : 0;
          PaletteG = (PaletteG > 0) ? PaletteG - 1 : 0;
          PaletteB = (PaletteB > 0) ? PaletteB - 1 : 0;
          break;

        case 1:       //赤
          //赤増幅
          PaletteR = (PaletteR < BRIGHT_MAX) ? PaletteR + 1 : BRIGHT_MAX;
          PaletteG = (PaletteG > 0) ? PaletteG - 1 : 0;
          PaletteB = (PaletteB > 0) ? PaletteB - 1 : 0;
          break;
        
        case 2:       //緑
          //緑増幅
          PaletteR = (PaletteR > 0) ? PaletteR - 1 : 0;
          PaletteG = (PaletteG < BRIGHT_MAX) ? PaletteG + 1 : BRIGHT_MAX;
          PaletteB = (PaletteB > 0) ? PaletteB - 1 : 0;
          break;

        case 3:       //黄
          //赤と緑増幅
          PaletteR = (PaletteR < BRIGHT_MAX) ? PaletteR + 1 : BRIGHT_MAX;
          PaletteG = (PaletteG < BRIGHT_MAX) ? PaletteG + 1 : BRIGHT_MAX;
          PaletteB = (PaletteB > 0) ? PaletteB - 1 : 0;
          break;
    
        case 4:       //青
          //青増幅
          PaletteR = (PaletteR > 0) ? PaletteR - 1 : 0;
          PaletteG = (PaletteG > 0) ? PaletteG - 1 : 0;
          PaletteB = (PaletteB < BRIGHT_MAX) ? PaletteB + 1 : BRIGHT_MAX;
          break;

        case 5:       //紫
          //赤と青増幅
          PaletteR = (PaletteR < BRIGHT_MAX) ? PaletteR + 1 : BRIGHT_MAX;
          PaletteG = (PaletteG > 0) ? PaletteG - 1 : 0;
          PaletteB = (PaletteB < BRIGHT_MAX) ? PaletteB + 1 : BRIGHT_MAX;
          break;

        case 6:       //水
          //緑と青増幅
          PaletteR = (PaletteR > 0) ? PaletteR - 1 : 0;
          PaletteG = (PaletteG < BRIGHT_MAX) ? PaletteG + 1 : BRIGHT_MAX;
          PaletteB = (PaletteB < BRIGHT_MAX) ? PaletteB + 1 : BRIGHT_MAX;
          break;

        case 7:       //白
          //全色増幅
          PaletteR = (PaletteR < BRIGHT_MAX) ? PaletteR + 1 : BRIGHT_MAX;
          PaletteG = (PaletteG < BRIGHT_MAX) ? PaletteG + 1 : BRIGHT_MAX;
          PaletteB = (PaletteB < BRIGHT_MAX) ? PaletteB + 1 : BRIGHT_MAX;
          break;
      }

      uint32_t Palette = pixels.Color(PaletteR, PaletteG, PaletteB);      //パレットの作成

      pixels.setPixelColor(0, Palette);
      
      pixels.show();
      delay(WAIT_MS);
    }
  }
}

◆結果

なめらかな色変化ができました。
輝度やウエイトを調整することで表現力が広がります。
色の変化順はfor文で順番に繰り返しの変化をさせていますが、色順をテーブルにすることで好きなカラーオーダーで変化させる工夫もできます。

コメント

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