Seeed Studio XIAO ESP32C3ファーストタッチ!

このエントリはSeeed UGアドベントカレンダー2022の12月20日の記事となります。

先日、Seeed Studio XIAO(以降XIAO)シリーズであるSeeed Studio XIAO ESP32C3(以降XIAO ESP32C3)を購入しましたので、そのファーストタッチということで機能を確認してみたいと思います。自分はスイッチサイエンスさんで購入をしました。同時にSeeed Studio XIAO nRF52840 (Sense)も購入しました。

Seeed Studio XIAO ESP32C3www.switch-science.com

XIAO ESP32C3の大きな特徴としては他のXIAOの仲間であるものと大きく違い2.4 GHz WiFiが使用できる点かと思います。XIAO nRF52840を使用したものもありますが、こちらの通信機能はBluetoothのみ対応、それに比べるとXIAO ESP32C3WiFiも使用可能という点が大きく異なります。XIAOの小さなボディ!に通信機能!これはかなりの用途があるのではないでしょうか。ちゃんと技適にも対応していますのでご安心を。

WiFiを使用するため、アンテナを接続することできるようになっています。本体を購入するとこのアンテナも付属してきます。

https://d2air1d4eqhwg2.cloudfront.net/markdownx/fb0146a4-c83d-4862-bdac-bf8f6f9b7cb2.png

スペック

以下のリンクから詳細を確認してもらえればいいのですが

wiki.seeedstudio.com

基本的なスペックをまとめるとこんな感じ

  • 最大160MHzで動作する32bit RISC-Vシングルコア・プロセッサESP32-C3を搭載
  • WiFiIEEE 802.11b/g/nプロトコルに準拠。ステーションモード、ソフトAPモード、ソフトAP+ステーションモード、プロミスキャスモードに対応
  • BluetoothBluetooth 5およびBluetooth meshの機能をサポート
  • ディープスリープ時の消費電力は約43μA
  • 400KBのSRAMと4MBのフラッシュメモリーを内蔵
  • 超小型→20x17.5mm
  • インタフェース:1xI2C、1xSPI、1xI2S、2xUART、11xGPIO(PWM)、4xADC、1xJTAGボンディングパッドインタフェース

Arduino IDEでの設定

では、PCにUSBケーブルで接続して設定をしていきます。USB Type-C接続なのもいいですよね~

続いてArduino IDEを起動します。今回はArduino IDE 2.03での設定となります。

まずは、メニューから【ファイル】→【基本設定】を選択し、【基本設定ダイアログ】の下部にある【追加のボードマネージャのURL】の入力ボックスに以下のURLを入力して、【OK」ボタンをクリックして設定を終了させます。

追加のボードマネージャのURL

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json

追加のボードマネージャのURLの設定が終わったら、画面右のボードマネージャーを開き検索ボックスにesp32を入力をして、絞り込みを行います。そして、表示されたesp32のパッケージの【インストール】ボタンをクリックします。パッケージのインストールが完了すれば、使用可能なのかなと思うのですが、ボードが誤認されることもあるようです。

自分の場合には画面の上部にあるボードやUSBポートの選択にそのままではXIAO‗ESP32C3の表記が出てこず、ESP32S3 Dev Moduleと認識されているようです。どうもデフォルトでこの認識がされる模様です。

そこでメニューの【ツール】→【ボード】→【esp32】→【XIAO ESP32C3】を選択します。これでボードの認識が正常なXIAO ESP32C3になります。

この作業後には、アプリ上部のボード選択のダイアログからもXIAO‗ESP32C3が選択できるようになります。ちょっとだけ面倒。Arduino IDE 2系以外ではもう少し簡単なのでしょうか。

ボード情報を確認すると以下のようになっているので、これが関係しているのかも?

これにて設定は完了です。

まずはLチカ

最初なのでまずはLチカをテストしてみようかなと思います。【スケッチ例】からBlinkをロードして、コンパイルをしてみると…以下のようなエラーがでます。

エラーメッセージをみるとLED‗BUILTINがないとのこと、ということは…そうXIAO ESP32C3には本体にテスト用のLEDが存在しないようです。OutピンにLEDをつける必要がありますね。他のXIAOシリーズに比べると初期のテストがちょっと面倒…まあ、LEDをつけるだけにこの機種を選ぶ人なんていないのでいいのかもしれませんけど。

このエラーを回避するにはLEDをOutピンに設定することで回避可能です。今回はLED_BUILTINの代わりにledという変数に入れ替えています。D10ピンを使用しています。

// define led according to pin diagram
int led = D10;
 
void setup() {
  // initialize digital pin led as an output
  pinMode(led, OUTPUT);
}
 
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on 
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off
  delay(1000);               // wait for a second
}

無事に書き込みを行うことができました。

実際にLEDはつけてないですけど、まあうまく動くでしょう😁

ネットワーク機能を使ってみる

Lチカも終わったでの今度はネットワーク機能のテストを行ってみましょう。

以下を参考にしてみます。

wiki.seeedstudio.com

以下のコードをSeeed Wikiからコピーして使っていきます。こちらのコードは実行時に存在するSSIDのリストをスキャンして表示するというものです。

サンプルコード

#include "WiFi.h"

void setup() {
  Serial.begin(115200);

  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Serial.println("Setup done");
}

void loop() {
  Serial.println("scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0) {
    Serial.println("no networks found");
  } else {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");
      delay(10);
    }
  }
  Serial.println("");

  // Wait a bit before scanning again
  delay(5000);
}

設定が問題なければ、特に問題なくコンパイルが行われ

書き込みが完了します。

書き込み後は自動的に実行されます。USBシリアルの機能を使ってシリアルモニタ上に情報が出力が行われます。

続・通信機能

先ほどはSSIDの検出でしたが、次はHTTP通信を行ってみたいと思います。こちらはArduino IDEのスケッチ例にあるbasicHTTPClient.inoを使用しますが、一部HTTPSの残骸等があるのでそれは削除しました。

また接続先は以下となっていて、接続するとHTMLが表示されます。

example.com

表示されるHTML

変更したbasicHTTPClient.ino

#include <Arduino.h>

#include <WiFi.h>
#include <WiFiMulti.h>

#include <HTTPClient.h>

#define USE_SERIAL Serial

WiFiMulti wifiMulti;

char* SSID = "MY_SSID"; //接続するSSID名へ変更
char* PASSWORD = "MY_PASSWD"; //接続するSSIDのパスワードへ変更

void setup() {

    USE_SERIAL.begin(115200);

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }
    wifiMulti.addAP(SSID, PASSWORD);
}

void loop() {
    // wait for WiFi connection
    if((wifiMulti.run() == WL_CONNECTED)) {

        HTTPClient http;

        USE_SERIAL.print("[HTTP] begin...\n");
        http.begin("http://example.com/index.html"); //HTTP

        USE_SERIAL.print("[HTTP] GET...\n");
        // start connection and send HTTP header
        int httpCode = http.GET();

        // httpCode will be negative on error
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                USE_SERIAL.println(payload);
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
    }
    delay(30*1000);
}

終わりに

今回は今年発売されたXIAO ESP32C3を使用してみたという内容でした。最初にも少し書いたのですがXIAOの小さなボディにWiFi通信ができるというのは非常に魅力的な製品になっているかなと思います。個人的に残念に関したのは本体にテスト用のLEDがなかったことかなと思います。これさえあればLチカからすんなりネットワークの機能へと進んでいけるのになあという感じでしょうか。些細なことかもしれませんけど。

ほかにもBluetoothの機能もあったりするのでこれはかなり面白いデバイスかなと思います。

XIAO nRF52840も購入しているので、今後こちらも触ってみます。

参考リンク

wiki.seeedstudio.com

lab.seeed.co.jp

lab.seeed.co.jp

追記

正式名称からはSeeeduinoの表記は消えてしまったんですかね。ArduinoIDEで初期のXIAOはSeeeduinoという名称が残っているようですが、最近はSeeed Studio XIAOという表記になっているので、変わったのかなと思ってしまいました。

/* -----codeの行番号----- */