気の向くままに辿るIT/ICT/IoT
IoT・電子工作

ESP8266で電子工作・IoT

ホーム前へ次へ
ESP8266って?

ESP8266で電子工作・IoT

ESP8266で電子工作・IoT

2018/07/01

 ESP8266を使ってIoTガジェットを作るページ。

 電子工作を初めて1年ちょい、動作確認などでは、イーサネットシールドやESP8266、試作ガジェットとしては、2.4GHz帯を使うという意味では、nRF24L01+などを使っていましたし、ブラウザからの操作なども行なってきましたが、これまで作ったArduinoによる試作ガジェット含め、IoTを意識して作ろうと思い、このページを起こすに至りました。

 ESP8266/ESP8266EXは、中国勢Espressif Systems (Shanghai) Pte. Ltd.AI-Thinkerが製造するWiFiモジュールでSTA、AP、STA/APモードを備え、子機としてだけでなく、ESPボードやArduinoボードなど5個程度のデバイスからのアクセスが可能なアクセスポイントとしても、これら併用でも、なんなら、ArduinoボードのWiFiモジュールとしても機能するし、更には、マイコンも搭載しており、Arduino感覚でプログラムを書き込んで実行することも、書き込む手段の1つとしてArduino IDEを使うこともできるスグレモノ。

 これまでに複数の製品が登場しましたが、Espressif社開発のESP-WROOM-32に至っては、WiFiに加え、Bluetooth、これの省電力版BLE/Bluetooth Low Energyも実装、温度センサ、タッチセンサ、ホールセンサなども搭載されるに至り、メモリなどのスペックもArduinoボードよりもハイスペック。

 また、ATコマンド、SDK/Software Development Kit(ソフトウェア開発キット)、esptool.py(CLI)、ESP-IDFばかりでなく、PlatformIOやArduino IDEからもプログラム(スケッチ)のアップロードやシリアルモニタ上でのATコマンドの実行が可能。(ただし、ATコマンドとArduino IDEからアップしたスケッチは排他で後者実行後に前者を使いたい場合には、ファームウェアの書き換え/書き戻しを要します。)

 モノ・コトのインターネットとも言われるIoT、インターネットと言えば、有線か無線でLANへの接続は必須、組み込み機器、IoTガジェット・デバイスの設置の自由度を考えれば、当然、無線(WiFi)、ひいては、クラウドへの接続で外から家電を操作(ホームオートメーション)...なんてことも。

 Arduinoでもイーサネットシールドなどで有線LANに接続できますが、先の通り、無線がよい、Arduino YunやYun Mini、MKR1000、今年5月に発表されたMKRシリーズの最新版でFPGAベースのMKR Vidor 4000や新型8bitMCU ATmega4809搭載のUno WiFi Rev 2ボードなどなら無線接続できますが、最新機種は市場価格未定としても、それ以外は7000円〜10000万円程度と何分にも価格が高い。

 Bluetoothという視点からするとこれと並ぶZigbee方式のXBeeという選択肢もありますが、本体が2500円、ピッチ変換基板が200〜500円、5Vインターフェースアダプタが1000円ちょい、リセットスイッチ付きUSBアダプタが2000円ちょいと、これも必要な組み合わせにもよりますが、結構します。

 そんな中、ESP8266は、国内でも、なんと数百円で買えてしまうコスパ最高の逸品。

 もちろん、モデルによって違うし、NodeMCU、WeMos D1、DevKitC、DevKit...など開発ボードは当然多少上乗せされ、特にESP32開発ボードは1000円を越えますが、概ね1500円以下であり、それでもAliexpressなどなら、やはり、数百円で手に入ります。

 しかも、WiFiもBluetoothもBLEも...etc.という贅沢スペックで。

ESP8266の種類

 そんなESP8266/ESP8266EXには、AI Thinker社製ESP-01、ESP-02、ESP-03、ESP-04、ESP-05、ESP-06、ESP-07、ESP-08、ESP-09、ESP-10、ESP-11、ESP-12、ESP-13、ESP-14...、Espressif社製ESP-WROOM-02、ESP-WROOM-32とそれぞれバージョンアップを重ねています。

 現時点で市場では、ESP-01、ESP-WROOM-32が比較的多く出回っている模様、Amazonジャパンを見るとこれら2つに集約されているようですが、Aliexpressには、各バージョンが結構あるようです。

 開発ボードについては、様々なところからリリースされています。

 自身は、昨年、Amazonで買ったESP-01ESP-12Fと、この前Aliexpressで買ったESP-WROOM-32開発ボードを持っており、何れもリンク先で動作確認も行なっています(し、試行錯誤もしています)。

ESP8266と日本の技適

 が、ESPシリーズの内、日本の技適を通っていて、モヤモヤすることなく、堂々と使えるものは、いまのところ、ESP-WROOM-02/ESP-WROOM-32だけ。

ESP8266とブレッドボード

 ESP8266/ESP8266EXは、ブレッドボードと併用したい場合、ピン配置がこれ向きでなかったり、ピッチが異なったりするので、空中配線するか、モデルによって変換アダプタ、ピッチ変換モジュール、ブレイクアウトボードなどと呼ばれるものやユニバーサル基板による自作ボードなどをはんだ付けするか、USBポートなども備えた開発モジュールが存在するモデルについては、それを利用するかしかありません。

 ただし、日本での使用を前提にESP-WROOM-02は使ったことがありませんが、少なくともESP-32/ESP-WROOM-32の載った開発モジュールDevKitは、170穴や400穴のブレッドボードだといっぱいいっぱいである為、ジャンパワイヤをうまく引き回すか、ケーブルをブレッドボードと基板の間(基板下)から配線するか、ブレッドボードを2つつなげるか、より幅広のブレッドボードを入手する必要があります。

 もちろん、ブレッドボードに直接挿さなければ、ジャンパワイヤで配線すればよいでしょう。

ESP8266でATコマンド

 ESP8266/ESP8266EXでは、少なくとも当初のモデルは、起動するとデフォルトでATコマンドが利用できる状態であったものと思われますが、ESP-32(の一部?)では、そうでもなさ気。

 それでもファームウェアを書き換えることでATコマンドの利用も可能。

 ただ、少なくともESP12Fについては、ATコマンドを実行するまでにPuTTYやscreen、make monitor、Arduino IDEのシリアルモニタ、何れを使うにせよ、baudrate[74880]/[115200]を切り替えとそれぞれにESPの再起動を必要とするなど、ちょっとしたコツがいりました。

 尚、シリアルポートを認識させ、シリアル通信するためには、pySerialが必要です。

 前述の通り、Arduino IDEからスケッチを書き込んだ後、ATコマンドを利用したい場合にもファームウェアを書き換える必要があります。

ESP8266へのプログラムのアップロード

 どうでもよいですが、ESP8266/ESP8266EXは、Arduinoボードではないため、スケッチではなく、プログラムと呼ぶのが通例のようです...が、Arduino IDEで書くとスケッチ...。

 ESP8266ボードにプログラムをアップロードする方法には、CLIでesptool.py、ESP-IDF(make、内部ではesptool.py)、必要に応じてインストールするArduino IDE、ESPlorer IDE(Java実装・要コンパイル)、PlatformIOを使う方法などがあります。

 アップロードの経路としては、シリアル通信、USBポート付き(シリアルUSB変換チップが基板上にある)開発ボードならそのまま、USBポートのないESP8266チップ+ピッチ変換基板などの場合には、CP2102やFTDIなどのシリアルUSB変換モジュールを介して行ないますが、Arduino IDEを使用する場合に限っては、後にArduinoOTAと呼ばれる無線(WiFi)経由での書き込みも可能となりました。

 ただ、ESP8266/ESP8266EXでは、ボードへの書き込みモード(UART)とプログラム実行モード(Flash Mode)の切り替えを各種ピンのHIGH/LOWの状態によって使い分けるようになっており、シリアル通信でアップロードする場合は特に留意する必要があります。

 タクトスイッチを使った簡易回路を作って手動で切り替える(微妙なコツを要する)方法もありますが、RTS/DTRピンホールのあるFTDIモジュールを使えば、これを自動化できるので便利。

(ボードのモデルによってちょっと異なり、ESP01ではRST/GPIO0をRTS/DTRにつなぎますが、ESP12FはRESETをRTSのみにつなぎ、GPIO0/GPIO15はLOWとすべくGND、起動にあたってはGPIO0はHIGHとすべく3.3VかOUTPUTピンとして利用。)

 ただし、FTDIモジュール上のRTS/DTRピンホールは、背面が突起となっているピンヘッダや3.3V/5V切り替えジャンパピンのハンダ部分付近にあり、ブレッドボード上では、モジュール及びジャンパワイヤを押さえておく必要はあるかもしれません。

 RTS/DTRピンホールにピンヘッダをはんだ付けしてもよいですが、そのままなら、むしろジャンパワイヤを挿してピンとホールが接触するように意識してアップロード中、手で持っておくというのもよいでしょう。

 開発ボードのほとんどは、その必要すらもありませんが、一部、稀に手動でボード上のボタン操作を要するものもある模様。

 ArduinoOTAによる無線経由のアップロードについては、pythonがインストールされている前提で、概要としては、

  1. Arduino IDEに[ESP8266httpUpdate]ライブラリをインストール
    (IDEが比較的新しければ[スケッチ] => [ライブラリのインクルード]から検索)
  2. ESP8266のボード設定はできるものとして[ツール]メニューで[ボード]にESP8266のものを選び
  3. [フラッシュサイズ:]を[4M(3M SPIFFS)]とし、
  4. [スケッチ例] => [ArduinoOTA]にある[BasicOTA](開発中は、ClassicOTAだった模様)スケッチのSSID/PASSWORDを適宜編集、
  5. シリアル通信で(USBシリアル変換モジュールを介して)ESPボードにスケッチをアップロード
  6. 自動でArduino IDEが再起動され、
  7. [シリアルポート]メニューに追加されているはずの[ESP8266-ota]仮想ポートと[アップロード方法/Upload Using:]に[OTA]を選択、
  8. シリアルモニタを開くとDHCPが割り当てたIPアドレスが表示されているはず
  9. その後は、アップロードしたいスケッチごとにBasicOTAスケッチ行を複数行入れて通常のアップロード操作をすれば、WiFi経由でスケッチをアップロードできる

という仕組みになっています。(抜けがあったら申し訳ありません。)

 つまり、無線アップロードしたいESPボードには、初回のみBasicOTAスケッチをシリアル通信で書き込む必要がある、個々のスケッチにもBasicOTA設定行を入れ込む必要がある(入れなくても有線シリアル通信でのアップロードはできる)ということになります。

 よって開発ボードでない場合、USBシリアル変換モジュールは一度は必要になります。

 尚、より新しい文書によれば、"e.g. ESP01 with 512K flash memory is not enough for OTA"とあり、ESP-01などフラッシュメモリ容量が少ないボードについては、SPIFFSの観点からArduinoOTAを使うには厳しい模様。

(SPIFFSは、SPI転送でフラッシュメモリ上のファイルシステムで実行するスケッチ以外にもデータなどを保存・呼び出し・書き込み(書き換え)できる仕組み。)

ESP8266の起動・プログラムの実行

 ESP8266/ESP8266EXに書き込んだプログラムの実行にあたっては、ESP-01は、特に何もすることはなく、ESP-12F+ピッチ変換基板は、書き込み時のFTDIを除いた同様の配線の内、GPIO0をHIGHにしておくか、これをOUTPUTピンとしてプログラムしておく必要があり、ESP32 DevKitCでは、場合によりボード上のRESETボタンを押下する必要がある気がします。

 まぁ、何かするにしても再起動さえしなければ、運用時でも最初の1度だけなので大勢に影響はありませんが。

 というわけでIoTガジェットを作るなら、Arduinoボードを使う使わないに関わらず、ESP8266を使わない手はないでしょう。

電源

 ESP8266は、どのモデルも基本、入力電圧は、(2.5V or)3.0V〜3.6V程度で定格3V、慣例として3.3Vが使われ、これが無難・妥当に思われますが、一方でESP8266EX Datasheetによれば、操作電圧の平均は、80mAとありますが、瞬間的、一定期間、消費電流が100mA、200mAや300mAなど高くなり、電源が弱いと時にリセットがかかるほどの電圧降下が起こる模様。

 これは、WiFiの切断など動作不安定の要因となる為、電源には工夫を要するとされます。

 抵抗やコンデンサを噛ませるという方法もありますが、突入電流を考慮すると限界があり、5Vなどより高電圧から降圧するのがよさ気ですが、中でもより短時間で通常電圧に戻る負荷過渡応答特性に優れた電圧レギュレータを使う必要がありそうです。(そうでないと、やはり、電圧降下でリセット...不安定...ということになります。ESP-WROOM-02を使ってみる3 -そんな電源で大丈夫か-参照。)

 開発ボードについては、対策が講じられているようで心配には及ばないでしょう。

注意

 ここで1つ自身のうっかりミスに基づくスケッチを書く際の注意点が。

 前述の通り、ESP8266は、STA(無線子機)、AP(無線アクセスポイント)、STA/APと3つのモードで使えるのですが、STA/APモードで使う場合、宅内無線LAN環境に参加するSTAにだけ気を取られてESP自体のAPモードの特にSSID/PASSWORD設定を忘れると近隣の人々にアクセス自由で無防備なWiFiスポットを公開してしまうことになるので要注意です。

 アクセスされたところでスマホやタブレット、PCでネットサーフィンできるわけではありませんが、これは、他ならぬ脆弱性そのものであり、アクセス数によっては、検証にも支障が出るでしょうし、悪意があれば、IoT環境がまともに使えなくなったり、ネットワークアドレスが、宅内LAN上と同一だと尚の事、影響が大きくなるであろうことを考えると気をつけたいところです。

 尚、セキュリティといえるほどではありませんが、ヘッダファイルなどを眺めてみるとAPモード設定関数では、いわゆるステルスモード(通常のWiFiスポットスキャンでは一覧に表示されないモード)も設定できるようなので運用時などには併せて設定しておくのもよいかもしれません。

Web・クラウドサービス・オープンソースの活用

 これで宅内でWiFiを駆使し、IoTを実現することができるわけですが、クラウドサービス、Webサービスを利用すると外からも宅内・社内のIoTデバイスにアクセスできるし、IoTガジェット開発に有用なオープンソースのアプリケーションもあります。

 スマートスピーカー/AIスピーカーであるAmazon EchoやGoogle Home、TwitterやLINE、Facebook、Instagram、GMail等々、Webサービス同士の連携で機能拡張できたり、Raspberry PiやArduino、ESP8266を簡単に接続できるIFTTT、更にREST、WebSockets、MQTT等をサポートし、接続した宅内などにあるラズパイやArduino等々の機器とリアルタイムメッセージを通知可能なIoTクラウドBeebotteなどを利用すると新たなサービスを比較的容易に構築できたり、宅内・社内環境を隠蔽・保護しつつ、外とつなげることができる模様。

 また、Windows/Mac/LinuxなどOSにインストールして使うオープンソースなアプリケーションとして機器同士の通信に有用な軽量なメッセージプロトコルMQTT(MQ Telemetry Transport)/Mosquitto(MQTT Broker)、ブラウザ上で操作可能なGUI(強いて例えるならScratchやUMLのモデリングのようなイメージ)を利用したフロー(制御の流れ)ベースの開発ツールで既存の機能や自作機能(Node)同士をつないで機能拡張や完成したサービスとすることができるNode.js(JavaScript)ベースのNode-RED(Node-RED日本ユーザー会)などを使うと最小限のプログラミングで比較的容易にかなり複雑な連携を行なうことができる模様。

 IFTTTは個人利用でかつ1対1の連携なら無料、beebotteも少なくとも個人なら十分過ぎると思われるサービス内容が無料で使えます。

 必要に応じて利用するのもよいでしょう。

 自身はOSにDebianを使わせて頂いており、細かいことは抜きにして、MosquittoとNode-REDをインストールして動作確認しただけですが、超カンタンでした。

 Mosquittoは、Mosquitto(MQTT Broker)のインストールを参考にさせて頂き、結果、sudo apt install mosquitto mosquitto-clients、端末を2つ起動し、一方でmosquitto_sub -d -t orz、他方でmosquitto_pub -d -t orz -m "^o^"しただけ。

 Node-REDは、以前、node.jsをインストールしていた為、npmが既にあり、インストール方法を参考にsudo npm install -g --unsafe-perm node-red、起動を参考に端末でnode-redとし起動、ブラウザでhttp://localhost:1880(Node-REDエディタ)にアクセスしただけ。

 IFTTTとBeebotteもその内、アカウントを作ってみようと思います。

GO!

 さて、何作ろ...。

ホーム前へ次へ