Arduino環境で01Space ESP32-C3-C3FH4を使う

コンピュータ、組み込み

C3搭載の小型基板 01Space C3 WS2812Matrixを入手しました。
基本的なIO制御や通信(UART, I2C, SPI)、Matrix WS2812の使い方について記載します。

紹介するもの

01Space ESP32-C3-C3FH4

特徴

ESP系では最小クラスの基板。
C3搭載ですが、技適未対応です。(当サイトではこの製品の無線を使用しないこととします)
WS2812を25個搭載。

接続Type C
CPUC3 RISC-V 160MHz
メモリSRAM 400KB
フラッシュ 4MB
GPIO 11 (GPIO18,GPIO19に入力するとリセットがかかる)
ADC 4 (12bit 0 ~ 4095)
PWM 11 (8bit 0 ~ 255)
UART1
I2C1(デフォルトではないが自由に設定可能)
SPI1
ボタンBOOT, RST
そのほかLED青(GPIO10 外部ピン共通)
WS2812 5×5(25個)(GPIO8)
JST SH 1.0mm Qwiicコネクタ(SDA GPIO0, SCL GPIO1)
[2022/12/14 PWMピン数修正]

メーカー01Space github

ピン配置

外観

400穴ブレッドボードでは、ピンピッチが合わないので挿さりません。

小型のブレッドボードを2個使って連結して使用しています。

使ってみて

デモのスケッチはとても煌びやかで上書きするのがもったいないくらいです。
信号線や通信線などピン配置に関する情報が少ないのでとても苦労しました。

通常のブレッドボードに挿さらないのが残念です。
組み込みへ使用を考えても、ユニバーサル基板にそのまま使用するのが難しいです。
BOOTやRSTボタンもあるのですが、基板の背面にあるので使いにくいです。

準備

ライブラリ

ボードライブラリ

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

ボードマネージャのURLhttps://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
検索ESP
ボードライブラリesp32 by Espressif Systems バージョン x.x.x※
選択するボードツール > ボード > esp32 > ESP32C3 Dev Module
※ x.x.x 動作確認は2.0.5を使用しています

モジュールライブラリ

機能/モジュールライブラリ名検索確認時のバージョン
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 by AdafruitNEOPIXEL1.10.5

書き込み

Arduino IDEから書き込みボタンを押下することで書き込みできます。

書き込みができないとき、COMが認識されない場合は背面の[B]ボタン(BOOT)を押下しながら電源を再投入します。

基本スケッチ

ボタンLED

説明

ボタンを押下することでLEDと点灯、ボタンを離すことでLEDを消灯します。
ボタンピンは入力設定でプルダウンしています。

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

【マイコン基板】
ESP32-C3-C3FH4 で利用できます。

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

【ライブラリ】

【準備】
LEDピン(GPIO21) -> 保護抵抗(約200Ω) -> LED Anode, LED Cathode -> GND
3.3V -> ボタンピン(GPIO20)

【バージョン情報】
2022/11/15 : 新規
**********************************************************************/
//ESP32-C3-C3FH4

#define LED 21       //LED
#define BUTTON 20    //タクトスイッチ

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/

【マイコン基板】
ESP32-C3-C3FH4 で利用できます。

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

【ライブラリ】
esp32 > ESP32C3 Dev Module

【準備】
不要

【バージョン情報】
2022/11/15 : 新規
**********************************************************************/
// ESP32-C3-C3FH4 のPWMで設定できるピン (8bit 0 ~ 255)
//  10, 7, 6, 5, 4, 3

#define PWM 10       //実装LED

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ずつ下降する設定を繰り返します。

配線

LOLIN32 Lite のGPIO26(DAC)をT-LITEのGPIO4(ADC)に接続します。
LOLIN32 Lite のGNDとT-LITEのGNDを接続します。

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

【マイコン基板】
 ESP32-C3-C3FH4で利用できます。

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

【ライブラリ】
 esp32 > ESP32C3 Dev Module

【準備】
ESP32-C3-C3FH4  <-> LOLIN32 Lite
GPIO5(ADC)      <-> GPIO26(DAC)
GND             <-> GND

UART出力にFT232RLを使用します。
ESP32-C3-C3FH4  <-> FT232RL
GPIO3(TX)       <-> RX
GPIO2(RX)       <-> TX

【バージョン情報】
2022/11/15 : 新規
**********************************************************************/
//ESP32-C3-C3FH4 で設定できる analogRead (12bit 0 ~ 4095)
//  5, 4, 3, 2

#define ADC 5
#define PIN_RX 2
#define PIN_TX 3

void setup()
{
  Serial1.begin(115200, SERIAL_8N1, PIN_RX, PIN_TX);
  pinMode(ADC, INPUT);
}

void loop()
{
  int iADC = 0;

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

DACで出力した電圧をADCで読み取りました。
ノイズは少ないですが、入力電圧に対して高め値を読み出すようです。

入力した電圧は以前オシロスコープで確認してみましたが、3.2V位出ています。

UART(省略します)

ADCの読み取り結果を出力するために、ピン指定してUARTを使用しています。
参考にしてください。

I2C(SSD1306)

説明

I2Cを使ってSSD1306(OLED 0.96inch)モニタのサンプルを動作させます。
ESP32-C2-C3HF4にはI2Cが見つからなかったため、ピン定義して使用することにします。

Wire.begin(PIN_SDA, PIN_SCL, 1000000);

図形の描画やそのほかの命令はArduinoサンプルスケッチを参照してください。
ファイル(F) > スケッチ例 > Adafruit SSD1306 > ssd1306_128x64_i2c

配線
ESP32-C3-C3FH4配線SSD1306(0.96inch)
3.3VVCC
GNDGND
GPIO7SDA
GPIO6SCL
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
 ESP32-C3-C3HF4 で利用できます。

【スケッチの説明】
I2Cを使い、SSD1306 OLEDの制御をします。
ESP32-C3-C3HF4のピンにはI2Cが見つからなかったのでピン指定してI2Cを使用しています。

【ライブラリ】
esp32 > ESP32C3 Dev Module
Adafruit SSD1306 by Adafruit
Adafruit GFX Library by Adafruit

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

【注意】
COM認識しない場合、BOOTボタンを押下しながら電源を再投入する。

【バージョン情報】
2022/11/6 : 新規
**********************************************************************/
//ESP32-C3-C3HF4  I2C SDA(7), SCL(6)

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

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

#define PIN_SDA 7
#define PIN_SCL 6
#define OLED_RESET     -1               //使用しないので -1を設定する。
#define SCREEN_ADDRESS 0x3C             //I2Cアドレスは 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
                                        //表示制御にはAdafruit製 SSD1306を使用する。
                                        
void setup()
{
  Wire.begin(PIN_SDA, PIN_SCL, 1000000);

  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(20, 25);
  display.print(F("ESP32-C3"));
  display.setCursor(40, 45);
  display.print(F("C3HF4"));

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

void loop()
{
}
結果

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

SPI(ST7735)

説明

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

図形の描画やそのほかの命令はArduinoサンプルスケッチを参照してください。
ファイル(F) > スケッチ例 > Adafruit ST7735 and ST7789 Library > graphicstest

配線
ESP32-C3-C3FH4配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GPIO7(SPI CS)CS
GPIO2Reset
GPIO3AO(DC)
GPIO6(SPI MOSI)SDA
GPIO4(SPI SCK)SCK
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
ESP32-C3-C3FH4 基板で動作します。

【スケッチの説明】
ST7735 LCDの表示制御します。
H/W SPIを使用するための方法についてサンプル記載します。

【ライブラリ】
例 esp32 > ESP32C3 Dev Module

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

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

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

#define TFT_CS          7  // CS
#define TFT_RST         2  // Reset 
#define TFT_DC          3  // DC
#define TFT_MOSI        6  // MOSI
#define TFT_SCK         4  // SCK

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

//S/W SPIはこちら。遅いが任意のピンを使用できる。
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RST);

void setup(void) 
{
  SPI.begin(TFT_SCK, -1, TFT_MOSI, TFT_CS);   //H/W SPIを使用する場合こちらでピン番号を指定する。
                                              //S/W SPIで使用する場合はコメントアウトする。
  

  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)

説明

実装 WS2812を点灯させます。
ライン上に黒(無点灯)->赤->緑->黄->青->紫->水->白 をスクロールさせます。

輝度は調整していますが、まぶしいので直視しないでください。

配線

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

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

【マイコン基板】
ESP32-C3-C3FH4 で利用できます。

【スケッチの説明】
実装 WS2812を点灯させます。
ライン上に黒(無点灯)->赤->緑->黄->青->紫->水->白 をスクロールさせます。

【ライブラリ】
esp32 > ESP32C3 Dev Module
Adafruit NeoPixel by Adafruit

【準備】
配線不要

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

#include <Adafruit_NeoPixel.h>

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

#define MATRIX_WIDTH 5        //LED Matrix 横方向の数
#define MATRIX_HIGH 5         //LED Matrix 縦方向の数
#define ALLCOLOR 8            //全8色パターン

  uint32_t ArrayColor[MATRIX_HIGH];
  uint32_t OrderColor[ALLCOLOR];        //黒を含めて全8色

void setup()
{
  //カラーパレットの作成
  OrderColor[0] = pixels.Color(0, 0, 0);                                 //黒 (無発色)
  OrderColor[1] = pixels.Color(BRIGHTNESS, 0, 0);                        //赤
  OrderColor[2] = pixels.Color(0, BRIGHTNESS, 0);                        //緑
  OrderColor[3] = pixels.Color(BRIGHTNESS, BRIGHTNESS, 0);               //黄
  OrderColor[4] = pixels.Color(0, 0, BRIGHTNESS);                        //青
  OrderColor[5] = pixels.Color(BRIGHTNESS, 0, BRIGHTNESS);               //紫
  OrderColor[6] = pixels.Color(0, BRIGHTNESS, BRIGHTNESS);               //水
  OrderColor[7] = pixels.Color(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);      //白

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

void loop()
{
  //カラーオーダー変更のためのループ
  for (int c = 0; c < ALLCOLOR; c ++)
  {
    //新しいカラーオーダーテーブルを作成する
    //全8色(0から7パターン)なので、8を超える場合8で割った余りをカラーオーダーにする
    ArrayColor[0] = OrderColor[(c + 0) % ALLCOLOR];
    ArrayColor[1] = OrderColor[(c + 1) % ALLCOLOR];
    ArrayColor[2] = OrderColor[(c + 2) % ALLCOLOR];
    ArrayColor[3] = OrderColor[(c + 3) % ALLCOLOR];
    ArrayColor[4] = OrderColor[(c + 4) % ALLCOLOR];
  
    pixels.clear();

    //縦軸の計算のためのループ
    for (int y = 0; y < MATRIX_HIGH; y ++)
    {
      int offsety = y * MATRIX_WIDTH;

      //横軸の発色のためのループ
      for (int x = 0; x < MATRIX_WIDTH; x ++)  
      {
        pixels.setPixelColor(x + offsety, ArrayColor[y]);
      }
    }
    pixels.show();
    delay(WAIT_MS);
  }
}
結果

Nexpixelが色変化しました。

創作物

WS2812を使ったゲーム

同じ色のブロックを4個連結させると消える有名なゲームです。
ESP-C3-C3FH4には 5×5 のWS2812とQwiic コネクタがついているので、WS2812はゲームのモニタとして、QwiicにはI2Cのコントローラを接続して操作しています。

コメント

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