こんにちは、あろっちです。
Waveshare RP2040-Zeroを入手したので試してみました。
特徴
- RP2040搭載小型MCUボード
- USB Type-C
- 端面スルーホール(キャリアボードに直接はんだづけが可能)
- RGB LED(WS2812)
- リセットボタン
- ブートボタン
MCU | RP2040 デュアルコア ARM Cortex M0+プロセッサ、最大動作周波数 133 MHz |
フラッシュメモリ | 2MB |
GPIO | 29(20×外部ピン、9×はんだポイント) ・2×SPI、2×I2C、2×UART、4×12bit ADC、16×PWMチャネル |
サイズ
本記事ではArduino(C/C++)で試してみます。
開発環境としてVS CodeやPlatformIO IDEを使うこともできたりします。
2022年末にRP2040-Oneが発売されました。
参考サイト:
Waveshare製品ではRP2040-Plusも記事にしていますので、ぜひご覧ください。
Waveshare製品にはRP2040-Plusの他にLCDが搭載されたRP2040-LCD-0.96があります。
RP2040-LCD-0.96とRaspberry Pi Pico(参考サイト)
RP2040搭載ボードまとめ記事(参考サイト)
ピン配列
Seeeduino XIAOほどのサイズのボードから、RP2040のGPIO30本のうち1本がRGB LEDで使用、20本がスルーホール(ヘッダ)端子、9本が背面パッドから引き出されています。
※RP2040のGPIOは30本、Raspberry Pi Picoの場合、外部GPIOx26
USBマスストレージモード
BOOTボタンを押した状態で、リセットボタンを押すと、USBマスストレージモード(RPI-RP2)になります。
USBマスストレージモードの時に、PCからMicroPythonやCircuitPythonのファームウェアなどがインストールできます。
MicroPythonやCircuitPythonのファームウェアのインストール方法は、以下の記事を参考にしてください。
RP2040-Zeroでは、Raspberry Pi Picoのファームウェアを使用できます。
Arduinoボード設定
- Arduino IDEにボードを追加
※実施済みの場合、この手順は不要です。
事前にRaspberry Pi Pico/RP2040ボードを追加します。追加方法は、以下の記事をご参照ください。
- Raspberry Pi Pico/RP2040ボードのインストール
[ツール] > [ボード] > [ボードマネージャ]をクリックし、検索ボックスに「rp2040」と入力し、[Raspberry Pi Pico/RP2040]ボードをインストールします。
※以下は、バージョン1.9.5をインストール済みの画像です。実際には最新バージョンをインストールすればよいでしょう。
- ボードの選択
[ツール] > [ボード] > [Raspberry Pi RP2040 Boards(Ver)] > [Waveshare RP2040 Zero]を選択します。
Raspberry Pi Pico/RP2040ボード(Arduino-Pico) バージョン2.6.4より前の場合
[ツール] > [ボード] > [Raspberry Pi RP2040 Boards(Ver)] > [Raspberry Pi Pico]を選択します。
- シリアルポートの選択
[ツール] > [シリアルポート]からRP2040-Zeroが接続されているシリアルポートを選択します。
サンプルプログラム(Arduinoスケッチ)
RGB LED Lチカ
カラフルにLチカします。
Adafruit NeoPixelライブラリを使用しています。
#include <Adafruit_NeoPixel.h>
#define LED_PIN 16
#define COLOR_REPEAT 2
// create a pixel strand with 1 pixel on PIN_NEOPIXEL
Adafruit_NeoPixel pixels(1, LED_PIN);
uint8_t color = 0, count = 0;
uint32_t colors[] = {pixels.Color(125, 0, 0), pixels.Color(0, 125, 0), pixels.Color(0, 0, 125), pixels.Color(125, 125, 125)};
const uint8_t COLORS_LEN = (uint8_t)(sizeof(colors) / sizeof(colors[0]));
void setup() {
pixels.begin(); // initialize the pixel
}
void loop() {
pixels.setPixelColor(0, colors[color]);
pixels.show();
delay(1000);
pixels.clear();
pixels.show();
delay(1000);
count++;
if(count >= COLOR_REPEAT) {
count = 0;
color++;
if(color >= COLORS_LEN) {
color = 0;
}
}
}
一撃入魂
BOOTボタンを押すと、1/2でレインボーに光るというスケッチです。
ルール
チャンスは1回、ボタン押下時に抽選
ボタン入力の受付は1回のみです。
再チャレンジしたい場合は、リセットボタンを押してみてください。
RGB LEDの状態について
ボタン入力受付は、白点滅
抽選演出は、赤で表現
抽選結果は、当選時 > レインボー、落選時 > フェードアウト
#include <Adafruit_NeoPixel.h>
#define LED_PIN 16
#define TOGGLE_PERIOD (1000u)
#define LED_STAND_BY_COLOR 0xffffff
#define LED_READY_COLOR 0xff0000
Adafruit_NeoPixel pixels(1, LED_PIN);
uint8_t rgbValues[7][3] = {
{255, 0, 0}, {255, 165, 0}, {255, 255, 0}, {0, 128, 0}, {0, 255, 255}, {0, 0, 255}, {128, 0, 128}};
int16_t randNumber;
int16_t brightness = 0;
int16_t fadeAmount = 10;
void toggleLED_nb(void)
{
static bool toggle = true;
static auto lastToggle = millis(); // saved between calls
auto now = millis();
if (now - lastToggle > TOGGLE_PERIOD)
{
if (toggle)
{
pixels.setPixelColor(0, LED_STAND_BY_COLOR);
pixels.setBrightness(18);
pixels.show();
}
else
{
pixels.clear();
pixels.show();
}
toggle = !toggle;
lastToggle = now;
}
}
void readyLED()
{
for (uint8_t i = 0; i < 3; i++)
{
brightness = 0;
pixels.clear();
pixels.show();
delay(100);
for (uint8_t j = 0; j < (100 / fadeAmount); j++)
{
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(brightness);
pixels.show();
brightness = brightness + fadeAmount;
delay(80);
}
delay(1000);
}
brightness = 150;
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(brightness);
pixels.show();
delay(3000);
}
void successLED()
{
for (uint8_t i = 0; i < 8; i++)
{
for (uint8_t j = 0; j < 7; j++)
{
pixels.setPixelColor(0, pixels.Color(rgbValues[j][0], rgbValues[j][1], rgbValues[j][2]));
pixels.setBrightness(18);
pixels.show();
delay(50);
}
}
}
void failureLED()
{
while (0 < brightness)
{
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(brightness);
pixels.show();
brightness = brightness - fadeAmount;
delay(80);
}
pixels.clear();
pixels.show();
delay(200);
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(10);
pixels.show();
delay(150);
}
void setup()
{
pixels.begin();
while (!BOOTSEL)
{
toggleLED_nb();
delay(10);
}
// 抽選
randomSeed(analogRead(A2));
randNumber = (int16_t)random(0xffff + 1);
readyLED();
if (randNumber < 0)
{
// おめでとう
successLED();
}
else
{
// 残念
failureLED();
}
pixels.clear();
pixels.show();
}
void loop()
{
}
落選時
当選時
RP2040内部温度センサーの温度を7セグ(MAX7219)に表示する
RP2040内部温度センサーの温度を7セグに表示するスケッチです。
7セグ表示用ライブラリにDigitLedDisplayを使っています。
※Arduino IDEのライブラリマネージャからインストールできました。
#include <DigitLedDisplay.h>
#define LD_CS 1
#define LD_TX 3
#define LD_SCK 2
DigitLedDisplay ld = DigitLedDisplay(LD_TX, LD_CS, LD_SCK);
void setup() {
Serial.begin(115200);
delay(100);
/* Set the brightness min:1, max:15 */
ld.setBright(10);
/* Set the digit count */
ld.setDigitLimit(8);
}
void loop() {
float temp = analogReadTemp();
// tempの値を整数3桁に変換(小数点第二位は四捨五入)
long digi_temp = (long)((temp + 0.05) * 10);
// 2桁目の値を取得
uint8_t val = (uint8_t)(digi_temp % (10 * 10) / 10);
// 一旦整数値を表示する
ld.printDigit(digi_temp);
// 2桁目に小数点をつける
ld.write(2, charTable[val] | 0b10000000);
Serial.printf("Core temperature: %2.1fC\n", temp);
delay(2000);
}
ピンヘッダー未装着の状態でスルーホールテストワイヤーを使って配線しています。
まとめ
RP2040搭載ボードでは、小型でRP2040のGPIOが29ピン使えるというのが特徴的なボードだと思いました。
RP2040の多くのGPIOを使いたい!だけど、Raspberry Pi Picoではサイズが少々大きいのが難点、といった場面で代替ボードとして活用できそうに感じました。
当ブログのマイコン記事です。ぜひご覧ください。
コメント