RP2040-ZeroとTiny 2040

コンピュータ、組み込み

RP2040搭載基板の中で比較的入手性もよく安価に使用できる Waveshare RP2040-Zeroについて
とPIMORONI のTiny 2040を使ってみました。
Arduino環境で使用できる最小クラスの基板を紹介します。

RP2040-Zero と Tiny 2040 比較

外観

どちらも最小クラスの基板です。
RP2040ZeroのほうがGPIOを多く引き出している分大きい。

主な仕様比較

比較項目RP2040-ZeroTiny 2040
外観
接続Type CMicro C
フラッシュMemory2MB8MB
ADC44
I2C22
SPI21
GPIO※120
背面パッドパターンx9
11
ボタンBOOT
RESET
BOOT
RESET
LEDGP16 W2182フルカラーLED
青 GP20
緑 GP19
赤 GP18
価格\650~\800\1,400~\1,700
※1 ピンヘッダで使用できるピン数

ピン配置の違い

ピン配置はよく似ていますが、RP2040-Zeroの拡張されたGP14, GP8 以外にGP15がTiny 2040ではGNDなので、置き換えがある場合は配慮が必要です。

RP2040-Zero

ピン配置
外観

後方(TypeCコネクタの反対側)のスルーホールにピンヘッダをつけてしまうと、ブレッドボードが使えなくなります。

背面のパッドパターンにもGPIOが9ピン+GNDありますが、サイズと間隔がなかなかの難関。

Tiny 2040

ピン配置
外観

RP2040-ZeroとTiny 2040使ってみて

どちらも小型なので400穴ブレッドボードでも余裕で複数のモジュールを配線することができる。
ピン数が少ないことでブレッドボードの挿抜が楽。

[2022/12/22 WaveshareのRP2040-Zeroのドングルタイプの記事を追加]

準備

使い方はRaspberrpPi Picoと同じですので、こちらのリンクを参照してください。

ライブラリ

Arduino IDEのボードマネージャからRP2040-Zero, Tiny 2040用のライブラリのインストールとボードの選択をします。
どちらも同じライブラリを使用します。
“変更する設定”にてメモリサイズを変更してください。

検索RP2040
ボードライブラリRaspberry Pi RP2040 Boards(x.x.x)※1
選択するボードRaspberry Pi RP2040 Boards(x.x.x) > Generic RP2040
変更する設定Tools > Flash Size > xxMB(no FS)※2
※1 x.x.x Sep/2022 では2.5.2
※2 RP2040-Zero は 2MB(no FS), Tiny 2040 8MB(no FS)を選択する

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

検索neopixel
ライブラリ名Adafruit NeoPixel by Adafruit(x.x.x)※
※x.x.x Jul/2022 では 1.10.5

基本スケッチ(RP2040-Zero)

W2812

サンプルスケッチ

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

【スケッチの説明】
NeoPixel搭載RP2040基板で使用できます。
実装 W2812を点灯させます。
1秒間隔で、赤->緑->黄->青->紫->水->白 の順で点灯させます。

【バージョン情報】
 2022/7/6 : 新規
 2022/9/8 : RP2040-Zero用にBuilt In LEDのピン番号を変更 23 -> 16
**********************************************************************/

#include <Adafruit_NeoPixel.h>

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

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

void loop()
{
  pixels.clear();
  
  //pixels.Color(Red, Green, Blue)で、パレット情報を作成する。
  //赤点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, 0, 0));
  pixels.show();
  delay(WAIT_MS);

  //緑点灯
  pixels.setPixelColor(0, pixels.Color(0, BRIGHTNESS, 0));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 緑 で 黄点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, BRIGHTNESS, 0));
  pixels.show();
  delay(WAIT_MS);

  //青点灯
  pixels.setPixelColor(0, pixels.Color(0, 0, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 青 で 紫点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, 0, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //緑 + 青 で 水点灯
  pixels.setPixelColor(0, pixels.Color(0, BRIGHTNESS, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);

  //赤 + 緑 + 青 で 白点灯
  pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS));
  pixels.show();
  delay(WAIT_MS);
}

スケッチの説明

Adafruit のAdafruit NeoPixel by Adafruitを使用します。

1秒ごとに、LEDの色を変化させます。
赤->緑->黄->青->紫->水->白

結果

1秒ごとに色の変化が確認出来ました。
最大輝度はかなり明るいので、直視すると残影が残ります。

サンプルスケッチ(Tiny 2040)

フルカラーLED

サンプルスケッチ

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

【スケッチの説明】
Tiny2040基板で使用できます。

Built In LED(フルカラー)を点灯させます。
1秒間隔で、赤->緑->黄->青->紫->水->白 の順で点灯させます。

【バージョン情報】
 2022/9/9 : 新規
***********************************************************************/

#define LED_R 18        //赤のピン番号
#define LED_G 19        //緑のピン番号
#define LED_B 20        //青のピン番号

#define WAIT_MS 1000    // 次の点灯までのウエイト
#define BRIGHTNESS 64   // 輝度

void setup()
{
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
}

void loop()
{
  //Tiny 2040のLEDはLow Active なので、LOWで点灯
  //赤点灯
  Tiny_LED(BRIGHTNESS, 0, 0);
  delay(WAIT_MS);

  //緑点灯
  Tiny_LED(0, BRIGHTNESS, 0);
  delay(WAIT_MS);

  //赤 + 緑 で 黄点灯
  Tiny_LED(BRIGHTNESS, BRIGHTNESS, 0);
  delay(WAIT_MS);

  //青点灯
  Tiny_LED(0, 0, BRIGHTNESS);
  delay(WAIT_MS);

  //赤 + 青 で 紫点灯
  Tiny_LED(BRIGHTNESS, 0, BRIGHTNESS);
  delay(WAIT_MS);

  //緑 + 青 で 水点灯
  Tiny_LED(0, BRIGHTNESS, BRIGHTNESS);
  delay(WAIT_MS);

  //赤 + 緑 + 青 で 白点灯
  Tiny_LED(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
  delay(WAIT_MS);
}

//Build In LED を点灯させます。
//引数
//R : (0 to 255) 赤の輝度
//G : (0 to 255) 緑の輝度
//B : (0 to 255) 青の輝度
void Tiny_LED(const unsigned char R, const unsigned char G, const unsigned char B)
{
  const unsigned char AnalogMax = 255;
  analogWrite(LED_R, AnalogMax - R);
  analogWrite(LED_G, AnalogMax - G);
  analogWrite(LED_B, AnalogMax - B);
}

スケッチの説明

フルカラーLEDを点灯させます。
3色のLEDが1個に集約されたものですが、1色ずつ点灯させ混ぜ合わせることでフルカラーになります。

Tiny 2040 ではLowActiveになっているので、Lowが点灯、HIGHが消灯になります。
PWM制御では0に近いほど明るく、255に近いほど暗くなります。

1秒ごとに、LEDの色を変化させます。
赤->緑->黄->青->紫->水->白

結果

1秒ごとに色の変化が確認出来ました。
混色はそれほどきれいに混ざりあっていないです。

トラブル

CPU Speed

現象

Tiny 2040のスケッチ書き込み後、フルカラーLEDが半発光状態でシリアル認識されなくなった。
書き込んだスケッチの動作もしない。

原因

CPU Speed に 133MHzを選択すると発生する模様。
因果は不明ですが、125MHz以下を選択すると期待通りの動作をしました。
generic RP2040ライブラリから選択できるCPU Speedの設定を確認してみると以下の結果になりました。

CPU Speed(MHz)動作可否
50
100
125
133×
150(Over Clock)×
175(Over Clock)×
200(Over Clock)×
225(Over Clock)×
250(Over Clock)×
300(Over Clock)×

対応

BOOTボタンを押して再起動し、初期化を行った。
CPU Speedを125MHz以下に設定して動作させた。

BOOTボタンを押して基板の初期化をする方法はこちらの記事の「準備」を参照してください。

関連リンク

コメント

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