XIAO規格互換基板 小型のAdafruit QT Py RP2040

コンピュータ、組み込み

XIAO基板サイズ互換 Adafruit Qt Py RP2040 を入手しました。
小型でQwiicコネクタのついたQt Py RP2040を試してみます。

紹介するもの

QT Py RP2040

特徴

基板サイズと電源回りのピン配置ははSeeed製SAMD21(XIAO)と同じ。
Qwiic、WS2812、リセットボタンなどユーティリティは豊富。

CPURP2040 ARM Cortex M0+ 133MHz
接続Micro B Connector
USB1.1 ホスト/デバイス両対応
MemorySRAM 264KB
フラッシュメモリ 8MB
ロジックレベル3.3V
GPIO26
PWM26 (8bit 0 ~ 255)
ADC3 (10bit 0 ~ 1023)
UART2
I2C2
SPI2
そのほかQwiic
WS2812
リセットボタン

その他のRP2040搭載基板の一覧

ピン配置

SeeedStudioのXIAO RP2040とよく似ていますが、I2Cで使用するピン(GPIO24, GPIO25)に大きな違いがあります。
Qt Py RP2040ではI2C0を使用しますが、Seeedstudioの XIAO RP2040ではI2C1です。
RP2040のI2Cを使用するライブラリの多くはデフォルトでI2C0を使用していると思います。
またライブラリの多くは使用するI2Cオブジェクトの変更ができるので、コンストラクタや初期化の関数でオブジェクトを設定します。

外観

400穴ブレッドボードでは、左右2列と3列使用することができます。

使ってみて

SeeedstudioのXIAO(SAMD21)と比べると基板サイズと電源周りは同じです。
XIAO RP2040と比べると同じRP2040を搭載していてもピン配置は違います。
Qt Py RP2040はライブラリ側でデフォルトがI2C0になっていることが多いので導入のしやすさがあります。
また、Qwiicコネクタ付きなので、I2Cのコネクタ付きセンサなどは半田作業不要で使用することができます。

全判的にXIAO系に対して有利な点はありますが、入手性と価格についてはXIAO RP2040に分があります。

準備

基板の初期化

1.QT Py RP2040 のBOOT SELボタンを押しながら、USBケーブルをパソコンに接続します。

2.パソコンの画面では、QT Py RP2040 をストレージとして認識します。

3.UF2ファイルを以下のサイトからダウンロードします。

circuit python UF2 Download

4.ダウンロードしたファイル[adafruit-circuitpython-raspberry_pi_pico-ja-7.3.0.uf2]※をストレージ認識したQT Py RP2040 にドラッグ&ドロップする。

以上の作業でQT Py RP2040 はCOM認識されます。

今回ダウンロードしたuf2ファイルは、保存しておいてください。
QT Py RP2040 を初期化したいとき(今何のファームウエアが書かれているかわからなくなったとき)には、BOOTSELボタンを押しながら再起動することで、やり直しができます。

※2022/Jun 時点ではVersion 7.3.0

ライブラリ

ボードライブラリ

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

追加のボードマネージャのURLhttps://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
検索RP2040
ボードライブラリRaspberry Pi RP2040 Boards(x.x.x)※
選択するボードRaspberry Pi RP2040 Boards(x.x.x) > Adafruit QT Py RP2040
※Generic RP2040でも動作しますが、CPU Speedを133MHz以上に設定すると動作しません。
上記説明の基板の初期化を行って復帰します。
※動作確認はバージョン 2.0.3

モジュールライブラリ

モジュールを使用しない場合インストールの必要はありません。

機能/モジュールライブラリ名検索確認時のバージョン
SSD1306Adafruit SSD1306 by AdafruitSSD13062.5.1
ST7735Adafruit ST7735 and ST7789
Library by Adafruit
ST77351.9.3
関連
SSD1306
ST7735
Adafruit GFX Library by AdafruitGFX1.11.3
WS2812Adafruit NeoPixel AdafruitNEOPIXEL1.10.5

基本スケッチ

タクトスイッチとLED点灯

説明

タクトボタンとLEDの組み合わせの動作をします。

タクトボタンはPULLDOWN設定します。(押下したらHIGH)
タクトボタンを読み取り、押下されるとLEDが点灯します。
ボタンが離されるとLEDは消灯します。

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

【マイコン基板】
QT Py RP2040

【スケッチの説明】
プルダウンしたピンの状態がHighならLEDを点灯、LowならLEDを消灯させます。

【ライブラリ】
Raspberry Pi Pico/RP2040 > Generic RP2040 または Adafruit QT Py RP2040

【準備】
GPIO29(LED) -> 保護抵抗(約200Ω) -> LED -> GND
3.3V -> タクトボタン -> GPIO28(INPUT)

ワイヤによる配線で行う場合は、保護抵抗の適値を求めて使用してください。
 
【バージョン情報】
2022/12/14 : 新規
**********************************************************************/


#define LED 29       //LED
#define BUTTON 28    //タクトスイッチ

void setup()
{
  pinMode(LED, OUTPUT);               //ピン出力設定
  pinMode(BUTTON, INPUT_PULLDOWN);    //プルダウンで入力
}

void loop()
{
  int iStat = digitalRead(BUTTON);
  digitalWrite(LED, iStat);           //ボタンの状態をLEDに出力 
}
結果

ボタンを押下することでLEDが点灯しました。
ボタンを離すとLEDは消灯しました。

PWM

説明

PWMを使ってLEDのフェード点灯(ゆっくり点灯させる)を行います。

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

【マイコン基板】
QT Py RP2040

【スケッチの説明】
PWM出力でのフェード点灯(ゆっくり点灯)とフェード消灯(ゆっくり消灯)を行います。

【ライブラリ】
Raspberry Pi Pico/RP2040 > Generic RP2040 または Adafruit QT Py RP2040

【準備】
GPIO3(LED) - 保護抵抗(約200Ω) - LED Anode, LED Cathode - GND

抵抗値は使用するLEDにより適切な抵抗値を求めてください。

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

#define PWM 3        //PWM 出力ピン

void setup()
{
  pinMode(PWM , OUTPUT);
}

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

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

LEDがゆっくり点灯、ゆっくり消灯しました。

ADC

説明

ADCに入力された電圧を読み取りCOMに出力します。

電圧の入力にLOLIN32 Liteを使用します。
0~255(約3.3V) まで2msごとに1ずつ上昇し、255(約3.3V)~0までを2msごとに1ずつ下降する設定を繰り返します。

配線
RP2040-PICO-BOOT 配線LOLIN32 Lite
GPIO28(ADC)GPIO26(DAC)
GNDGND
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
QT Py RP2040

【スケッチの説明】
入力された電圧を読み取ります。

【ライブラリ】
 Raspberry Pi Pico/RP2040 > Adafruit QT Py RP2040

【準備】
QT Py RP2040 <-> LOLIN32 Lite
GPIO28(ADC)       <-> GPIO26(DAC)
GND               <-> GND

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

#define ADC 28

void setup()
{
  Serial.begin(115200);
  pinMode(ADC, INPUT);
}

void loop()
{
  int iADC = 0;

  //外部から入力された電圧を読み取り、結果をCOMに出力します。
  iADC = analogRead(ADC);
  Serial.printf("(ADC) = %d\r\n", iADC);
  delay(2);
}
結果

入力した電圧を読み取った結果をグラフにしました。
電圧の変化は0V -> 3.3Vまでを約500msで上昇し、3.3V -> 0Vまで約500msで下降します。

ADC読み取り値は低値から高値まで直線でキレイな波形になっています。
オフセットもなくかなり正確に計測できています。

電圧と読み取り値の同期はできていませんが、参考程度に入力電圧を添付します。

UART

説明

UART0から読み取ったデータをUART1に送信します。
UART1から読み取ったデータをUART0に送信します。

配線
QT Py RP2040 配線FT232RL(1)配線FT232RL(2)
GP28(UART0 TX)RX
GP29(UART0 RX)TX
GP24(UART1 TX)RX
GP25(UART1 RX)TX
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
RP2040搭載基板で使用できます。
Adafruit QT Py RP2040

【スケッチの説明】
UART0 と UART1の通信をします。

UART0から受信した内容をUART1へ送信します。
UART1から受信した内容をUART0へ送信します。

【ライブラリ】
Raspberry Pi Pico/RP2040 > Adafruit QT Py RP2040

【準備】
UARTの送受信にFT232RLを使用します。
FT232RLはUART0用と、UART1用の2個使います。それぞれを(1), (2)と識別します。

QT Py RP2040 <-> FT232RL(1)
GP28 (UART0 TX) <-> RX
GP29 (UART0 RX) <-> TX

QT Py RP2040 <-> FT232RL(2)
GP24 (UART1 TX) <-> RX
GP25 (UART1 RX) <-> TX

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

void setup()
{
  //Serial は USB(COM)を使ったシリアル通信用オブジェクト
  //Serial1は UART0の通信オブジェクト
  //Serial2は UART1の通信オブジェクト

  Serial1.setTX(28);            //UART0はSerial1オブジェクトを使用します。
  Serial1.setRX(29);             //デフォルトではTX = 0, RX = 1

  Serial2.setTX(24);
  Serial2.setRX(25);

  Serial1.begin(115200);                 //SerialオブジェクトはUART0 (COM)
  Serial2.begin(115200);                //Serial1オブジェクトはUART1
}

void loop()
{
  if(Serial2.available() != 0)          //UART1にデータがあれば、読み取った内容をUART0に送信
  {
      Serial1.write(Serial2.read());
  }

  if(Serial1.available() != 0)           //UART0にデータがあれば、読み取った内容をUART1に送信
  {
      Serial2.write(Serial1.read());
  }
}
結果

結果はTeratermを2つ起動して確認します。
1つはUART0 用で、もう一つはUART1用です。
結果は省略します。

UART0用のTeratermに入力された文字は、UART1用のTeraterm画面に表示されます。
UART1用のTeratermに入力された文字は、UART0用のTeraterm画面に表示されます。

I2C(SSD1306)

説明

I2Cを使ってSSD1306(OLED 0.96inch)モニタのサンプルを動作させます。
QT Py RP2040 では、I2Cが2系統あります。
決められた中から任意のピンに信号を出力することができます。
本サンプルではピン設定の仕方と簡単な表示を行っています。
各I2C系統での設定可能なピンはサンプルを参照してください。

掲載以外の図形表示などのサンプルは以下のサンプルを参照してください。
ファイル(F) > スケッチ例 > Adafruit SSD1306 > ssd1306_128x64_i2c

配線

本サンプルはI2C0を使用します。
配線は以下の表のとおりです。

QT Py RP2040 配線SSD1306(0.96inch)
3.3VVCC
GNDGND
GPIO25(I2C0 SCL)SCL
GPIO24(I2C0 SDA)SDA
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
RP2040搭載基板で利用できます。
QT Py RP2040

【スケッチの説明】
SSD1306 OLEDの制御をします。
I2Cは I2C0とI2C1のどちらのサンプルも掲載しますが、
I2C1側はコメントアウトしますので、状況に応じてコメントを外してください。
※コメント検索 [I2C1の場合]

【ライブラリ】
Raspberry Pi Pico / RP2040 > Adafruit QT Py RP2040

【準備】
マイコン基板 <-> SSD1306
3V3           <-> VCC
GND           <-> GND
GP24(I2C0 SDA) <-> SDA
GP25(I2C0 SCL) <-> SCL

I2C1の場合
3V3           <-> VCC
GND           <-> GND
GP26(I2C1 SDA) <-> SDA
GP27(I2C1 SCL) <-> SCL

【バージョン情報】
2022/12/18 : 新規
**********************************************************************/
//QT Py RP2040
//I2C0 SDA に設定可能なピン : 4, 20, 24, 28
//I2C0 SCL に設定可能なピン : 5, 25, 29
//I2C1 SDA に設定可能なピン : 6, (22), 26
//I2C1 SCL に設定可能なピン : 3, (23), 27
//()は Qwiic

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


#define PIN0_SDA 24
#define PIN0_SCL 25
#define PIN1_SDA 26
#define PIN1_SCL 27

#define SCREEN_WIDTH 128                //解像度 128 x 64 で使用します。
#define SCREEN_HEIGHT 64                //SCREEN_HEIGHTは 32 に設定することができます。

#define OLED_RESET     -1               //使用しないので -1を設定する。
#define SCREEN_ADDRESS 0x3C             //I2Cアドレスは 0x3C

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);     //I2C0の場合
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire1, OLED_RESET);     //I2C1の場合

                                        
void setup()
{
  
  // //I2C0の場合
  // Wire.setSDA(PIN0_SDA);
  // Wire.setSCL(PIN0_SCL);

  //I2C1の場合
  // Wire1.setSDA(PIN1_SDA);
  // Wire1.setSCL(PIN1_SCL);


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

  display.clearDisplay();               //何か表示されている場合に備えて表示クリア

  display.setTextSize(2);               //フォントサイズは2(番目に小さい)
  display.setTextColor(SSD1306_WHITE);  //色指定はできないが必要
  display.setCursor(20, 5);            //テキストの表示開始位置
  display.print(F("TAMANEGI"));         //表示文字列
  display.setCursor(35, 25);
  display.print(F("QT Py"));
  display.setCursor(30, 45);
  display.print(F("RP2040"));

  display.display();                    //バッファ転送(表示)
}

void loop()
{
}
結果

SSD1306のサンプルスケッチが動作しました。

SPI(ST7735)

説明

SPIを使ってST7735(LCD 1.8inch)モニタのサンプルを動作させます。

掲載以外の図形表示などのサンプルは以下のサンプルを参照してください。
ファイル(F) > スケッチ例 > Adafruit ST7735 and ST7789 Library > graphicstest

配線

本サンプルはSPI0を使用します。
配線は以下の表のとおりです。

QT Py RP2040 配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GP5(SPI0 CS)CS
GP29Reset
GP28AO(DC)
GP3(SPI0 TX)SDA
GP6(SPI0 SCK)SCK
スケッチ

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

【マイコン基板】
RP2040搭載基板で利用できます。
QT Py RP2040

【スケッチの説明】
ST7735 LCDの制御をします。
SPIは SPI0とSPI1のどちらのサンプルも掲載しますが、
SPI1側はコメントアウトしますので、状況に応じてコメントを外してください。
※コメント検索 [SPI1の場合]

【ライブラリ】
Raspberry Pi Pico / RP2040 > Adafruit QT Py RP2040
Adafruit ST7735 and ST7789 Library
Adafruit GFX Library

【準備】
マイコン基板 <-> ST7735
3V3               <-> VCC
GND               <-> GND
GPIO5(SPI0 CS)    <-> CS
GPIO29            <-> Reset
GPIO28            <-> AO
GPIO3(SPI0 MOSI)  <-> SDA
GPIO6(SPI0 SCK)   <-> SCK

SPI1の場合
3V3               <-> VCC
GND               <-> GND
GPIO13(SPI1 CS)   <-> CS
GPIO29            <-> Reset
GPIO28            <-> AO
GPIO14(SPI1 MOSI) <-> SDA
GPIO15(SPI1 SCK)  <-> SCK

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

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

#define SPI0

//SPI0の場合
#ifdef SPI0

#define TFT_CS          5   // CS
#define TFT_RST         29  // Reset 
#define TFT_DC          28  // DC
#define TFT_MOSI        3  // MOSI
#define TFT_SCK         6   // SCK
Adafruit_ST7735 tft = Adafruit_ST7735(&SPI, TFT_CS, TFT_DC, TFT_RST);

//SPI1の場合
#else

#define TFT_CS          25  // CS
#define TFT_RST         29  // Reset 
#define TFT_DC          28  // DC
#define TFT_MOSI        27  // MOSI
#define TFT_SCK         26  // SCK
Adafruit_ST7735 tft = Adafruit_ST7735(&SPI1, TFT_CS, TFT_DC, TFT_RST);

#endif

void setup(void) 
{
#ifdef SPI0
  //SPI0の場合
  SPI.setTX(TFT_MOSI);
  SPI.setSCK(TFT_SCK);

#else
  //SPI1の場合
  SPI1.setTX(TFT_MOSI);
  SPI1.setSCK(TFT_SCK);
#endif  

  tft.initR(INITR_BLACKTAB);                  //Init ST7735S初期化
  
  tft.fillScreen(ST77XX_BLACK);               //背景の塗りつぶし

  //テキスト表示
  tft.setRotation(3);                         //画面回転
  tft.setTextSize(3);                         //サイズ

  tft.setCursor(0, 20);                      //カーソル位置                      
  tft.setTextColor(ST77XX_RED);              //赤
  tft.printf("TAMANEGI\n");

  tft.setTextColor(ST77XX_GREEN);            //緑
  tft.printf("TAMANEGI\n");

  tft.setTextColor(ST77XX_BLUE);             //青
  tft.printf("TAMANEGI\n");

  tft.setTextColor(ST77XX_YELLOW);           //黄
  tft.printf("TAMANEGI\n");
}

void loop()
{
}
結果

ST7735のサンプルスケッチが動作しました。

特別な機能のスケッチ

Neopixel(WS2812)

説明

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

データ線の初期化以外に、電源ピンをONにしてから使用します。

配線

基板実装WS2812を使用するので配線不要。

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

【マイコン基板】
Adafruit QT Py RP2040

【スケッチの説明】
実装 WS2812を点灯させます。
1秒間隔で、赤->緑->黄->青->紫->水->白 の順で点灯させます。

【ライブラリ】
Raspberry Pi Pico/RP2040 > Adafruit QT Py RP2040
Adafruit NeoPixel by Adafruit

【準備】
配線不要

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

#include <Adafruit_NeoPixel.h>

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

void setup()
{
  pinMode(POWER_PIN, OUTPUT);
  digitalWrite(POWER_PIN, HIGH);

  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);
}
結果

Nexpixelが1秒毎に色の変化をしました。

コメント

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