31
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated 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

$ 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

Appendix

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
31
Help us understand the problem. What are the problem?