WeMos D1 anchor.png

WeMos D1*1は,中国WEMOS社からリリースされていたArduino UNO R3形状の小型ボード。

このWeMos D1の互換ボードのHiLetgo OTA WeMos D1 CH340 WiFi 開発ボード ESP8266 ESP-12F Arduino IDE UNO R3*2が非常に安価でAmazonで500円程度で購入できた :)
HiLetgo_D1.png

ボードには中国Espressif Systems社ESP8266EXを使ったCPU Module(Ai-Thinker製ESP-12F)が使われている。

esp8266.png

ホストPCとはUSBで接続して仮想シリアルポートとして機能する,CH340 USBシリアル変換チップが実装されている。

以下のような特徴がある。

  • CPUチップにWifi機能を統合
  • 動作温度が広い
    -40°C~+125°Cに対応。
  • 80MHzのシステムクロックで動作
    O.C.160MHzでも動作する場合もあるようだ。
  • 16個のレジスタ
  • 4MB Flash Memoryの搭載
    AI-Thinker製ESP-12Fのシールド内部に,SPI接続されているFlash ROMが実装されている。
    ただし,CPUのMemory Map上には最大1MBまでしかマッピングできない。
    製品によっては2MBのFlash ROMが実装されているのもあるようだ。
  • Boot ROMの搭載
    書き換え不可ではあるが64KBのBoot ROMがチップ内に内蔵されている。
    このためボードが文鎮化することはないようだ。
  • 11個のデジタル入出力ピン
    すべてのピンは,割り込み/PWM/I2C/1線式シリアルをサポート(D0を除く)。
    入出力電圧は3.3V系となる。
  • 10bit ADC x 1
  • WDT内蔵
  • MicroUSBコネクタ
  • 電源入力ジャック DC9-24V
  • Arduino Uno互換レイアウト
    Boot ROMに搭載されているbootloader機能は,Arduinoボードと同様にDTR="Low"で動作するようだ。
  • NodeMcu互換機能

WeMos D1クローンボードのHiLetgo OTA WeMos D1は,CPU ModuleにAI-Thinker製ESP-12Fを使用しており,これは改良版のWeMos D1 R2と同じ。

Ai-Thinker製ESP-12Fは技術基準適合しているようなので,HiLetgo OTA WeMos D1も技術基準適合しているということなのかな?

WeMos D1 miniという同じAi-Thinker製ESP-12Fを搭載したNodeMCU Development Kitと互換の小型ボードも販売されている。

この小さなボードも安価だったので後で購入してみた。

Page Top

スペック anchor.png

WeMos D1互換ボードのスペック。

CPUESP-8266EX(Cadence Tensilica Xtensa LX106 32bit RISC Processor)
CPU ModuleAi-Thinker ESP-12F(シールド)
クロックスピード80MHz(O.C.160MHz)
WLANIEEE 802.11 b/g/n, Wifi stack内蔵 ATコマンド, オンボード・アンテナ
RAM命令 64KB SRAM / データ 96KB DRAM
Boot ROM内蔵 64KB
Flash Memory4MB FM25Q32(CPU Module内 SPI接続)
デジタルI/O11(SPI, I2C, I2S)
アナログ入力1(10bit)
RTC1(7.45hでオーバーフローする)
WatchDog内蔵(timer=3s)
ボード動作電圧DC 3.3V
電源Jack 9-24VDC/USB MicroB
サイズ68.6mm x 53.4mm(Arduino Unoと同サイズ)
重量25g
Page Top

ブートオプション anchor.png

ESP8266EXには書き換え不可の64KBのBoot ROM(メモリアドレス:0x40000000-0x4000ffff)が内蔵されている。

このBoot ROMはFlash ROM上のユーザープログラムを起動するモードと,Flash ROMを書き換えることが出来るbootloaderモードとを,GPIOの端子により選択できる。

GPIO15GPIO0GPIO2Boot Mode説明
LHH通常モードFlash ROM上のユーザープログラムを起動
LLHbootloaderモードシリアルポートからFlash ROM書き換え時に使用する

Arduino IDEではプログラムをFlash ROMに書き込む場合,USB-Serialコンバーター経由でシリアル通信を始めるとのDTR出力=0にするが,ESP8266ボードのハードウェアでそのDTR出力がGPIO0に反映されるようになっているので,これによりReset時は自動的にbootloaderモードになる。

また,esptoolを使う場合も同様にReset時に自動的にbootloaderモードになる。

ESP8266ボードをbootloaderモードで起動させるには,GPIO0(D8)をGNDとジャンパーしてボードをResetする。

詳しくはBoot ROMのリバース解析ページを参照。

Boot ROMは書き換えできないので意味はないがdumpできた :)

> esptool -p COMx dump_mem 0x40000000 65536 esp8266bootrom.bin
Page Top

コネクタ anchor.png

WeMos D1ボードのコネクタ。(WeMos D1 miniのコネクタ

DIGITAL1 headerピンファンクションESP-8266
RXRX0, IOGPIO3/RXD
TXTX0, IOGPIO1/TXD
D2IO(no interrupt/no PWM), WAKEGPIO16
D3IO, SCL, IRRxGPIO5
D4IO, SDA, PWM3GPIO4
D5IO, HSPICLK, ONB_LED, PWM2GPIO14
D6IO, HSPIMISOGPIO12
D7IO, HSPIMOSI, CTS0GPIO13
DIGITAL2 header ピンファンクションESP-8266
D8IO, 10k Pull-upGPIO0
D9IO, 10k Pull-up, TX1, ONB_LED2GPIO2
D10IO, 10k Pull-down, HSPICS. RTS0, PWM1GPIO15
D11IO, MOSIGPIO13
D12IO, MISO, PWM0GPIO12
D13IO, SCK, ONB_LED, IR TxGPIO14
GNDGNDGND
---
D14IO, SDAGPIO4
D15IO, SCL, IRRxGPIO5
ANALOG header ピンファンクションESP-8266
A0Analog input, max 3.3V, TOUTADC0
---
---
---
---
---
Power header ピンファンクションESP-8266
---
5V5V-
RESETRESETRST
3V33.3V3.3V
5V5V-
GNDGNDGND
GNDGNDGND
VINExternal Power-

J1 USB Micro B

1VBUS
2D-
3D+
4ID
5GND
ShellShield

J2 Power Jack

1GND
2PWRIN
3GND
  • 全IOピン:割り込み/PWM/I2C/1-wireシリアル対応(D2除く)
  • 全IOピン:3.3V系
  • ドライブ電流(ソース・シンク):12mA
    ドライブ能力が小さいので注意する。
  • 内臓のプルアップ/プルダウン機能
    GPIOにはCPU内臓のプルアップ/プルダウン機能がある。
  • オンボードLEDはD5(GPIO14)に接続されている
  • CPU Moduleに実装されているLEDはD9(GPIO2)に接続されている
  • D8(GPIO0),D9(GPIO2)は10Kでプルアップされている(ブートモード選択用)
  • D10(GPIO15)は10Kでプルダウンされている(ブートモード選択用)
  • アナログ入力:入力範囲0〜1V(220Kと100Kで分圧し100K側でADC0に接続されている)
  • いくつかのコネクタピンは別のピンと接続されている(Arduino Unoに合わせるため?)
Page Top

Flash ROMのMemory空間へのマッピング anchor.png

購入したWeMos D1互換ボード(ESP8266ボード)には,SPIインターフェースで接続されている4MBのFlash ROM FM25Q32が実装されている。このSPIのFlash ROMをCPUのMemory空間にユーザープログラム領域としてMMUによりマッピングされるのだが,どうも1MBのサイズ(Memoryアドレス:0x40200000-0x402fffff)までしかマッピング出来ないようだ。

OTA機能を使う場合はOTA処理時に一時的に受信したプログラムを格納する領域が必要になるので,そのサイズ分Flash ROMにOTA用に領域が必要になる。つまりプログラム領域としては2倍の領域が必要になる。

Flash ROMの2nd Bootloaderとプログラム領域,パラメーター領域などをMemory空間にマッピングして,残った未使用SPI Flash ROMの領域は,専用のプログラムが必要ではあるが仮想ファイルシステムや仮想EEPROMなどとして使用することが出来る。

Espressif社のATコマンドのfirmwareでは,プログラム領域として512KBや1024KBのサイズ(実装している機能により分けられている)が使われている。

Page Top

出荷時のfirmware anchor.png

WeMos D1互換ボード/D1 miniボードというかESP8266が実装されているボード出荷時には,Flash ROMに懐かしいATコマンド(Espressif社)が使えるfirmwareが書き込まれている。

PCとWeMos D1互換ボード/D1 miniボードをUSBで接続して,仮想COMポートのシリアルコンソール(PuTTYなど)を使うと,電源On(またはReset)後のBoot ROMプログラムが出力するメッセージを確認することが出来る。
この時,シリアルポートのbaudrateは74880と変な値になっている。

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x40100000, len 2592, room 16
tail 0
chksum 0xf3
load 0x3ffe8000, len 764, room 8
tail 4
chksum 0x92
load 0x3ffe82fc, len 676, room 4
tail 0
chksum 0x22
csum 0x22

2nd boot version : 1.7(5d6f877)
SPI Speed : 40MHz
SPI Mode : DIO
SPI Flash Size & Map: 32Mbit(1024KB+1024KB)
jump to run user1 @ 1000

flash_id=0x164068
ret=2147483647
V2
Mo
 rf cal sector: 1019
freq trace enable 0
rf[112] : 00
rf[113] : 00
rf[114] : 01

SDK ver: 3.0.6-dev(072755c) compiled @ Apr  6 2023 03:06:03
phy ver: 1156_0, pp ver: 10.2

@J剏

boot mode:(3,6)と表示される場合の3は,通常モードでブートしたことを意味している。
bootloaderモードだとboot mode:(1,6)と表示され,1がbootloaderモードの意味になる。
これはブートオプションのbit構成そのまま。
6はおそらくSPI Flash ROMが32Mbit=4MBだと6になるのだと思う。

その後,2nd boot version : 1.7(5d6f877)と表示されるので,SPI Flash ROMの先頭に書き込んだboot_v1.7.binを2nd Bootプログラムとして起動しているのがわかる。

2nd Bootプログラムが,Flash ROMに書き込んだuser1.4096.new.6.bin(最近,自前でビルドしたATコマンドのfirmware)をRAMにコピーした後,RAM上のエントリアドレスにジャンプしてユーザープログラムとして起動している。

これで,baudrateが115200に変更されて,ATコマンド待ちのプロンプトReady(上で文字化けしている部分)が表示される。

ATコマンドで確認してみる。改行コードはCRLF。

AT

OK
AT+GMR
AT version:1.7.6.0(Jan 24 2022 08:56:02)
SDK version:3.0.6-dev(072755c)
compile time:May 17 2025 10:10:06
Bin version(Wroom 02):1.7.6
OK

注意することとして,プログラムを作成してオブジェクトをボードのFlash ROMに書き込むと,このATコマンドが利用できるfirmwareは上書きされてしまう。

なので,WeMos D1(ESP8266ボード)を購入したら,firmwareのバックアップをしておいたほうが良いと思う。
WeMos D1互換ボード購入時にこんなことは知らなかったので,firmwareのバックアップはしていない ;(
最新バージョンのATコマンドfirmwareに下記のようにしてFlash ROMに書いた後に確認している。なので元々書き込まれていたfirmwareとは違う。

Page Top

Flash ROMを読み書きするツール anchor.png

esptool.pyは,ESP8266ボードに実装されているSPI Flash ROMを読んだりfirmwareを書いたりすることが出来るPythonで動作するツール。

Pythonが使える環境であれば,pipコマンドでインストール出来る。

> pip install esptool

インストールできたか確認してみる。

> esptool
esptool.py v4.8.1
usage: esptool [-h]
               [--chip {auto,esp8266,esp32,esp32s2,esp32s3beta2,esp32s3,esp32c3,esp32c6beta,esp32h2beta1,esp32h2beta2,esp32c2,esp32c6,esp32c61,esp32c5,esp32c5beta3,esp32h2,esp32p4}]
               [--port PORT] [--baud BAUD] [--port-filter PORT_FILTER]
               [--before {default_reset,usb_reset,no_reset,no_reset_no_sync}]
               [--after {hard_reset,soft_reset,no_reset,no_reset_stub}] [--no-stub] [--trace]
               [--override-vddsdio [{1.8V,1.9V,OFF}]] [--connect-attempts CONNECT_ATTEMPTS]
               {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,read_flash_sfdp,merge_bin,get_security_info,version}
               ...

esptool.py v4.8.1 - Espressif chips ROM Bootloader Utility
 :
 :

と表示されればインストールできている。

esptoolでボードの情報を確認する。

> esptool flash_id

搭載しているFlash ROMのサイズなんかが確認出来る。

ヘルプ表示されないオプションとして以下がある。

--flash_freq(-ff)
SPI Flash frequency: 40m, 26m, 20m, 80m
--flash_size(-fs)
SPI Flash size:1MB, 2MB, 4MB, 8MB, 16MB, 256KB, 512KB, 2MB-c1, 4MB-c1
--flash_mode(-fm)
SPI Flash mode:qio, qout, dio, dout
Page Top

firmwareをバックアップする anchor.png

Flash ROMが4MB(32Mbit)の場合は,以下のようにしてバックアップ出来る。

> esptool -c esp8266 -p COMx -b 115200 read_flash 0x0000 0x400000 esp8266_backup4M.bin

もし,バックアップしたfirmwareに戻したいときは以下のようにする。

> esptool -c esp8266 -p COMx -b 115200 write_flash 0x0000 esp8266_backup4M.bin
Page Top

バックアップしていない場合でfirmwareを戻す anchor.png

firmwareを前もってバックアップしていなかった場合,AI-Thinker社またはEspressif社で提供されているATコマンドのfirmwareをダウンロードして,WeMos D1互換/D1 miniボードのFlash ROMに書き込むことで,ATコマンドが使える状態に戻すことが出来る。

Espressif社のfirmwareは,ここのGitHubからv2.2.1v3.0.6なんかをダウンロードする。
ダウンロードしたファイルを任意のディレクトリに解凍する。

bin\atディレクトリに2種類のMemory Map(512+512,1024+1024)のfirmwareが用意されている。

v2.2.1: SDK version:2.2.1, AT version:1.6.2.0
v3.0.6: SDK version:3.0.6, AT version:1.7.6.0

購入したWeMos D1互換/D1 miniボードだと,SDK v2.2.1の512+512,1024+1024のどちらののATコマンドfirmwareでも動作した。

SDK v3.0以降のバージョンも提供されているが,WeMos D1互換/D1 miniボードに使われているESP-12Fではビルド済みオブジェクトではうまく動作しなかった。v3.0以降だとFlash ROM領域がPartition定義され,実際のFlash ROMのサイズと合っていないと正常に動作しない。ビルド済みのものは2MBのFlash ROMようにビルドされているため,4MBのWeMos D1互換/D1 miniボードでは動かないのだと思う。
しょうがないので自分で4MB用にビルドし直してfileesp8266_nonos_sdk-3.0.6yu.zip,Flash ROMに書き込んだらうまく動作した。

以下のようにして書き込んだ。

v2.2.1 4MB(512KB+512KB)

> esptool -c esp8266 -p COMx -b 115200 write_flash -fs 4MB -fm dio 0x00000 boot_v1.7.bin 0x01000 at\512+512\user1.1024.new.2.bin 0x7e000 blank.bin 0x3fc000 esp_init_data_default_v08.bin 0x3fe000 blank.bin

v2.2.1 4MB-c1(1024KB+1024KB)

> esptool -c esp8266 -p COMx -b 115200 write_flash -fs 4MB-c1 -fm dio 0x00000 boot_v1.7.bin 0x01000 at\1024+1024\user1.2048.new.5.bin 0xfe000 blank.bin 0x3fc000 esp_init_data_default_v08.bin 0x3fe000 blank.bin

v3.0.6 4MB-c1(1024KB+1024KB) 自前ビルド

> esptool -c esp8266 -p COMx -b 115200 write_flash -fs 4MB-c1 -fm dio 0x00000 boot_v1.7.bin 0x01000 at\1024+1024\user1.4096.new.6.bin 0xfe000 blank.bin 0x3fc000 esp_init_data_default_v08.bin 0x3fe000 blank.bin

esp_init_data_default_v08.binには,WLANのSTA/APモードそれぞれのMAC AddressとSSID,RF出力設定値が入っているようだ。
本来これらの設定はボード事に設定しなくてはいけないので,前もってATコマンドを使って確認した設定値を使う必要があると思う・・・

Ai-Thinker社からリリースされているfirmwareはfileAiThinker_ESP8266_20160615_1.5.4をダウンロードして,任意のディレクトリに解凍する。

SDK version:1.5.4, AT version:1.1.0

とEspressif社のものより古いバージョンみたいだ。

> esptool -c esp8266 -p COMx -b 115200 write_flash -fs 4MB -fm dio 0x00000 AiThinker_ESP8266_DIO_32M_32M_20160615_V1.5.4.bin
Page Top

ソフトウェア開発環境 anchor.png

このWeMos D1互換ボード/D1 miniボードのソフトウェア開発環境として,いくつかのツールや開発環境やfirmwareが利用できる。

ボード自体にPythonやLuaなどのインタープリター言語のランタイムのfirmwareを搭載して,電源Onですぐにボード上でプログラム開発が行えるような製品もあるようだ。

  • MicroPython
    MicroPythonはPython 3互換のランタイム環境。
    MicroPythonのダウンロードページからダウンロードしてボードに書き込むことで使用できる。
    電源OnするとすぐPythonが使用でき,昔のBasicマシンのような使い勝手。
  • NodeMCU
    NodeMCUは,Luaベースのランタイム環境を持ったオープンソースハードウェア用のfirmware。
    これを書き込んで出荷している製品に,NodeMCU Development Kitがある。
    WeMos D1の小型版ボードのWeMos D1 miniは,NodeMCU Development Kitの互換品でもあるらしい。
    ESPlorerという統合開発環境も用意されている。
    電源Onするとすぐ使用でき,昔のBasicマシンのような使い勝手。
  • Arduino IDE
    Ardduino Unoなどで使用するArduino IDEがESP8266ボードのプログラム開発環境にも使用できる。
    ボードマネージャーでハードウェアパッケージをインストールすると,ToolChainもインストールされる。
    Arduinoボードでプログラム開発するのと同じ手順で,ESP8266のプログラムを作成して動かすことが出来る。
  • PlatformIO IDE
    platform IDEはESP8266のプログラムを開発する時に無料で使用できる統合開発環境。
    フレームワークとしてArduino Frameworkが使用できるみたいで,Visual Studio Code上に環境を構築して使用するようなIDE環境。
    Arduino IDEでプログラム開発するのと同じ感覚で,ESP8266のプログラムを作成して動かすことが出来る。
  • ESP8266_RTOS_SDK/ESP8266_NONOS_SDK
    WeMos D1に使われているSoCのメーカーEspressif Systems社からリリースされているRTOS環境とスタンドアローン環境用のSDK。
    ESP8266ボードでRTOSを動かし,その環境下で動作するプログラムを作成することが出来る。
    プログラムをビルドするためのToolChainや,Flash ROMに転送するためのFlash Download Toolsも別途用意されている。

これ以外の開発環境もあるようだ。

Page Top

仮想COMドライバーのインストール anchor.png

WeMOs D1互換ボードは,中華製CH340がUSB-Serialコンバーターとしてボードに実装されているので,USBでPCとして接続して仮想COMポートを使ってボードと通信出来る。

このCH340用のデバイスドライバーのインストールが必要。

Windows10以降ではPlug&Playで自動的にインストールされるようになっているので手動でのインストールは必要ないのだが,Windows Updateでデバイスドライバーが最新バージョンに更新されてしまうと,なぜか最新バージョンではうまく動作しなくなってしまうので注意する。

なので,Windows 7やPlug&Playでデバイスドライバーがインストールされない場合や最新バージョンに更新されてしまった場合は,このfileデバイスドライバーを手動でインストールする。

Page Top

Arduino IDE anchor.png

Arduino IDEはこちらのページのようにしてインストールできる。

Page Top

ハードウェアパッケージのインストール anchor.png

ハードウェアパッケージをインストールする方法は,Arduino IDEのボードマネージャーを使用する方法と,パッケージを直接ダウンロードして配置する方法とがある。

  • Arduino IDEのボードマネージャーを使用する場合
    Arduino IDEを起動し,ファイル>環境設定>追加のボードマネージャーに,
    http://arduino.esp8266.com/stable/package_esp8266com_index.json
    を追加する。

    ツール>ボード>ボードマネージャーからesp8266 by ESP8266 Communityを選んで,最新バージョンをインストールする。

    インストールが終了したら,Arduino IDEを再起動する。
  • パッケージをダウンロードしてインストールする場合
    https://github.com/wemos/Arduino_D1.gitが消滅?しているので,代わりに別のサイトからダウンロードする。
    > cd <arduino IDEインストール>\hardware
    > md esp8266com
    > cd esp8266com
    > git clone https://github.com/esp8266/Arduino.git esp8266

    これで,以下のようなディレクトリ構成になる。
       ─┬ Arduino
         └─┬ hardware
             └─┬ esp8266com
                 └─┬ esp8266
                     ├── bootloaders
                     ├── cores
                     ├── doc
                     ├── libraries
                     ├── package
                     ├── tests
                     ├── tools
                     ├── variants
                     ├── platform.txt
                     ├── programmers.txt
                     ├── README.md
                     ├── boards.txt
                     ├── LICENSE
    バイナリツールをダウンロード(要Python2.7)
    > cd esp8266/tools
    > python get.py
    Arduino IDEを再起動する。
Page Top

ボードの設定 anchor.png

上記のようにしてハードウェアパッケージがインストールできたら,Wemos D1(ESP8266)互換ボードを使用するのに以下のようにボードの選択・設定をした。

  • ボード
    WeMos D1 R2&miniを選択した。
  • CPU周波数
    80MHzが標準クロックだが,O.C.で160MHzでも動作する場合があるらしい。
    80MHzを選択した。
  • Flashサイズ
    4M(FS:2MB OTA:~1019KB)を選択してみた。
    この設定の場合,プログラムなどに使えるFlash ROMのサイズは1019KBに制限され(OTA対応にしているので実際は2048KBを使う),残りの2MBはSPIFFS(SPI Flash File System)としてファイルシステムとして使用する。
    4M(FS:3MB OTA:~512KB)を選択すると,プログラム用に512KBに制限され(OTA対応にしているので実際は1024KBを使う),残りの3MBはファイルシステムとして使用する設定になる。
  • アップロードスピード
    921600bpsを選択する。うまくいかない場合は,115200bpsにする。
  • LWIP Variant
    Networkスタックの機能を選択する。
    TCPのMSSを設定できるようだ。Higher Bandwidh(MSS=1460, IPv6=off)を選択した。
    Lower Memoryに設定するとMSS=536, IPv6=offになる。
    no featuresにすると以下の設定(RAM使用がセーブできる)になる。
    • IP Forwarding/NATを使わない。
    • AutoIP(192.254.x.x)を使わない。
    • IPフラグメンテーションと再構成なし。
    • Selective ACKなし。
    • listen backlogなし。
  • シリアルポート
    PCに認識されたCOMxポートを選択する。

他の設定はそのまま。

Page Top

ArduinoOTA anchor.png

Arduino IDEを使ってESP8266のボード用のプログラムを作成して書き込む場合,PCとボードをUSB(仮想COMポート)で接続して,bootloaderの機能を使ってプログラムの書き込みを行う。

プログラム作成時はこれで問題無いが,機器として設置した後にそのプログラムを更新しようとすると,設置しているところからボードを外してきて,PCとUSBで接続して・・・,と作業が面倒になってしまう。

こんな時,ESP8266ボードの無線LANを使ってPCと接続しプログラムを更新する事が出来れば,手間も少なくなり便利になる。

このような機能をOTA(Over The Air)と呼んでいるようで,市販の機器だと大抵はこのような機能が実装されている。

Arduino IDEでボードマネージャーを使ってESP8266ボードを使えるようにしていると,OTA用のライブラリ(ArduinoOTAなど)もインストールされている。OTAを利用するサンプルプログラムが用意される。

ArduinoOTAは以下の手順でプログラムを更新する。

  • ESP8266ボードのユーザープログラムのOTA機能で,無線LANに接続する。
  • Arduino IDEから無線LANを使ってプログラムを送信する。
  • ボードで無線LANを使ってプログラムを受信して,Flash ROMの空きエリアにプログラムを書き込む。
    このためOTA対応にすると,プログラムサイズの2倍のFlash ROMが必要となる。
    空きエリアに書き込んだOTA対応プログラムを起動するようにReset Vectorを設定する。
  • ボードをResetする。
  • OTA対応プログラムが,プログラムをFlash ROMの先頭に移動する。
  • ボードをResetする。
  • ユーザープログラムが再度起動する。

このような仕組みなので,更新するプログラムは常にOTA対応コードを実装しておく必要がある。
また,更新プログラムをダウンロードして一時保存するためのFlash ROMスペースを確保しておく必要がある。これは,Arduino IDEのボードマネージャーでの設定でサイズを設定できる。

ArduinoOTAの機能設定は以下のようになっている。

  • Port番号の設定
    デフォルトのPortは8266番。
  • アップロードする時のESP8266ボードのホスト名の設定
    デフォルトは,ESP8266のチップIDになる。
  • アップロード時のパスワード設定
  • アップロード開始・終了・アップロード中・エラー時のコールバック関数の指定

OTA対応のLED点滅プログラムの例
おなじみのLED点滅プログラムをOTA対応にしてみた。

fileBlink.ino
Everything is expanded.Everything is shortened.
-
|
!
 
 
 
 
 
 
-
|
|
-
|
!
|
|
|
|
|
|
!
 
-
|
|
-
!
|
|
|
!
// LED blink
// OTAで更新できるようにする
 
#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
 
const char* ssid = "xxxxxx";                                        // 無線LAN APのSSID
const char* password = "xxxxxxxxxxx";                               // 無線LAN APのPassword
 
void setup() {
    WiFi.mode(WIFI_STA);                                            // インフラストラクチャーモードに設定
    WiFi.begin(ssid, password);                                     // 無線LANのAPに接続する
    while (WiFi.status() != WL_CONNECTED) {                         // 接続出来るまで待つ
        delay(100);
    }
    
    ArduinoOTA.setHostname("ESP8266_OTA");                          // set OTA hostname
    ArduinoOTA.setPasswordHash("yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"); // set OTA password (setPasswodHash():md5, setPassword():plane text)
    ArduinoOTA.begin();                                             // start OTA
    
    pinMode(LED_BUILTIN, OUTPUT);                                   // LEDポート:出力
}
 
void loop() {
    ArduinoOTA.handle();                                            // OTA処理(プログラム書き換え)
    
    // LEDを1秒毎に点滅
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
}

Arduino IDEを再起動すると,ボードのシリアルポートの設定に無線LANでアクセスできるように設定できる。

これで,プログラムを変更してプログラムの更新をする時に,無線LANを使って更新ができるようになって便利になった。

Page Top

WatchDog Timerの注意 anchor.png

ESP8266のボードには内蔵WDT(WatchDog Timer)がある。

これは,プログラムが暴走した時などに強制的にResetをかける機能で,ハードウェアで実装されている。*3

Arduino IDEを使う場合,frameworkの以下のタイミングでWDTのタイマーがリセットされるようだ。

  • loop()の終了・再呼出時
  • delay()の実行時
  • yield()の実行時

WDTが6秒に相当するカウント値を超えてしまうとCPUを強制的にリセットするので,loop()内で時間がかかる処理や長時間の入力待ちなんかがある場合は,適当な箇所にdelay(0)やyield()を入れて,WatchDogタイマーをリセットするようにする。
ただし,delayMicroseconds()ではWDTを叩かないので,この目的には使用できない。

WDTはハードウェアで実装されているのだが,動作しないようにすることは可能。
I/Oアドレス0x60000900を0にすると,WDTの動作を停止することが出来ると思われる。

Page Top

Platform IDE anchor.png

PlatformIO IDEは,ATMEL AVRやESPRESSIF ESP8266/ESP32など各社のいろいろなマイクロプロセッサーを搭載したIoT向けのボードのプログラムを開発する時に,無料で使用することが出来る統合開発環境。

各CPU用のフレームワークに対応していて,ESP82666の場合Arduino IDEに似たような使い勝手で,プログラムの編集・ビルド・Flash ROMへの書き込みなどが効率的に行える。
またフレームワークは,Arduino IDEとほぼ同じ物が使われているように思える。

Microsoft製のテキストエディターVisual Studio Codeの拡張機能としても提供されているので,Visual Studio Codeに慣れている人は便利な機能を使え,プログラムの編集が効率的に行える。

またデバッグ機能が搭載されていて,CPUによってはデバッグする時に利用できる。

また,PlatformIO CoreというCLIツールをEclipseやCodeBlocks,Visual Studioといった他のIDEに統合化することもできて,EclipseやCodeBlocksなどのIDEで各社のCPUのフレームワークでプログラム開発が行えることになる。

こちらのページのようにして,インストールする。

Page Top

ESP8266_RTOS_SDK/ESP8266_NONOS_SDK anchor.png

SoCメーカーのEspressif Systems社から,ESP8266_RTOS_SDKESP8266_NONOS_SDKがリリースされている。
スタンドアローンのプログラム開発の場合は,ESP8266_NONOS_SDKが使用できる。

上記のGitHubからダウンロードできる。

> md esp8266
> cd ~/esp8266
> git clone https://github.com/espressif/ESP8266_NONOS_SDK.git

また,ESP8266_NONOS_SDKを使ってプログラムをビルドするには,Windows用のToolChainPython2が必要になる。

Espressif社が提供しているtoolchainがあるのでv8.4.0をダウンロードして,以下のディレクトリを作成してそこに解凍した。

C:\espgcc\esp8266

実行PATHに,C:\espgcc\esp8266\xtensa-lx106-elf\binを追加すればインストールできる。

SysPPROGSが提供しているtoolchainもある。
こちらを使う場合は,esp8266-gcc8.4.0.exeをダウンロードしてクリックすればインストールできる。

Page Top

MicroPython anchor.png

MicroPythonは,マイクロコントローラーで動作するPython 3互換およびそのランタイム。
マイクロコントローラーをリセット後すぐにPythonが動作する環境となる。なので比較的手軽にプログラムを試すことが出来る。

MicroPythonはESP8266チップをサポートしているので,MicroPythonをボードに書き込んで使用することができる。 ダウンロードは,こちらから最新バージョンがダウンロード出来る。

ボードにMicroPythonを書き込むためにesptoolが必要なのでPCにインストールする。

> pip install esptool

MicroPythonをボードに書き込む。

> esptool -p COMx erase_flash
> esptool -p COMx write_flash --flash_size=detect 0x0000 esp8266-20220618-v1.19.1.bin

PCとボードをUSBケーブルで接続しPuTTY等で接続する。

  • baudrateは115200
  • 改行はCR

ボードをResetする。そうすると,対話型Pythonで操作できる。

MicroPython v1.19.1 on 2022-06-18; ESP module with ESP8266
Type "help()" for more information.
>>> print("Hello Yuji Ueno")
Hello Yuji Ueno
>>>

となれば動作している。

Page Top

無線LANを使って接続する anchor.png

WebREPLを使用すると無線LANで通信できる。
作成したプログラムをボードにアップロードしたりダウンロードしたり出来る。

上記のシリアルポートで接続して,

>>> import webrepl_setup

とする。いくつか質問されるので,Eと任意のPassを設定して,Yでリブートする。
一度ボードをResetして,さらに

>>> import network
>>> sta = network.WLAN(network.STA_IF)
>>> sta.active(True)
>>> sta.scan()
>>> sta.connect('<SSID>', '<PASS>')
>>> while not sta.isconnected() :
    time.sleep(0.1)
>>> conf = sta.ifconfig()
>>> print(conf)

これでボードのIP Addressがわかる。

PCにWebREPLコンソールをインストールする。

> git clone https://github.com/micropython/webrepl.git

webreplディレクトリにあるwebrepl.htmlをダブルクリックする。ws://<IP Address>:8266と入れて,Connectボタンを押す。
これで無線LANで接続して,操作することが出来る。

ボードがResetした後に自動的にWLAN接続できるようにboot.pyを書き込んでおく。

Everything is expanded.Everything is shortened.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
import network
import webrepl
import utime
 
sta = network.WLAN(network.STA_IF)
sta.active(True)
 
sta.connect('<SSID>', '<PASS>')
start_time = utime.time()
while utime.time() - start_time < 10:
    if sta.isconnected():
        print("connect")
        webrepl.start()
        break
else:
    print("Timeout")
    sta.active(False)
    ap = network.WLAN(network.AP_IF)
    ap.active(True)
    webrepl.start()

WebREPLコンソールの右にあるsend a fileでboot.pyを指定してsend to deviceボタンで書き込む。
これで,最初からWLAN接続できるようになった。

Page Top

スマートスピーカーと連携させる anchor.png

Page Top

Google home mini anchor.png

スケッチ>Include Library>Manage Libraries...で空欄にgoogleと入れる。
esp8266-google-home-notifier 1.0.6とesp8266-google-home-tts 1.0.7をInstallする。

これでWeMos D1ボードからGoogle home miniにしゃべらせることができる。

Page Top

Amazon Alexa anchor.png

https://github.com/witnessmenow/esp8266-alexa-wemo-emulatorからzipファイルをダウンロードする。
スケッチ>Include Library>Add ZIP Libraries...>esp8266-alexa-wemo-emulator-master.zipを選択する。

これでWeMos D1ボードから,IFTTTを使わなくても家の電気をつけたり消したり出来るようになる。

Page Top

IFTTTと連携 anchor.png

WeMos D1ボードとIFTTTとの連動は,ESP8266IFTTTを使う。
zipファイルをダウンロードする。

スケッチ>Include Library>Add ZIP Libraries...>ESP8266IFTTT-master.zipを選択する。

ESP8266IFTTTのスケッチの例

// ヘッダー
#include <ESP8266IFTTT.h>

// IFTTT_WEBHOOK_NAMEのところにIFTTT Webhook's name,IFTTT_KEYにIFTTT Webhook api keyを入れる
// IFTTT Webhook api keyは,IFTTT>My Applets>Web Hooks>Web Hooksのロゴ>Documentation またはhttps://ifttt.com/maker_webhooksのDocumentationで表示される

// もしトリガーだけなら・・・
IFTTT.trigger(IFTTT_WEBHOOK_NAME, IFTTT_KEY);

// もしvalueがあれば・・・(但しvalueは文字列に限る。)
IFTTT.trigger(IFTTT_WEBHOOK_NAME, IFTTT_KEY, value1, value2, value3);

これで準備完了。
ファイル>スケッチの例 から,いろいろ試すことが出来る。

Google home miniやAlexaから,IFTTTを使って家の電気をつけたり消したり出来る。もちろんリモコンもコントロール出来る。


*1 改良版はWeMos D1 R2
*2 HiletGO製のはもう販売されていないのでこれは似たようにボード
*3 これとは別に,ソフトウェアで実装するWatchDog TimerもArduno IDEでは用意されている。

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 1483, today: 15, yesterday: 0
最終更新: 2025-05-15 (木) 10:36:59 (JST) (48d) by yuji