気の向くままに辿るIT/ICT/IoT
webzoit.net
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万円程度と何分にも価格が高い。

HiLetgo イーサネットシールドW5100 for Arduino UNO/MEGA2560

What's Next Turqoise(Arduino Yún互換機)

Linino ONE

Arduino mkr1000

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

XBee ZB(S2C) / ワイヤアンテナ型

XBee シリーズ1 / ワイヤアンテナ型

XBee ZB(S2C) / PCBアンテナ型

XBee USB アダプター(リセットスイッチ付き)

XBee 5Vインターフェースアダプタ

XBeeピッチ変換基板とソケットのセット

[スイッチサイエンス] 片側だけのXBeeピッチ変換基板

 そんな中、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開発ボードを持っており、何れもリンク先で動作確認も行なっている(し、試行錯誤もしている)。

KKHMF ESP8266 ESP-01 リモート シリアル ポート WiFi トランシーバー ワイヤレス モジュール高精度

KKHMF ESP8266に基づいて NodeMCU LUA WIFI無線モジュール 開発ボード

KKHMF ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetooth デュアルコアCPU低消費電力

HiLetgo ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetoothデュアルモード

waves ESP32-DevKitC ESP-WROOM-32 ESP32 DevKitC V2 WiFi BLE 技適取得済 国内発送

waves ESP-WROOM-32 + 開発基盤 セット 国内発送

waves ESP8266 WiFiモジュール(技適取得済み) ESP-WROOM-02 キット 赤基盤

[スイッチサイエンス] ESP-WROOM-02ピッチ変換済みモジュール《シンプル版》

[スイッチサイエンス] ESP-WROOM-02ピッチ変換済みモジュール《フル版》

waves ESP32 ESPDuino-32 (ESP-WROOM-32) 技適取得品

ESPr Developer 32

Rasbee WeMos D1 R3 簡易デザイン WiFi 開発ボード NODEMCU LUA ESP8266 Arduino UNO 適用 1個 [並行輸入品]

Rasbee OTA WeMos D1 CH340 WiFi 開発ボード ESP8266 ESP-12F For IDE UNO R3 Arduino用 1個 [並行輸入品]

Rasbee アップグレード版 WeMos D1 R2 WiFi UNO 開発板 ESP8266 Arduino 1個 [並行輸入品]

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の状態によって使い分けるようになっており、シリアル通信でアップロードする場合は特に留意する必要がある。

Rasbeeオリジナル FT232RL互換 3.3V/5V FTDI/USB/TTL変換アダプタ

 タクトスイッチを使った簡易回路を作って手動で切り替える(微妙なコツを要する)方法もあるが、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!

 さて、何作ろ...。

ウェブ造ホーム前へ次へ