ESP8266 (ESP-01) をArduino IDEで使う(1: Lチカ編)

DIYする

これまで、ESP32を使ってHomeKitで動作するアクセサリをDIYしてきました。ESP32の下位モデルにESP8266があります。シンプルなアクセサリならばESP8266でも作れますし、市販のスマートプラグ、スイッチ、センサー類にはESP8266が使用されている場合が多いです。そこで、今回はESP8266が搭載されたモジュールESP-01を入手して、Arduino IDEでのプログラミングを試します。

ESP8266を搭載した小型モジュール

AliExpressで、安価なESP8266ボードが多数売られてます。これらの中から、USB接続アダプターとセットで販売されていたESP-01というモジュールを入手しました。

USBアダプター

入手した製品は、USB接続アダプターとESP-01です。アダプタが送料込み269円、ESP-01が送料込み317円です。

USB接続アダプターには、USBシリアル変換器と、5Vから3.3VへのDC-DC変換器が搭載されています。シリアル変換器は、コンパイルしたプログラムをESP8266にダウンロードするために使用します。DC-DC変換器は、USBの5V電源をESP8266が使用する3.3Vに変換します。このUSB変換アダプターは、日本のAmazonでも単体売りされてました。2個で送料込み699円です。

このアダプタに8ピンコネクタで接続するESP8266モジュールには、ESP-01とESP-01Sの2種類があります。どちらも送料込み317円です。日本のAmazonでもESP-01が2個799円(送料込み)で売られてました

ESP-01とESP-01S

今回入手したモジュールESP-01は、ESP8266、フラッシュメモリ、Wi-Fiアンテナを搭載した小型モジュールです。引き出されたIOピンが限られているので、小規模な試作に適してます。このほか、ESP-01Sというモジュールも出回っています。

ESP-01とESP-01Sに大きな違いはないようです。ESP-01Sの方が、Wi-Fi強度・感度が改善されているという情報もありました。またESP-01ではプルアップされていないピンが、01Sではプルアップされています。この関係で、ESP-01を単体動作させるために後述する追加配線が必要です。大した手間ではありませんが、同じ条件で入手できるのであれば、ESP-01Sを選ぶのが良いかと思います。

ESP-01のピン

ESP-01, ESP-01Sのピンに関しては、以下のサイトの説明が詳しいです。

ESP-01 and ESP-01S How program and use the Pins and Leds

ESP-01には、8本のピンがあります。VCC, GNDは、電源、接地です。CH_PDはチップ選択で、動作するためにはプルアップされている必要があります。RSTはリセットピンです。RX, TXはシリアル通信用です。このほか、デジタル入出力にGPIO0とGPIO2があります。

https://www.instructables.com/How-to-use-the-ESP8266-01-pins/ より引用

TXはGPIO1、RXはGPIO3に接続されています。入出力としては、空いているGPIO0, GPIO2を使うべきですが、それでも足りない場合は、多少の制限はありますがGPIO1, GPIO3も使えます。詳しくはこちらをご覧ください。

https://burariweb.info/electronic-work/esp01-esp8266-how-to-use.html から引用

特に、ESP-01では、内蔵の青色LEDがTXに接続されているので、動作状態をモニターする用途にGPIO1が使えます。

https://www.forward.com.au/pfod/ESP8266/GPIOpins/ESP8266_01_pin_magic.html より引用

ESP-01Sのピン

これに対して、ESP-01Sでは、GPIO0に青色LEDが接続されています。動作状態をモニターするなどの用途に使えます。また、CH_PD, GPIO0, GPIO2が12kΩの抵抗を介してプルアップされています。

https://www.forward.com.au/pfod/ESP8266/GPIOpins/ESP8266_01_pin_magic.html より引用

ArduinoをESP8266に対応

Arduino IDEでプログラミングするために、Arduino IDEをESP8266に対応させます。そのために、Arduino IDEのPreferences…メニューを選びます。すると設定ウィンドウが開きますが、その中に「追加のボードマネージャのURL 」という項目があります。

ここに、以下のURLを追加します。

http://arduino.esp8266.com/stable/package_esp8266com_index.json

検索したところ、これがESP8266のボードマネージャURLのようでした。これでボードマネージャにesp8266の選択肢が現れます。インストールボタンを押して、インストールします。

すると、「ツール」「ボード」メニューにESP8266 Boardという項目が現れます。この中から、Generic ESP8266 Moduleを選択しました。

Lチカプログラムを作る

LEDを点滅させるプログラムを作りました。ESP-01では、青色LEDがGPIO1に接続されているので、それでLチカします。


#define LED 1

void setup() {
  pinMode(LED, OUTPUT);   // Initialize the LED_BUILTIN pin as an output
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED, LOW);  // Turn the LED on
  delay(1000);                     // Wait for a second
  digitalWrite(LED, HIGH); // Turn the LED off by making the voltage HIGH
  delay(2000);                     // Wait for two seconds
}

問題なくコンパイルは終了しました。しかし、ダウンロードに失敗しました。USBシリアルから接続しようとしているものの、接続に失敗したようです。

書き込みモードに切り替える

ESP32互換モジュールでダウンロードに苦労したことは以前にもありました。ESP32純正モジュールでは問題ないのですが、互換品ではタイミングが難しいことがありました。今回も類似の問題だと思われます。

ESP8266も、ESP32と同様に、起動時に特定のGPIOピンを設定することで、プログラム実行モードと、プログラム書き込みモードを切り替えています。ESP8266では、GPIO0とGPIO2が以下の状態の時に、それぞれ実行モードと書き込みモードに切り替わります。

https://www.forward.com.au/pfod/ESP8266/GPIOpins/ESP8266_01_pin_magic.html より引用

今回入手したUSBアダプタの販売サイトにも説明がありました。それによると、

Arduino IDEでプログラムするには、GPIO0の状態を手作業で切り替える必要があります

また、ほんの少しの手間でCH340 (USBシリアルのチップ) のピンからGPIO0に接続して自動切り替えすることもできます。(反転論理回路が必要かもしれません)

と書いてありました。ESP32 dev moduleなどに備わっている、実行・書き込みモードの自動切り替え機能は搭載されていないようです。自動化の改造も「ほんの少しの手間」でできそうになかったので、手動切り替えを考えました。

要するに起動時にGPIO0がLowになれば良いので、プッシュスイッチを取り付け、押すとGPIO0がGNDになるようにしました。Amazonの販売サイトの写真を参考にしました。

このスイッチを押しながら、ESP-01をUSBに接続します。この状態でArduino IDEからプログラムをダウンロードしたところ、無事書き込むことができました。

書き込みが終了すると、Arduino IDEの画面には、RTSピンを経由してESP-01をリセットしているという表示が出ます。でもリセットされません。今回のUSBアダプタでは、リセットのための配線がされていないためです。それで、一旦USBから外して、取り付けたプッシュスイッチは押さないで、再びUSBに接続したところ、プログラムが起動しました。青色LEDが1秒On, 2秒Offで点滅します。

単体で動かす

次に、ESP-001をUSBアダプタから取り外して、単体で動作させようとしました。ESP8266単体なので、動作電圧は3.3Vです。以前、ハードオフで買ってきた330円の3.3V用ACアダプターがあったので、これを8ピンのVCCとGNDに接続しました。しかし動作しませんでした。(下の写真は、最終的に動作した状態のものです)

これはUSBアダプタからESP-01を外してしまったことで、ピンの配線が変わってしまったからです。ESP-01単体の内部配線は、前述のように以下です。GPIO0, GPIO2, CH_PDなどがプルアップされていません。

https://www.forward.com.au/pfod/ESP8266/GPIOpins/ESP8266_01_pin_magic.html より引用

テスターでも確認しましたが、USBアダプタに接続した状態では、GPIO0, GPIO2, CH_PDに3.3Vが印加されているのに対して、ESP-01をアダプタから外してVcc, GND接続した状態では、GPIO0, GPIO2, CH_PDに電圧がかかってません。特にCH_PDは、チップセレクトのピンで、これがHighになっていないとESP8266が動作しないらしいです。

そこでブレッドボードに接続して、CH_PDをプルアップしたところ、動作して、青色LED点滅が開始しました。ブレッドボードで接続するのは面倒なので、RSTピンとCH_PDピンをコネクタ裏で接続することにしました。これでRSTのプルアップ抵抗12KΩを共有することになります。共有でも問題なかったようで、無事動作するようになりました。

GPIO0、GPIO2も、プログラム実行モードに設定するためにプルアップする必要があるかとは思いました。でも試したところ、開放でも問題なく実行モードに入りました。

なお、ESP-01に対して、ESP-01Sはピン類が内部でプルアップされてます。ESP-01Sを使えば、RSTとCH_PDを接続する手間は不要だと思われます。

https://www.forward.com.au/pfod/ESP8266/GPIOpins/ESP8266_01_pin_magic.html より引用

まとめ

ESP8266開発ボードESP-01をArduino IDEからプログラミングできるように設定しました。

今回は、USBに接続するアダプターを使用しました。プログラム実行モード、書き込みモードの切り替え機構がついてないらしく、手動で切り替える押しボタンを追加しました。探してみると、モード切り替えを自動でやってくれるらしいUSBアダプターもあるようです。機会があれば試したいと思います。

ESP-01はいろいろな回路工作で使われているようでした。USBアダプタを使用しないで、Arduinoのピンに接続してプログラム書き込みをしている人も多いようです。さらに、ESP-01をArduinoのWi-Fiアダプタとして使っている例もありました。

ESP32と比較すると安価なので、HomeKitから動作するDIYデバイスとして気軽に使って行こうかと考えています。まずは、OTAやMQTTが使用できるかどうか、確認します。以下に続きます。

ESP8266 (ESP-01) をArduino IDEで使う(2: OTA編)
前回、ESP8266を搭載したESP-01を、Arduino IDEでプログラミングできるよう設定し、単体で動作させました。 今回は、USBアダプタに接続しないで、ESP-01単体のままプログラム更新できるように、Arduino OTAを使...
ESP8266 (ESP-01) をArduino IDEで使う(3: MQTT編)
前回、ESP8266を搭載したESP-01を、Arduino IDEでプログラミングできるよう設定し、OTAによりプログラム更新しました。今回は、MQTTメッセージをパブリッシュ、サブスクライブしてみます。OTAも引き続き有効にします。 以...

コメント

タイトルとURLをコピーしました