部品箱の肥やしになっていたESP-WROOM-32を動かしてみました。
値段を見ると相当昔に買ったことがわかると思います。左の基板は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;
}
}
動かしてみるとわかるのですが、スレッショルド付近でノイズがたくさん乗るのか、思ったような結果にはなりませんでした(笑)。