余っているESP-WROOM-32を動かしてみた

部品箱の肥やしになっていたESP-WROOM-32を動かしてみました。

最新のESP32-WROOM32-32EはフラッシュROMが4倍の16MB載って値段は半分になってます・・・・。

値段を見ると相当昔に買ったことがわかると思います。左の基板はAliExpressで購入した変換基板です。タクトスイッチとピンヘッダ込み5セットで$3弱だったと思います。

これを組み立てました。最低限の端子を引き出して使うつもりなので、ピンヘッダをつけるのではなく、シリアルと電源のみ供給します。タクトスイッチの間にはIO0とEN端子をプルアップする(と思われる)10kΩのチップ抵抗を実装しました。USBシリアルモジュールは秋月で売っているCH340のモジュールです。これに電源電圧を3.3Vに落とすためのシリーズレギュレータを載せた基板を間に挟んでいます。

裏面にはEN端子とGNDの間に0.022uFのチップコンデンサをつけてあります。パワーオンリセットがうまく働くかはわかりませんが・・・。

開発環境の方はPCを更新したので環境セットアップからです。OSはもちろんいつものLinuxMint。IDEは横着なのでいつものarduino環境です。まずはLinux64bit用のIDEをダウンロードしてきて、書庫マネージャで解凍、ホームディレクトリにarduino-1.8.13ディレクトリを移動します。コンソールを起動して、

$ cd arduino-1.8.13/
$ sudo apt-get install python3-pip python-is-python3
$ sudo pip3 install pyserial
$ ./arduino-linux-setup.sh $USER
$ ./install.sh 

で環境セットアップします。指示通りにOSを再起動したら、Arduino IDEを起動して、「ファイル」→「環境設定」で「追加のボードマネージャのURL」に

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

を追加、ついでにエディタの文字の大きさを12から14に変更します。

環境設定を閉じたら、「ツール」→「ボード」→「ボードマネージャ」で「ESP32」を検索して、「esp32」をインストールします。

「ツール」でボードとして「ESP32 Dev Module」を選択します。その後、Upload Speedを 460800 に変更、シリアルポートを /dev/ttyUSB0 に変更すれば環境設定完了です。

スケッチ例で 01.Basics の中の ReadAnalogVoltage を開いて、

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(115200);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage = sensorValue * (3.3 / 4096.0);
  // print out the value you read:
  Serial.println(voltage);
}

と変更します。変更箇所はハイライトになっているシリアルの速度とvoltageの計算箇所です。

ダウンロードボタンを押す前に、IO0のタクトスイッチを押しながら、RESETを押して離したあと、IO0を離します。これでダウンロードボタンをクリックするとビルドと書き込みが行われます。
書き込みが終わって、「Hard resetting via RTS pin…」と表示されたら、RESETを押して離すと書き込んだプログラムが起動します。

これでSVP端子(ADC0端子、GPIO36)に触れるとノイズを拾って電圧が変動します。シリアルプロッタを起動して速度を115200bpsに合わせると、以下のようにグラフで確認できます。

同様に、GPIO36でエッジで割り込み検出を試みてみます。

#include <Arduino.h>
#define PIN 36

bool flag = false;
uint32_t micros0 = 0 ,micros1 = 0;

void IRAM_ATTR isr() {
    micros1 = micros0;
    micros0 = micros();
    flag = true;
}

void setup() {
    Serial.begin(115200);
    pinMode(PIN, INPUT);
    attachInterrupt(PIN, isr, FALLING);
}

void loop() {
    if (flag) {
        Serial.println(micros0-micros1);
        flag = false;
    }
}

動かしてみるとわかるのですが、スレッショルド付近でノイズがたくさん乗るのか、思ったような結果にはなりませんでした(笑)。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)