Arduino環境でYD-RP2040を使う

it

Arduino環境にRaspberryPi Picoが登場してからいくつかのジェネリックも登場しました。
RaspberryPi Picoの互換基板で圧倒的なコスパのVCC-GNDのYD-RP2040を使ってみました。

記事の目的と内容

YD-RP2040とRaspberryPi Picoとの比較と差分についての記載をします。
記事の内容は
・YD-RP2040とRaspberryPi Picoとの差分比較
・YD-RP2040で発生したトラブル
・YD-RP2040に搭載された機能の使い方

共通した基本的なRP2040についての使い方、関連記事はこちら

VCC-GND YD-RP2040

主な仕様

RaspberryPi Pico のジェネリック基板としては上位互換になると思います。
RaspberrpPi Picoよりも使えるピンの数や機能が多く、フラッシュメモリの搭載量をラインナップから選択することができます。

差分項目YD-RP2040RaspberryPi Pico
接続Type CMicro B
フラッシュMemory4, 8, 16MB
3種類のラインナップ
2MB
ADC4
GPIO2826
ボタンBOOT
RESET
USER (GP24)
BOOT
LED青(GP25)
WS2812(GP23)
緑(GP25)

RP2040では入手性もよく、低価格に至ってはトップクラスです。
Ali Expressで購入すると\400前半で入手することができます。

ピン配置

外観


ピン番号のシルク表示が表にも裏にもあるので作業しやすい。
メモリサイズの違いを購入後に判別するのは難しいので、ピンヘッダの色やシールで識別しています。

ピンの並びはRaspberryPi Picoと同じです。
ピン横にシルク印刷があるので作業性はいいですが、ブレッドボードで使用すると基板が幅広なのでジャンパワイヤを挿抜しにくい欠点があります。
ブレッドボードでは左右2列使用できますが、下図のように基板が干渉してジャンパワイヤを垂直に挿すことができません。

YD-RP2040にはWS2812やユーザボタンなどのユーティリティが充実していて本家RaspberryPi Picoより使い勝手が良いです。
特に再起動させるときはUSBのスイッチや挿抜をしなくてもよいのがとても助かります。

使用感

Good

入手性とコスパが良い。
ピン番号がシルク印刷されているので作業性が良い。
ユーザボタン、リセット、WS2812などのユーティリティが豊富。

Bad

RaspberryPi Picoと同じピン間隔だが基板幅広でブレッドボードで使いにくい。
販売店、購入時期などにより基板上のパッド処置が違うことがある。

そのほか

Ali Expressで購入することができれば\400台で購入することができ、かなりのコスパです。
最近ではamazonでの取り扱いが増えたことで入手性はよくなっていますが少々割高です。

メモリは最大の16MBを使っていますが、いまだに2MBすら使えていないので今のところ不要です。
ボタンやLEDも充実しているので、これ一枚でRaspberryPi Picoよりも充実した評価ができます。
RP2040の評価程度であれば4MBモデルでも十分だと思います。

故障やトラブルが多いところもあります。
4MByte品も所有していますが、電源が故障しました。
電源関係の部品を交換することで修理できたので後日記事にします。

準備

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

ライブラリ

Arduino IDEのボードマネージャからYD-RP2040用のライブラリのインストールとボードの選択をします。

検索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 Jul/2022 では1.9.3
※2 xx は 使用されるボードのメモリサイズを選択する

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

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

トラブル

電源が入らない

現象はUSBからの電源供給からは電源LEDが微弱な点滅をしてスケッチが動作しない。
VINからの供給であれば動作するという現象です。

下図整流器を交換することでUSBから起動するようになりました。



この現象の修理の様子はこちらの記事で紹介しています。

■WS2812が点灯しない

スケッチを書きこんでもWS2812が点灯しない現象があります。

YD-RP2040のWS2812を点灯させるためには下図RGBパターンがショートしている必要があります。


基板の購入時期や販売店によってはRGBパッドがオープン状態のものが販売されているようです。
パッドを半田でショートさせることでWS2812を使用できるようになります。

■アナログ入力の読み出し値が異常

アナログ入力への読み出し値が異常な値になる現象があります。
YD-RP2040でアナログ入力を使用するために下図VREFパッドがショートしている必要があります。

基板の購入時期や販売店によってはVREFパッドがオープン状態のものが販売されているようです。
パッドを半田でショートさせることでWS2812を使用できるようになります。

基本スケッチ

ユーザボタン

説明

ユーザボタンを押下している間点灯。
ユーザボタンを押していない間消灯します。

ユーザボタンはプルアップして使用します。
押下状態が Low, 通常状態が High です。

サンプルスケッチ


#define USER_BUTTON    (24)                   //USER Button は GP24
#define BUILT_IN_LED   (25)                   //Built In LED は GP24

void setup() 
{
   pinMode(BUILT_IN_LED, OUTPUT);             //ビルトインLEDを使用します
   pinMode(USER_BUTTON, INPUT_PULLUP);        //ユーザボタンをプルアップして使用します。
}

void loop() 
{
  PinStatus Val = digitalRead(USER_BUTTON);   //ボタンの状態を読み取る, Pull Upしているので押下状態は Low, 押していない場合は Highです。 
  digitalWrite(BUILT_IN_LED, !Val);           //LEDの点灯、または消灯を行います。 PullUpしたボタンの状態を反転させます。
}

結果

画像左がアイドリング状態。
画像右が、ボタン押下状態で、LED青が点灯する様子。

赤いLEDは電源LEDです。常時点灯です。

WS2812

スケッチの説明

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

サンプルスケッチ

#include <Adafruit_NeoPixel.h>

#define DIN_PIN    (23)            // NeoPixel の出力ピン番号はGP23
#define LED_COUNT  (1)             // LEDの連結数
#define WAIT_MS    (1000)          // 次の点灯までのウエイト
#define BRIGHTNESS (128)           // 輝度
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);
}

結果

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

コメント

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