Edited at

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


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).


ご参考:

* 開発環境構築に関するqiita記事: http://qiita.com/azusa9/items/264165005aefaa3e8d7d


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

https://github.com/themadinventor/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中にあーだーこーだー書いた(ている)結果

https://github.com/hidenorly/esp8266_IoT


  • 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