こんにちは、岸田です。
少し前になりますが、スイッチサイエンスからもESP-WROOM-32の開発ボードであるESPr® Developer 32が発売となりました。その時のブログ記事はこちらです。
さて、今回は、この開発ボードにのっているESP-WROOM-32の機能などをかんたんに紹介したいと思います。といっても、Wi-FiはBluetoothにはほとんど触れません!無線機能以外の部分に注目して機能紹介をするので、無線がわかる方もわからない方もESP-WROOM-32をもっと使ってみましょう!という企画です。
目次
- タッチ検出機能を使ってみる
- 音を出してみる
- 通信用のピン配置を変えてみる
必要なもの
- ESPr Developer 32本体 × 1
- USB Aオス -microBオス ケーブル × 1
セットアップ方法
スイッチサイエンスのおまけWikiに、「ESP-WROOM-32のセットアップについて」という記事があるので、ここを参照しましょう!余談ですが、こういった少し長い説明書やちょっとしたTIPSはここのWikiに書かれることが多いので、ふらっと内容を見てみると結構面白いことが書いてあるかもしれません。
何ができるのか?
ざっくりと機能を述べると、基本的なシリアル通信やAD変換等の他、DA変換やタッチ検出、Wi-Fiに加えてBluetoothというなんとも盛り沢山な内容となっています。これもまた、もう少し詳しいことについてはWikiの方で「ESP-WROOM-32に関するTIPS」としてまとめているので、これもぜひ参照してください!
ただ、あまり技術の方に踏み込んでもわかりにくいところがあるとおもいますので、今回は無線以外の部分について特徴的なところをピックアップして機能紹介を載せていこうと思います。
タッチ検出機能を使ってみる
ESP-WROOM-32には、タッチ検出機能がついています。かんたんに言うとピンを触ったかどうかを判定できる機能ですね。ちょいと試してみるために、以下のスケッチを書き込んで、シリアルモニタを開いてみてください。
int count = 0; void touchedT0() { Serial.print(count); Serial.println(": T0 touched"); count++; } void setup() { Serial.begin(115200); touchAttachInterrupt(T0, touchedT0, 10); } void loop() { }
「4」と印刷されたシルクの横のピンに触れてみると、シリアルモニタに文字がつらつらと出てくることが確認できましたか?
なんともかんたんにタッチ判定が動きましたね。少しだけ詳しく説明すると、触ったときのピンのノイズを見ているとかではなく、ちゃんとタッチ検出として設定されたピンに対して検知用の信号を流しているのです。
音を出してみる
タッチ検出ができたので、なんちゃってタッチパネルキーボードを作ることができそうです。ところで、音を出すということで真っ先にtone関数を思い出すのではないでしょうか?実は、ESP-WROOM-32ではtone関数を利用したスケッチはコンパイルエラーが出てしまうのです……
といっても、実はほぼ同じ機能を持つledcWrieNoteという関数ががあるので、それに代替させてしまえば良いでしょう。とりあえず、その関数を使ったコードを見てみます。
#define LEDC_CHANNEL_0 0 #define LEDC_TIMER_13_BIT 13 #define LEDC_BASE_FREQ 5000 #define LED_PIN 5 void setup() { ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT); ledcAttachPin(LED_PIN, LEDC_CHANNEL_0); ledcWriteNote(LEDC_CHANNEL_0, NOTE_A, 4); } void loop() { }
ちょっと戸惑うのが、ledcAttachPinという関数です。かんたんに言いますと、内部に信号生成器が0~15の16個あるので、ledcSetup関数で使う生成器の番号と各種設定を指定します。その後に、その生成器の信号をどこのピンに出力するのかという手順を踏まなければならないという仕様になっているのです。つまり、ledcAttatchPin関数は内臓の信号生成器を物理的なピンに配線する関数ということです。
最後に、ledcWriteNote(ch, NOTE_A, 4);
と関数を呼ぶと、先程ch番号の生成器に接続されたピンに、ラの音を第4オクターブの高さで鳴らすことができます。つまり440 Hzの矩形波が出力されます。お手持ちのブザーなどを5番ピンに接続すると、音が聞こえてきたのではないでしょうか。
これと、先の「触ったら関数が呼ばれる」プログラムを組み合わせると、タッチ式キーボードなんてのが作れそうな気がしますね。
通信用のピン配置を変えてみる
さて、よく使うSPIやI2Cなどの機能ですが、これはなんとピン配置に制限がほぼありません!Arduino UNOなどでは通信するには特定のピンと接続する必要がありますよね。例えば、シリアル通信ならD0とD1、I2CならA4とA5、SPIならD10~13(Arduino UNO系)という感じです。先程「内蔵のPWM信号生成器を物理的なピンに配線する関数がある」といった内容の話も、これと同じことです。
ESP-WROOM-32では内部的に配線を入れ替えるという機能が存在するので、言ってしまえば適当につけたセンサなどに対して正しいピン設定をあとからプログラミングすることが可能です。なので、このような横着もできます(このスケッチはGithubにてご覧ください)。
注意点としては、一度プログラムを書き込んだ状態で部品を接続しないと、電源ピンなどに逆電圧がかかる可能性がある点です。これだけは特に注意しましょう。また、推奨される配置というのも当然あり、そのピンを利用する場合は前述の「内部的に入れ替える回路」を通さないため、高速な通信では安定するということのようです。トレードオフというわけですね。
じゃあいったいどこでこの機能使うべきなのか?という疑問に突き当たりますが、なんと、I2C通信に関しては「推薦されるピン」というのがなく、全く自由に利用できることになっています。なのて、基板の配置などで困ったときは通信用のピンの場所を変えてしまう、ということもできるわけですね。
というわけで、無線以外の機能について少しマニアックな部分ですが紹介をしてみました。元々ちょっと難易度が高い商品かもという印象はありますが、こういったユニークな機能もあるので、無線がわからなくても遊べるのだ!という雰囲気を伝えることができれば良いかなと思います。機会があれば、無線部分や他の機能についても紹介する記事をお届けしたいと考えているので、是非皆様一度ESPr Developer 32を購入して何か製作してみましょう!