RP2040-Zero【Waveshare】を試してみました【Arduino使用】

Raspberry Pi/電子工作

こんにちは、あろっちです。

Waveshare RP2040-Zeroを入手したので試してみました。

RP2040-Zero - Waveshare Wiki

特徴

  • RP2040搭載小型MCUボード
  • USB Type-C
  • 端面スルーホール(キャリアボードに直接はんだづけが可能)
  • RGB LED(WS2812)
  • リセットボタン
  • ブートボタン
MCURP2040 デュアルコア ARM Cortex M0+プロセッサ、最大動作周波数 133 MHz
フラッシュメモリ2MB
GPIO29(20×外部ピン、9×はんだポイント)
・2×SPI、2×I2C、2×UART、4×12bit ADC、16×PWMチャネル

サイズ

本記事ではArduino(C/C++)で試してみます。

開発環境としてVS Codeを使うこともできたりします。

Waveshare製品では、RP2040-Plusも記事にしていますので、よろしければご覧ください。

スポンサーリンク

ピン配列

Seeeduino XIAOほどのサイズのボードから、RP2040のGPIO30本のうち1本がRGB LEDで使用、20本がスルーホール(ヘッダ)端子、9本が背面パッドから引き出されています。

※RP2040のGPIOは30本、Raspberry Pi Picoの場合、外部GPIOx26

左: RP2040-Zero 中: Seeed XIAO RP2040 右: Adafruit QT Py RP2040

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)] > [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ではサイズが少々大きいのが難点、といった場面で代替ボードとして活用できそうに感じました。

以下は、当ブログで紹介させていただいたマイコン記事です。よろしければ、ご覧ください。

スポンサーリンク
この記事を書いた人
あろっち

元ITエンジニア
エンジニア時代は大手企業などでSE・プログラマを経験してきました。

当ブログでは、経験や日々の暮らしの中で、興味があること、役に立ちそうなこと、気になったことを発信していきます。

IT関係(技術的な内容もあります) / スマホ・PC / ガジェット / 生活に役立ちそうなこと ... etc

あろっちをフォローする
Raspberry Pi/電子工作IT
スポンサーリンク
あろっちをフォローする
あろしーど

コメント

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