ESP8266-01の接続(その3)

Arduino Pro Mini 3.3V, 8MHz から、EASP8266-01を経由してWiFiに接続するにあたって、いくつかの条件を満たしたいと考えていました。

  1. Arduino Pro Miniと、ESP8266との間は、デフォルトのまま、115200 baudのシリアル通信速度で通信したい。
  2. この本来のシリアル通信の他に、FTDI経由で Arduino Pro Miniに色々なコマンドを打ち込んだりして、ESP8266との通信(WiFi通信)をインタラクティブに実験したい。そのため、2つめのシリアル通信ポートをSoftwareSerialのライブラリを使って実現したい。
  3. Arduino Pro Miniの本来のシリアル通信は、ATmega328Pのデバイスに搭載されているハードを使っているので、115200 baud以上の通信でも問題ないが、SoftwareSerialのライブラリのシリアル通信では、このスピードが出ないという記事が沢山投稿されている。せいぜい9600baud程度が実用的な速度という記事もあり(8MHz のArduinoに於いて)、とても 115200 baudを期待することはできそうにも無い。
  4. FTDI経由のWiFi実験用、インタラクティブな操作(シリアル入出力)は、9600baud程度でも問題ないと思われる。
  5. Arduinoにプログラムを書き込むときには、FTDIから高速で書き込みたい。

このような条件を、Arduinoへのプログラム時と、プログラム後の実行時で、FTDIの接続を変更することにより実現することにしました。

【Arduinoへのプログラム時】

接続は、下図の通り、FTDIのTXをProMiniのRXI, FTDIのRXをProMiniのTXOに接続し、USBからの電源は、FTDIへの電源供給のみとして、Pro Miniは、ESP8266との接続を考慮して、別電源の3.3Vから取っています。(もちろん、GNDはFTDIとPro Miniの間で接続しておく必要があります)

Pro Miniの基板端には、FTDIのピン配列に合わせたピンが出ていますが、下の写真のように、プロとボードの接続を使いたかったため、このFTDI用のピンは使わず、側面にあるTXO端子(D0), RXI端子(D1)のピンにジャンパーで接続しています。

なお、FTDIからのDTR信号をProMiniのDTRピン(GRNピン)に接続した場合、Pro Miniの基板内で、下記のように 0.1uFを経由してリセット端子に接続される事により、ATmegaへの書き込み時に自動的にリセットが掛かるようになっています。うまく考えられているなぁ、と感心します。

ただ、ArduinoのIDEからスケッチが書き込まれる直前(コンパイルが終わった直後)に、タイミング良く、Pro Miniに搭載されているリセットスイッチを、チョンと押してやると、書き込みは正常にできますので、このDTRの接続は必須ではないです。(チョン・・のタイミングは、ちょっと気を使いますが・・・)

imageDSC09727

これで、FTDI経由でPro Miniのプログラミングが出来ることを確認できました。

次は、SoftwareSerialライブラリを使った、二つ目のシリアルポートを構築したスケッチを用意して、プログラムが終わった時点で、FTDIの接続を変更して、二つ目のシリアルポートを、「シリアルモニタ」に繋いでみようと思います。

この切替えを、少しでも楽にするために、最小限の接続 (TXとRXだけ)で、FTDIをつなぎたかった訳です。 (残念ながら、手元にFTDI が一つしか無いため・・・。もう一つ、買う必要あり・・・)

【二つ目のシリアルポートを構成する】

ESP8266-01の接続(その2)

【ESP8266 ESP-01の回路・基板もう少し調査】

前回の確認で、やはりリセットが怪しいので、もう少し基板内でRESETピンがどのように接続されているのかを確認してみたいと思います。

ESP-01の回路図は、今のところネット上を探してもそれらしき、ピッタリするものが見つからないので、版下の情報から類推してみることにしました。

image

この基板レイアウト図上では、RESETピンは、”GPIO16”と記載されていますが、これについてはもう少し後で調べてみることにします。このピンからの配線を「むりやり」たどってみると ESP8266EXのICの、32ピン(EXT_RSTB)に直接つながっているように見えます。途中にプルアップ抵抗や、POR用のコンデンサ等は見当たりません。

EXP8266のデータシートver 4.9) を見ても、何故か、リセットに関する詳細な記載は見当たりません。、

image これだけ・・・

ただ、Version 4.9のデータシートには、8ピン(XPD_DCDC, GPIO16, Deep-Sleep Wakeup)を EXT_RSTBに接続する必要があるとの記載があります。

image

多分、Deep Sleepからの復帰は、デバイスの初期リセットを掛けることによってのみ実現できるという事でしょう。そういう視点で上記の基板レイアウトの8ピンを確認してみたのですが、どう見てもこのピンはオープン(未接続)のように見えます。いずれにせよ、Deep Sleepに入ってしまった後は、RESETピンでデバイス全部をを強制リセッしてしまえば、復帰するという事でしょうから、未接続でも良いのかもしれません(となると、このピンの意味って何かあるのか・・・? よく分かりません) –> 後述【おまけ】で少しスッキリ・・・。

Power Onシーケンスに関して、こんな記事も見つけましたが、なんとなくピンと来ない説明です。

まぁ、私なりの結論としては、「このモジュール基板には、Power On Reset機能は搭載されていないため、ちゃんと、外部回路で構成してあげないとRESETが正常にかからない」 という事ですね。 現実の実験結果からも同じ結論ですけど。

【おまけ】

Wake Upに関するこんな資料がありました。Espressif.com (ESP8266の開発元)のサイトにあった、Low Power Solutionの説明です。

image

つまり、Deep Sleepモードからの復帰には、Automaticモードと外部トリガモードがあり、Automaticモードの時には、GPIO16 (XPD_DCDC)が EXT_RSTBに接続されている場合、Sleep時間が経過した後、このGPIO16の’L’レベルパルス信号(出力)がEXT_RSTBピン(入力)へ供給されて、デバイスがリセットされる・・・という事でしょうか。 ちょっと英語の読解力が不足していて、若干自信が無いですが・・・

GPIO16とEXT_RSTBが接続されていない場合には、Deep Sleepからの Automatic Wake Upは出来ないという事になるのでしょうね。

【次に続く】

ESP8266-01とArduino Pro Mini 3.3Vを接続してみた (その1)

WiFiのモジュール ESP8266-01と、Arduino Pro Mini 3.3V, 8MHzを接続して、ネットワーク経由で色々な遊びを始めてみることにしました。

【ESP8266-01モジュール】  (参考にさせて頂いたページ

ESP8266モジュールの中では最も小さくて端子数の少ないESP-01タイプで実験をしてみます。モジュール仕様はこのページを参考にしました。 これによると、なかなか強力なスペックです。

  • このモジュール単体でホストコントローラーとして動作可能
  • 2本のGPIOピンを直接センサー等に接続することも可能
  • I/Oは 3.6V耐圧なので、5V回路とは直接接続不可能。
  • 電源電圧は 3.3V
  • 初期ボーレートは 115200 baudに設定されている
  • TCP/IPプロトコル・スタックを内蔵
  • 802.11b/g/n対応
  • 通常動作時の消費電流は 70mA程度
  • ピーク時の消費電流は 300mA程度
  • パワーダウン時の消費電流は、 10uA以下
  • 802.11b時のRF出力は +19.5dBm
  • WPA, WPA2対応

このモジュールに搭載されているICは、ESP8266EX(WiFiコントローラー)と、Berg MicroのSerial EEPROM:25Q80ASSIG)の2つ。

Wed Sep 21 21-25-02

このICがモジュールの肝となるデバイスですね。(仕様書はこちら

Wed Sep 21 21-22-57

このBerg MicroのICは型名から見ると、

  • 3.0V Serial Flash with 4KB uniform-sector, dual and quad I/O
  • 8Mbit (1024kx8)

という事がわかります。(メーカーは違いますが仕様書はこちら)。 このEEPROMに8266用のFirmwareが保存されているという事ですね。

ESP8266の消費電流がピークで 300mAも必要というなので、Arduino Pro Miniに搭載されている3.3V レギュレーター(Pro Miniの回路図上に最大150mAという記載があります) や、FTDIに搭載されているレギュレーターでは足りません。

まずは、実験なので手元にある、プロトボード用の電源モジュールを使って電源を供給することにします。

DSC09701

 

【まずは、シリアル通信の確認から】

まずは、Arduino Pro Miniは接続せず、FTDI (3.3V)を使って、ESP8266とのシリアル通信を確立させ、ATコマンドが動作するかどうかの確認からはじめます。本当は、RESETも、CH-PDも独立でPULL-UPしておく方が良いと思いますが、プロトボードの接続を楽にするために、サボりました。

Picture of ESP8266-01 Pins

ESP8226_01_BootOptions.jpg

ESP-01のモジュールのGPIOピン二本の設定を変えることにより、通常ブートモード(内部のEEPROMからの起動)と、EEPROMへの書き込みモードの切り替えができます。まずは、普通に立ち上げる確認なので、GPIO-0は、Hにしておきます。(ネットの情報だと、GPIO-2はオープンのままにしてある例もありますが、とりあえず、GPIO-0と直接繋いでおきます)

CH-PDのピンは、8266をパワーダウンモードに切り替えるための信号なので、通常動作モードのときには、Hにしておかないといけません。

RESETピンの扱いがちょっと自信ないです。ESP8266-01モジュールの回路図をネット上で探しましたが、現時点、それらしき物は見つかっておらず、この基板内で ESP8266デバイスのリセットピンが、どのように処理されているのか分からないためです。単純に端子に出てきているだけかもしれません。

【接続図】

image

FTDIとの接続は、シリアル通信の向きを間違えなければ大丈夫でしょう。もちろん、FTDIの電圧セレクターは、3.3Vにしておきます(間違えると ESP8266が死ぬのでは・・と思われます・・)

DSC09703

 

【TeraTermで接続】

まずは、定番のターミナルソフト、TeraTermで接続してみます。TeraTermを起動し、以下の設定をします。

  • FTDIの接続されているUSBに割り当てられたシリアルポート番号を指定
  • 115200baud, 8bit, non-parity, 1-stop bit, flow制御=none
  • 送信の改行コードは”CR+LF”
  • 文字コードは UTF-8 (不要かも)

電源アダプターからの電源を供給し、USBも接続してみると、文字化けした画面の後に、”Ready”という表示が出るときがあったり、こんな画面が出て止まってしまう時があったり・・・(追記:後で調べてみたら、この表示は 76.8kbpsで出力されているものらしい・・・でも何故、表示されるんだろう・・?)

image

やっぱり、ESP8266へのリセットが正しくかかっていないと思われ、とりあえず強制的に、ESP8266モジュールのRESETピンをGNDに落として見ると、ぐちゃぐちゃに文字化けした表示の後に、必ず、”Ready”が表示されるようになりました。

image

ここで、”AT”と叩いてみると、めでたしめでたし、”OK”表示が出ました。

image

試しに、GPIO-2の接続を外してオープンにしても、同様に動作したので、当面GPIO-2はオープンのままにしておくことにします。

それにしても、なぜ、リセット後の文字が激しく化けるのか?スッキリしなかったので、色々試してみましたが、全然だめ。ネットで色々探してみたら、「リセット後の通信は76.8kbpsで行われる」という記述がありました。手元に76.8kbpsのターミナルソフトが無いので、事実かどうか調べることは出来ませんが、まぁ、readyの所からは、115200baudで正常に通信できるので、今の時点ではこれでOKとしておきます。(なぜ76.8kbpsになっているのか、理由は全く分かりません)

【ArduinoのIDEからシリアルモニタで接続】

やはり、リセット直後の文字化けは起こりますが、CR/LFにした上で、”AT” + Enterを送信すれば、ちゃんと下記のように “OK”が返ってきました。めでたしめでたし。

image

とりあえず、これで、ESP8266-01とのシリアル通信が出来ることは確認できました。

試しに、ATコマンドを幾つか確認し、我が家のWIFIアクセスポイントにも接続してみましたが、問題なく一発で接続されました。このATコマンドの詳細は次回に・・・。

image

【次に続く】