Top/電子工作/ESP32

ESP32

  中国の Espressif Systems 社が作成したマイクロコントローラ(あるいは SoC: System on Chip)で、次の特徴を持つ。

開発用ボード

  ESP32用の開発ボードはいくつかある。今回は、Switchscience の ESPr Developer 32 を使用する。
   中国の安いボード(ESP-32S ESP-32 Development Board,以下 中国ボード)を買った。これを使ったときの違いも書く。

使用前の準備

  1. ピンヘッダの半田付け
    まずはこれから。これをしないと、プロトタイピングできない。

  2. Arduino IDE のダウンロードと初期設定
    • ポータブルな環境にするには、"Windows ZIP file for non admin install"を選択する。
      もちろん献金してよい。しかし、献金しなくても "Just Donwload" ボタンでファイルを取得できる。
      1.8.19 が最新版(2022-08-19 (金) 11:26:12時点)

    • Switchscience の解説ページを参照して、Arduino IDE で ESP32 ボードを使えるようにする。
      • ファイル > 環境設定
        設定タブの「追加のボードマネージャーのURL:」に
        https://github.com/espressif/arduino-esp32/releases/download/2.0.4/package_esp32_index.json
        を書き込み OK をクリックする。

        ※ github のArduino-ESP32を参照し、最新の安定版(2022-08-19 (金) 11:26:12時点で 2.0.4) を選ぶ。安定版のページの package_esp32_index.json の URL を書く。
        ※ ファイルは次の場所に格納されるようである。
        C:\Users\[ユーザー名]\AppData\Local\Arduino15\packages\esp32\hardware

      • ツール > ボード:"Arduiono/Genuin Uno" にマウスのポインターを合わせ、
        現れたタブからボードマネージャを選んでクリック。窓に、ESP32 を入力すると、
        "esp32 by Expressif Systems"が現れる。これをクリックし、「インストール」をクリックする。
        ボードの定義がダウンロードされてインストールされる。

        中国ボードの場合には、CP2102 というチップを使ってパソコンと通信する。そのドライバは
        自動的にインストールされない。そのため、対応したドライバをあらかじめインストールする。
        Silicon labsのページから、適切なものをダウンロードし、 展開してインストーラを起動すれば
        導入できる。

      • ツール > ボード:"Arduiono/Genuin Uno" にマウスのポインターを合わせ、
        ESP32 Dev Module を選択する。

      • ツール > シリアルポート
        それらしい COM3 などを選択する。選択しないと通信できない。

      • コンパイルに時間がかかることへの対策
        このままだと、コンパイルにかかる時間が尋常ではない。
        Qiita Arduino IDE でESP32のコンパイル時間を短縮する方法を参照して、
        (1) バイナリの場所を固定、(2) ccache を使用するように設定する。

  3. はまったところ
    1. コンパイルがエラーで止まる。
      Mc Afee のウィルス対策ソフトのリアルタイムスキャンが影響している。これを止めると、コンパイルできる。

    2. ツール > シリアルポートで選べない。
      USB Type B micro のコネクタが深く刺さっていないと、COMポートが認識できない。
      ちなみに、シリアル通信のデバイスドライバは、Windows が勝手にインストールしてくれる。

    3. プログラムの書き込みに失敗する
      主に中国ボードの場合
      → ボードの BOOT ボタンを押し続ける。(やっと解決。2022-08-21 (日) 09:18:00)
      • シリアルモニタが開いていたら、これを閉じる。
      • 繰り返してみる。
      • 通信速度を 115200 に落としてみる。
      • グラウンドになっているところを指で触ってみる。
        私の環境では再現性なくときどき失敗していた。USBコネクタの金属部分に触れると調子が良くなる。

    4. 永遠にメッセージを吐き続ける
      rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
      configsip: 0, SPIWP:0xee
      clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
      どうやら、特定のPINが pull up あるいは pull down されていると生じるらしい。(情報源
      • 対策1: 12番ピンに何か接続されていたら、これを外してプログラムを流しこむ。
        SPI に 12番が使われることがあるが、別の番号にしてみることが考えられる。

      • 対策2: GNDの接続をチェックする。
        GND が浮いていると同様の現象が発生することがわかった。GND がきちんと接続されているかチェックする。


    • センサの値が変
      mgo-tec電子工作によると、消費電力は瞬間的には結構大きいらしい。 おそらくそれが原因で、センサーの値がきちんと取れないことがある。電源強化をすべきで、ネットでは、レギュレータを交換した、という話もある。

テストプログラム

  接続できたと思ったら、次のプログラム(Arduino ではスケッチと呼ぶ)を試してみる。

  1. Arduino としての機能
    次のスケッチを実行し、ツール > シリアルモニタ でシリアルモニタ(別枠の窓)を表示させる。
    右下の通信速度を、スケッチ中の 115200bps に変更する。
    void setup() {
      Serial.begin(115200);
    }
    
    void loop() {
      Serial.println("Hello World.");
      delay(1000); 
    }
    うまくいけば、1秒(1000ミリ秒)に1回、"Hello World." と表示される。

  2. Wi Fi としての機能
    ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ例から) Wi Fi > Wi Fi Scan を選択する。
    次のスケッチが表示される。
    #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);
    }
    うまくいけば、無線LANの情報が表示されるはずである。

磁気センサ(内蔵, ホール素子)

     ▼(ひらく)...

タッチセンサ(内蔵)

     ▼(ひらく)...

LEDを光センサとして使う

     ▼(ひらく)...

ADC(Analog-Digital Converter)でより良い精度でデータを得る

     ▼(ひらく)...

SPI と I2C (プルアップ抵抗について)

     ▼(ひらく)...

I2C で気圧センサ DPS310 の値を読みとる

     ▼(ひらく)...

SPI で気圧センサ BME280 の値を読みとる

     ▼(ひらく)...

NTP で時刻を取得する

     ▼(ひらく)...

IFTTT を利用する

     ▼(ひらく)...

Google スプレッドシートに記録する(未完)

     ▼(ひらく)...

Smart Config

     ▼(ひらく)...

Bluetooth と Bluetooth LE 周り(未完)

     ▼(ひらく)...

サーボモーターSG90

     ▼(ひらく)...

デュアルコアの活用

     ▼(ひらく)...

ESP32-CAM

     ▼(ひらく)...

添付ファイル: fileTEST.ino 478件 [詳細]

トップ   編集 凍結 差分 添付 複製 名前変更 リロード   新規 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-08-24 (水) 07:12:09