hogehoge, world.

米国カリフォルニアのソフトウェアエンジニアがIT・自転車・音楽・天体写真・語学などについて書く予定。

ESP-WROOM-02(Arduino)によるWiFiネットワーキング (7) ~ 自作アプリケーションのための基本回路

前々回ESP-WROOM-02を初期状態のまま動作させるためだけの最低限の回路を説明したが、今回はさらに自作アプリケーションを動かすための基本回路を紹介する。ただし、これはあくまで私が私のアプリケーションで使い回すための「ぼくのかんがえた最強の基本回路」であり、誰にとっても・どんな場合でもベストだとは限らない。まずはこれを入口にしてもらったとしても、最終的には自分自身の目的やスタイルに合った「最強」を編み出してもらいたいと思う。

この「最強基本回路」の見た目と回路図はこんな感じだ。これを私が「最強」と呼ぶには理由がある。ひとつは抵抗等のパーツを動く限りで最低限まで省いていること(経験者は眉を顰めるかもしれない)。もうひとつはおそらく世界唯一「最強LED」を備えていること。以下順に説明していこう。

ブレッドボード図

 

f:id:tomoto335:20160601230158p:plain

写真

f:id:tomoto335:20160602013650j:plain 

(写真の中央周辺の黒/赤/黄/茶の配線はアプリケーション回路なので基本回路外である。また電源回路はACアダプタージャック→5V→3.3Vと二段で降圧しているので図と少し違う。あとオシロスコープのフックを引っ掛けるためジャンパー線のリングを幾つか出している。)

回路図

f:id:tomoto335:20160601232941p:plain

回路の各要素の説明

  1. 電源(左上): 前々回紹介したのと同じ、スイッチングレギュレーターまたは三端子LDOレギュレーターで3.3Vを得る。
  2. USBシリアル変換モジュール(下): これも前々回紹介したのと同じ。開発中にプログラム書き込みとシリアル通信によるデバッグのために接続し、実運用時には取り外す。
  3. 電流測定用抵抗(R1): 第三回で話したように、Arudinoを使う以上、消費電力を測定してニヤニヤしないとおもしろくない。そこで、このように電源ラインに小さい抵抗を入れておき、電圧降下をオシロスコープで見て電流が測定できるようにする。私は抵抗値を1Ω±1%にして1mA=1mVになるようにしている。ESP-WROOM-02の電源が最大で3Vあたりまで下がることになるがまあ問題ない。万が一問題があればジャンパー線でショートすればよいし、そもそも消費電流に興味がなければ抜いても構わない。
  4. 3V3とEN: 両方とも電源につなぐ。
  5. リセットスイッチ(Reset SW): 文字通りリセットスイッチ。プルダウン抵抗は入れていないが問題ないと思う。
  6. IO15: 起動時の動作モードを指定。マニュアルにLOWにしろとあるのでGNDに接続する。ベタで接続したらプログラム書き込みモード時に熱くなった(何かの出力が出てる?)のでプルダウン抵抗(R2)を介す。
  7. IO2: 起動時の動作モードを指定。マニュアルに開放(dangled)かHIGHにしろとあるので、お言葉に甘えて開放にしておく。お行儀よくHIGHに接続、とかやりだすとプルアップ抵抗が必要になる(プログラム書き込みモード時には出力になる)のでめんどい。
  8. IO0: 起動時の動作モードを指定。HIGHで通常のプログラム実行モード、LOWでプログラム書き込みモードで起動する。プログラム実行が開始すると普通のGPIOになる。後述の起動モードスイッチと最強LEDをつなぐ。
  9. 起動モードスイッチ(Mode SW): IO0とGNDの間に入れて、これを押しながらReset SWを押すとプログラム書き込みモードになるようにする。またアプリケーションから汎用の入力スイッチとしても使える。プルダウン抵抗は入れなくて大丈夫っぽいので省略。
  10. 最強LED: IO0と3V3の間に抵抗入りLEDを挟む。この機能は後述。
  11. Deep Sleep復帰用配線: Deep Sleep機能を使った場合、指定時刻にSleepから復帰するための信号がIO16から出ることになっているので、これをRSTに接続しておく。ここは抵抗(R3)が必要。ないとReset SWを押したときにショートしてしまう。
  12. パスコン: 電源とGNDの間にコンデンサ(所謂パスコン)を入れるのが常識らしいが、なくて困ったことがないので省略。入れたければ3V3とお向かいのGNDの間にネックレスのように0.1μFを入れておけばよい。
  13. GPIO: これで普通に使える残りのGPIOはIO4, 5, 12, 13, 14の5本と、アナログ入力用のTOUT。もっと欲しければ回路にひとひねり必要。
  14. アプリケーション回路用スペース: ブレッドボードの真ん中~左の空いたスペースにアプリケーション回路を組む。(写真に写っているアプリケーション回路は5V, GND, IO12/IO13をサーボモーターに供給するための配線。)

最強LED

これはIO0と3V3の間に入れた抵抗入りLEDである。「抵抗入り」というのが重要で、本来LEDはかける電圧と流したい電流(得たい明るさ)から決まる抵抗を直列に入れる必要があるのだが、これは5Vをかけたときにほどよく光る大きさの抵抗が内蔵されている軟弱者用パーツである。3.3Vでも十分明るく光る。間違えてLED単体を直接つながないこと!

抵抗内蔵5mm赤色LED(5V用) OSR6LU5B64A−5V(10個入): LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

この抵抗入りLEDのもともとの目的は、IO0をMode SWが押されていない時にHIGHに吊るためのプルアップ抵抗なのだが、Mode SWがちゃんと押されていることがわかるように、ただの抵抗ではなく抵抗入りLEDを使ってみたのが始まりである。Mode SWが押されるとIO0をLOWに引き下げると同時にLEDが光るという寸法だ。

それだけのシンプルなギミックのはずだったのだが、動かしてみると他にも思わぬご利益があった。

  • プログラム書き込みモードになっている間、薄く光る。プログラム書き込みモードはMode SWを押しながらReset SWを押すことで起動するのだが、ボタンを押しそこなったりチャタリングが発生して操作にしくじることがよくある。プログラム書き込みモードになっているかは見ただけではわからないので、プログラムを書き込もうとして初めてなにかおかしいと気付く、なんてことが起こる可能性がある。ところがこの最強LEDを入れておけば、プログラム書き込みモードに入れたかどうかが一目瞭然であり、そのような間違いがなくなる!
  • なぜ薄く光るのか?オシロスコープでIO0の電位を測定してみると、プログラム書き込みモードの間、中途半端な電圧でクロックパルスが出ていた。ESP8266サポートフォーラムでもそれらしい発言があったが、結局のところ、このパルスが一体何者なのかはよくわからない。少なくともこのパルスのおかげで抵抗入りLEDに低い電圧がかかって薄く光るという結果になっている。
  • リセット時や電源投入時に一瞬光る。勝手にリセットがかかってしまった場合やDeep Sleepからの復帰時にも目で見てわかる。何気に便利。
  • Deep Sleepに入るときに1秒程光る。

なんだこの都合のよい副作用は、すげぇ!というわけで最強LEDと呼ぶことにした。

Arduino IDEから自作プログラムの書き込み

もともと入っていたストックソフトウェアをつぶして自作プログラムを書き込むのは、最初は若干の不安を感じるかもしれない。Brick化したらどうしようとか思うかもしれないが、まあ大丈夫と思ってよい。Arduino開発環境とのインテグレーションはしっかりしており、間違えてハマるような設定項目もない。手順は概ね次の通り。

  • https://github.com/esp8266/Arduino の説明に従ってBoard Managerに指定URLを追加する。これでESP8266用のSDK・ライブラリ・サンプルコード等が自動的にダウンロードされ、セットアップされる。
  • Arduino IDEのツールメニューからターゲットマイコンボードをGeneric ESP8266 Moduleを選ぶ。その他の設定はデフォルトのままでいける。Flash SizeはESP-WROOM-02の搭載量4M (3M SPIFFS)にするのが正解だが、SPIFFSを使わなければデフォルトのまま(実際より小さい)でも動くので、最初は気にしなくてもよい。
  • 「スケッチの例」にESP8266用のものが登場するので、適当に選ぶ。Lチカ等GPIOのテストをするなら普通のArduinoの例でもよいが、せっかくなのでESP8266のWiF機能を動かしてみよう。
  • Mode SWを押しながらReset SWを押し、プログラム書き込みモードに入る。最強LEDの薄い点灯を確認する。
  • Arduino IDEコンパイル&書き込みを行う。WiFi制御やTCP/IPスタックがコードに埋め込まれるので、書き込みには普通のArduinoよりかなり時間がかかる。
  • 書き込み完了すると最強LEDが消灯し、プログラムの実行が開始する。

サンプルコードは結構充実しているし、期待通りにすんなり動くので、なかなか感心。