32
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GWだし、ESP8266関係の記事をまとめながら、IoT framework作ってみる

Last updated at Posted at 2016-05-06

Overview

  • 1000円ほどで手に入るArduino互換で、WiFi込のESP8266を搭載したボードにまつわる記事のまとめです。

  • GWだし、ESP8266関係の記事をまとめながら、IoT framework作ってみる。
    (下にgithubのリンクあります)
    以下を実装し、追加・公開しました。

    • I2C driver, sensor framework, BMP180/DHT11 driver
    • Software PWM
    • Servo control framework and SG90D Servo driver
    • OTA (Over-the-air) firmware update (ボタンを一定時間押すと一定時間OTAが可能に)
    • UPnP/SSDP (Alexa連携などに役に立つ)

ESP8266概略

Spec Detail
CPU Tensilica L106 32bit MCU at up-to 160MHz
ExtIF UARTx2 / SDIO / I2C / SPI / I2S (most of pins are MUXed)
VCC 3.0 - 3.6V
Current Average : 80mA
Package QFN32 (5mm x 5mm)
WiFi 2.4GHz (8021.11 b/g/n/e/i)
External Flash Theoretically up to 16MB (WiFi OTA is available if the size is over than equal to 1MB )

安価ながら512KB以上Flash ROM(SPI-NOR)を搭載しているので、単体で、WiFi, TCP/IP, Web等実装ができ、非常に便利です。

Pin configuration

ESP8266のpinが、各販売されているモジュールのpinとしてどのように対応しているのかをまとめています。

Pin# Pin Name Description Typical config WROOM02 ESP
1 / 30 VDDA Analog Power 3.0V-3.6V VDDA 1: 3V3 9: VCC
2 LNA RF Antenna IF LNA
3 / 4 VDD3P3 Amplifier Power 3.0V-3.6V VDD3P3 1: 3V3 9: VCC
5 VDD_RTC NC (1.1V) VDD_RTC
6 TOUT ADC (0-1.0V) ADC 14: TOUT 15: ADC
7 CHIP_PU Chip Enable High:On / Low : Deep Sleep Pull up 2: EN 14: EN
8 XPD_DCDC GPIO16 / wake up-able from sleep (need to be connected to EXT_RSTB) WAKE# 15: IO16 13: GPIO16
9 MTMS GPIO14 / HSPI_CLK  / I2C_SCL / PWM2 / I2SI_WS I2C_SCL 3: IO14/I2C_SCL 12: GPIO14/I2C_SCL
10 MTDI GPIO12 / HSPI_MISO / PWM0 / I2SI_DATA GPIO12 / PWM0 4: IO12 10: GPIO12
11 / 17 VDDPST Digital I/O (1.8-3.3V) VDDPST 1: 3V3 9: VCC
12 MTCK GPIO13 / HSPI_MOSI / UART0_CTS / I2SI_BCK GPIO13 5: GPIO13 10:GPIO13
13 MTDO BOOTMODE / GPIO15 / HSPI_CS / UART0_RTS / PWM1 / I2SO_BCK BOOTMODE 6: IO15/BOOOTMODE 7: GPIO15/BOOTMODE
14 GPIO2 BOOTMODE / GPIO2 / I2C_SDA / UART1_TX (UART TX for flash programming/IrTX) / I2SO_WS BOOTMODE / I2C_SDA 7:IO2/I2C_SDA 6:GPIO2/I2C_SDA
15 GPIO0 BOOTMODE / GPIO0 / SPI_CS2 BOOTMODE / GPIO0 8: IO0/BOOTMODE 5: GPIO0
16 GPIO4 GPIO4 / PWM3 GPIO4 / PWM3 9: GPIO4 / PWM3 4: GPIO4
18 SDIO_DATA_2 GPIO9 / SD_D2 / SPIHD / HSPIHD GPIO9
19 SDIO_DATA_3 GPIO10 / SD_D3 / SPIWP / HSPIHD GPIO10
20 SDIO_CMD GPIO11 / SD_CMD / SPI_CS0 GPIO11
21 SDIO_CLK GPIO6 / SD_CLK / SPI_MSIO GPIO6
22 SDIO_DATA_0 GPIO7 / SD_D0 / SPI_MSIO GPIO7
23 SDIO_DATA_1 GPIO8 / SD_D1 / SPI_MOSI / UART1_RX GPIO8
24 GPIO5 GPIO5 / IrRX GPIO5 12:IO5 3: GPIO5
25 U0RXD GPIO3 / UART0_RX (flash programming) / I2SO_DATA UART0_RX 10: RXD 2: RXD0
26 U0TXD GPIO1 / UART0_TX (flash programming) / SPI_CSI1 UART0_TX 11: TXD 1: TXD0
27 XTAL_OUT Crystal Oscillator output XTAL_OUT
28 XTAL_IN Crystal Oscillator input XTAL_IN
29 VDDD Digital Power 3.0V-3.6V VDDD 1:3V3 9: VCC
31 RES12K needs to have 12kΩ pull down RES12K
32 EXT_RSTB External reset signal (low voltage : active) EXT_RSTB 13: RST 16: RST

Boot Mode

Mode GPIO0 GPIO2 GPIO15
UART Download Low High Low
Normal (Run) High High Low

入手系

開発環境系

ESP8266ではarduinoを開発環境に利用することができます。ここに、ESP8266のボードサポートを追加する手順が必要です。

  1. Install Arduino 1.6.8 from the Arduino website.
  2. Start Arduino and open Preferences window.
  3. Enter http://arduino.esp8266.com/stable/package_esp8266com_index.json into Additional Board Manager URLs field. You can add multiple URLs, separating them with commas.
  4. Open Boards Manager from Tools > Board menu and install esp8266 platform (and don't forget to select your ESP8266 board from Tools > Board menu after installation).

ご参考:

UARTドライバに関して

ESP8266にはUARTがあるので、開発をするには、Mac/Windows/UbuntuなどでUARTを使えるようにする必要があります。3.3VのTX/RXです。

安価なUSB-UARTはたいてい以下を使っています。

最初に、TX/RXをループして、動作確認をすると良いでしょう。
また、I/Oが3.3Vであることをテスターなどで確認しましょう。

ボードの設計

ボードがあっても電源をつなぐこと、プログラミングのために、UARTをつなぐことが必要です。
(ひとたび焼ければ、1MB以上のexternal SPI-Flashがある場合は、WiFiによるOTAも可能のようです)

boardの動作確認

ESPのモジュールは出荷時にATコマンドでWiFiを使うためのファームウェアが焼かれており、動作確認ができます。

Mode GPIO0 GPIO2 GPIO15
Normal (Run) High High Low

に設定して起動させると、

$ ls -l /dev/tty*
..snip..
/dev/tty.SLAB_USBtoUART
..snip..
$ screen /dev/tty.SLAB_USBtoUART 115200
  1. Check point : Ready の文字が見えますか?
  2. AT のあとに、CTRL+Mを押し、CTRL+Jを押して、 OK と帰ってくるか?

参考 : getting-started-with-the-esp8266

のようにして、確認ができます。

最初に、VCC/GND/EN/TX/RX/BOOT PIN周りの配線をこれで確認しておくことにより、今後のソフト開発で何が問題なのかに悩まなくて済むようになります。

参考 : Mac の screen の 終了のさせ方

screen の画面で control + a を押して、次に k を押し、Really kill this window [y/n] と表示されるので、 y

初期ファームウェアのBackup

Install esptool

$ cd ~/arduino_apps
$ git clone https://github.com/themadinventor/esptool/
$ cd esptool
$ sudo python setup.py install

backup

UART download mode (GPIO0:Low, GPIO2:High, GPIO15:Low)にします。

Mode GPIO0 GPIO2 GPIO15
UART Download Low High Low

CSP210xとの接続では、USB-UART側で、DTS->RTSへjumperを飛ばしてあげないと、esptool.pyがfailになりました。

$ ls -l /dev/tty* -l
..snip..
/dev/tty.SLAB_USBtoUART
..snip..
$ esptool.py -p /dev/tty.SLAB_USBtoUART -b 115200 read_flash 0x00000 0x3DFFF bkup-app.bin
$ esptool.py -p /dev/tty.SLAB_USBtoUART -b 115200 read_flash 0x3E000 0x3FFFF bkup-otakey.bin
$ esptool.py -p /dev/tty.SLAB_USBtoUART -b 115200 read_flash 0x40000 0x7BFFF bkup-irom0text.bin
$ esptool.py -p /dev/tty.SLAB_USBtoUART -b 115200 read_flash 0x7E000 0x7FFFF bkup-remain.bin

1コマンドごとにreset入れないとうまく動かなかったですので、面倒であれば、

$ esptool.py -p /dev/tty.SLAB_USBtoUART -b 115200 read_flash 0x00000 0x7FFFF bkup-512K.bin

で一気にやるのも吉かもしれません。

秋月WROOM-02 には 1MB (8MBit) のものもあるようです

load 0x40100000, len 1396, room 16 
tail 4
chksum 0x89
load 0x3ffe8000, len 776, room 4 
tail 4
chksum 0xe8
load 0x3ffe8308, len 540, room 4 
tail 8
chksum 0xc0
csum 0xc0

2nd boot I�%=5
                SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000

d��+խ�-+PUUP�

のように、起動時に出るので、4MBではないものもあるみたいですね。

としたときは、bkupするのは、8Mbitのエリアなので、

$ esptool.py -p /dev/tty.SLAB_USBtoUART -b 115200 read_flash 0x00000 0xFFFFF bkup-1024K.bin

Restoreするときは、

sptool.py -p /dev/tty.SLAB_USBtoUART -b 115200 write_flash --flash_mode=qio --flash_size=8m 0x00000 bkup-1024k.bin 

memoryマップ 参考 : http://www.electrodragon.com/w/Category:ESP8266_Firmware_and_SDK

Arduinoでのライブラリのインポート方法

  1. スケッチ → ライブラリをインクルード → ZIP形式のライブラリをインストール
  2. スケッチ → ライブラリをインクルード → インクルードしたライブラリを選択 (自動的に#include <>してくれます)

PaulStoffregen さん の Time

$ git clone https://github.com/PaulStoffregen/Time.git Time
$ cd Time
$ git archive HEAD --output=../Time.zip

exabugs さん の NTP

$ git clone https://github.com/exabugs/sketchLibraryNTP NTP
$ cd NTP
$ git archive HEAD --output=../NTP.zip

Arduino configuration

  • Arduino/Preferences

  • Tool

  • MCU board : Generic ESP8266 Module

  • Flash Mode : DIO (default)

  • Flash Frequency : 40MHz (default)

  • CPU Frequency : 80MHz (default)

  • Flash Size : 512k (64K SPIFFS) (default)

  • Debug port : disabled (default)

  • Debug level : nothing (default)

  • Reset Method : ck (default)

  • Upload Speed : 115200 (default)

GW中にあーだーこーだー書いた(ている)結果

  • GPIO configuration
  • LooperThreadTicker / LooperThreadManager
    • Tickerはtimer contextなので、http通信とか失敗するので、looper threadに乗り換えが必要なので、それを手軽にやるためのclass.
  • WiFiClientStatusTracker
  • NtpStatusTracker
  • WiFi SSID/Password through Web browser
  • I2C driver
  • Sensor framework
    • Pressure Sensor
    • Temperature Sensor
    • Humidity Sensor
    • BMP180 sensor driver
    • DHT11 sensor driver
  • Servo framework
    • SG90D Servo Driver
  • Software PWM (for Servo)
  • OTA (Over-the-air) firmware update
    • ボタンを一定時間押すと一定時間OTAが可能に
  • UPnP/SSDP
  • Alexa連携などに役に立つ

など。。。

arudiono memo

  • C++で実装されている
  • main()の代わりに、setup()とloop()が与えられている。
void main()
{
  init();
  setup();
  for(;;){
    loop();
  }
}

が与えられているイメージ.

  • こうなっているので、RTOSでよくあるloopの最後にWFI (Wait For Interrupt)を使い、消費電力を削減する仕組みにはなっていない。
  • 割り込みコンテキストと、上記のループのコンテキストは、当たり前だが意識する必要がある。
  • 割り込みコンテキスト(例えばtimer(Ticker))では、TCP/IP通信などは利用できない
  • arduinoでは、projectをスケッチと呼ぶ。
    • 新規で作成すると、そのフォルダーとファイル名が同じものが作成される
    • 右上のtabに追加で、.cppと.hを追加でき、普通の作成が可能となる。
  • 設定で外部エディタを使うを選択すると、sublime text2などを使うことができるが、arudionoはread only modeになり、結構使いづらくなる。
  • ライブラリーは、zipで固めておき、include zip libraryで取り込みが可能
  • ESP8266はgithubで公開されているarudino向けのboard support packageを追加することで利用可能となる
    • このBSPには、ESP8266で使える便利なライブラリーがたくさん入っている。
      • WiFi, EEPROM, i2c, SPI-NORで使える簡易ファイルシステム, timer(Ticker)など
      • WiFi shieldと同じAPIも用意されているがESP8266専用のIFもある。

# Forum

http://bbs.espressif.com/

# Appendix

* [espressif on github](https://github.com/espressif)
    * [ESP8266_RTOS_SDK](https://github.com/espressif/ESP8266_RTOS_SDK)
    * [ESP8266_MP3_DECODER](https://github.com/espressif/ESP8266_MP3_DECODER)
    * [ESP32_RTOS_SDK](https://github.com/espressif/ESP32_RTOS_SDK)
    * [ESP8266_IOT_PLATFORM](https://github.com/espressif/ESP8266_IOT_PLATFORM)
* [Platform IO](http://docs.platformio.org/en/latest/platforms/espressif.html)
* [ESP8266 Arduino Core](https://github.com/esp8266/Arduino)

* ハードウェア
 * [ESP8266 > 内部プルダウン / プルアップ > INPUT_PULLUPは動く / INPUT_PULLDOWNは動かない](http://qiita.com/7of9/items/eba2093d8a089d325339)
 * [ESP-WROOM-02で抵抗けちって動かなかった件](http://qiita.com/shibatchii/items/930fcd90fded76866483)
 * [ESP8266 > fritzingのパーツ > ESP-WROOM-02相当はない?](http://qiita.com/7of9/items/7b0c4a1267325b6d69ed)
 * [ちょと裏技っぽいけど、ESP8266 でAD変換やる方法](http://qiita.com/azusa9/items/26e74e4e0d5773ce9c41)
 * [秋月電子の「Wi-Fiモジュール ESP-WROOM-02 DIP化キット」を使った開発環境の構築](http://qiita.com/juosugi/items/66f25cc60734d17bc7f0#_reference-653594ab00ddb101da66)
 * レベルコンバーター
    * [5V系・3.3V系信号レベル変換](http://www.cepstrum.co.jp/hobby/5v33v/5v33v.html)
    * [異なる電圧レベル間でI2C](http://blogs.yahoo.co.jp/gomisai/14177916.html)
    * [異なる電圧レベル間でI2C その2](http://blogs.yahoo.co.jp/gomisai/24363625.html)
    * [I2Cバスのレベルシフト](http://sh7045.cocolog-nifty.com/blog/2011/11/i2c-a39f.html)
 * [LM317T](http://www15.plala.or.jp/gundog/homepage/densi/lm317/v/lm317v.html)

* 焼きこみ
 * [ESP8266 > Link > FTDI Auto Program](http://qiita.com/7of9/items/1587f78a43237d8f4708)
 * [ESP8266 への転送速度を3倍にして快適な開発生活をおくる](http://qiita.com/hotchpotch/items/ba7df839ce31547d4281)
 * [I/O電圧が3.3VのUSB/TTLシリアル変換アダプタ](http://qiita.com/mayfair/items/9682e4b37bbe78800d51)

* WiFi
 * [技適済み格安高性能Wi-FiモジュールESP8266 コピペでWiFi接続出来るArduinoIDE用ソースコードとその解説](http://qiita.com/azusa9/items/7f78069cb09872cf6cbf)
 * [ESP8266 (ESP-WROOM-02) でWi-Fi使用時のSSID/パスワードをブラウザで設定できるように](http://qiita.com/exabugs/items/2f67ae363a1387c8967c)
 * [ESP-WROOM-02でWi-Fiのアクセスポイントをスキャンする](http://qiita.com/umi_kappa/items/366e1ab937ae98b14eba)

* HTTP / network
 * [ESP-WROOM-02 Arduino互換ボードでサクッとHTTP通信できたよ](http://qiita.com/umi_kappa/items/c3c929c6f42c5bdf3143)
 * [ESP-WROOM-02 > UDP > echo server](http://qiita.com/7of9/items/88965408c5b6c416e03a)
 * [ESP8266のNodeMcuでiFttt](http://qiita.com/sushisushiBoo/items/306f94e74a28d286b067)

* System
 * Filesystem
        * [SPI Filesystem](https://github.com/esp8266/Arduino/blob/master/doc/filesystem.md#seek)
        * [Filesystem on SPI-NOR Flash](https://www.mgo-tec.com/spiffs-filesystem-uploader01-html)
        * [ESP8266 > SPIFFS.open()成功](http://qiita.com/7of9/items/58e73312a37ca51e7e00)
 * [ESP8266 (ESP-WROOM-02) で消費電力を抑えるには (スリープモードまとめ)](http://qiita.com/exabugs/items/9edf9e2ba8f69800e4c5)
 * [ESP8266 (ESP-WROOM-02) でNTP(時刻合わせ)をするライブラリ。(Timeライブラリと連携して)](http://qiita.com/exabugs/items/b1b7430d185b268a1abf)
 * [ESP8266 (ESP-WROOM-02) の便利ライブラリまとめ (Ticker編)](http://qiita.com/exabugs/items/34aab51eb2d35207629b)

* ほかを駆動
 * [ESP8266で遠隔操作のエアコンリモコンを作って、実用できるか試す(安定稼働)](http://qiita.com/kiyopikko/items/d7254db83ad070600650)
 * [ESP8266 > リレータッチボードの使用](http://qiita.com/7of9/items/9184a14182235d5feb96)

* センサー
 * [ESP-WROOM-02でI2Cセンサーを使用する](http://todotani.cocolog-nifty.com/blog/2015/10/esp-wroom-02i2c.html)
    * [ESP8266 と I2C](https://macsbug.wordpress.com/2015/10/23/esp8266-%E3%81%A8-i2c/)
    * [BMP180 data sheet](https://cdn-shop.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf)
    * [MPU-6000/MPU6050 data sheet](https://github.com/TheOS1/ESP8266/raw/master/Drivers/Lua%20Drivers/MPU6050/Docs/Register%20Map%20and%20Descriptions-MPU-6000A_V.4.pdf)
    * [DHT11 data sheet](http://akizukidenshi.com/download/ds/aosong/DHT11.pdf)
        * [Arduino library for DHT11DHT22, etc Temp & Humidity Sensors](https://github.com/adafruit/DHT-sensor-library)
        * [ESP8266 - Driver for the temperature and humidity sensor DHT11 and DHT22](https://github.com/CHERTS/esp8266-dht11_22)
        * [Library for Dallas/Maxim 1-Wire Chips](https://github.com/PaulStoffregen/OneWire)
        * [温湿度センサDHT11をRaspberry Piに繋いでシリアル入力を学ぶ](http://dolls.orz.hm/?p=9000)
        * [温湿度センサ DHT11を試す。](http://isa.asablo.jp/blog/2015/01/29/7557787)
 * [An Arduino library for the digital light sensor breakout boards containing the BH1750FVI IC](https://github.com/claws/BH1750)
 * [ESP-WROOM-02 Arduino互換ボードと焦電センサーで動体を検知する](http://qiita.com/umi_kappa/items/c4df607cc25c346df44e)
 * [ESP-WROOM-02 Arduino互換ボードで温湿度センサーを使う](http://qiita.com/umi_kappa/items/95ef40c930ef6b9bfed0)
 * [ESP8266 (ESP-WROOM-02) でセンサーを扱う](http://qiita.com/exabugs/items/9ca4093813db71278b39)
 * [ESP-WROOM-02開発ボードで15分で家の温度・湿度・気圧モニタシステムを作る](http://qiita.com/tittea/items/fab4671304bf3001efbd)
 * [Milkcocoaと複数のESP8266と温度センサでIoTしてみた。](http://qiita.com/wamisnet/items/f3d63be2044672b661a1)
 * [ESP-WROOM-02にカメラモジュールを繋いでネットワークカメラを作る](http://qiita.com/binzume/items/e301c12b7ec1486d7c42)

* Raspberry Pi連携
 * [初心者向けESP-WROOM-02解説その1: ラズパイを母艦にする](http://qiita.com/erukiti/items/2eb5c6b02bed3b382bd9)

* Tips
 * [Arduino IDE > 外部エディタを使用する > Sublime Text使用など](http://qiita.com/7of9/items/b9612b2073a978bdfbe9)
 * [ESP8266(ESP-WROOM-02)のチョイはまり回避のためのTips集](http://qiita.com/azusa9/items/fe20794aa858a73fd97b)

* ほか
 * [これからの回路図は Upverter で書くことにしよう](http://qiita.com/exabugs/items/a8b3b399160cdd5ee47a)  
 * [upverter](https://upverter.com)
 * トランジスタ
        * [トランジスタのスイッチング回路](http://startelc.com/elc/elc_3_7Tr2sw.html)
        * [トランジスタをマイコン出力のスイッチとして使う方法(1/2)](http://www.geocities.jp/zattouka/GarageHouse/micon/circuit/TR.htm)
 * リレー
        * [SRD-05VDC-SL-C-Datasheet](http://www.datasheet-pdf.com/PDF/SRD-05VDC-SL-C-Datasheet-Songle-720556)
        * [Single 5V Relay Board, 3-pin Interface, 10A @ 125V AC / 28V DC](http://microcontrollershop.com/product_info.php?products_id=5919)
        * [srd-05vdc-sl-c datasheet](http://www.datasheetcafe.com/srd-05vdc-sl-c-datasheet-pdf/)
        * [srd-05vdc-sl-cについて](http://www.kayaba.org/pd/srd-05vdc-sl-c/)

* サーボ関係
 * [ESP8266 (ESP-WROOM-02) でサーボを制御する](http://qiita.com/exabugs/items/1c454d3d31d7561dcdd0)
 * [SG90D servo specification](http://www.servodatabase.com/servo/towerpro/sg90d)
 * [SG90 servo specification](http://akizukidenshi.com/download/ds/towerpro/SG90.pdf)
 * [Arduinoでサーボ制御](http://kousaku-kousaku.blogspot.jp/2008/06/arduino.html)
 * [その9 Arduinoでサーボモータをキュイキュイ動かす!](http://marupeke296.com/EL_Ard_No9_ServoMotor.html)
 * [【RaspberryPi】サーボをAdafruit製モータドライバーを使ってI2Cで制御](http://sabo.hatenablog.com/entry/2015/03/28/212604)
 * [ESP8266-BLADE](http://www.microfan.jp/esp8266/esp8266-blade)
 * [adafruit/Adafruit-PWM-Servo-Driver-Library](https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library)
 * [歩行ロボットをつくるにはまずこれ!【サーボ編2】](http://www.isopro91.com/entry/2014/10/21/arduino/servo/robot)
32
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?