ESP8266 はじめに   

 ESP8266というデバイスが話題になっています。wi-fiのデバイスらしい。そのwi-fiも私には知識がほとんどありません。無線LANで通信ができるらしい、ことしかわかっていません。我がデスクトップPCにはその機能がないし、スマートフォンも持ち合わせがありません。でも、何かできそうで、またaruduinoで書き込みができるらしい、もちろん専用書き込み装置もいらないらしい、のでとりあえず手にしてみることにしました。
アマゾンで送料込み2個¥950で ESP-WROOM-02 (技適取得済み)というのを購入しました。

 1 動作回路の作製  
 2 espボードの登録(Arduino-IDEに) 
 3 Lチカをしてみる 
 4 ファームを戻す 
 5 気圧センサーBMP280テスト 
 6 ADC入力のテスト_CdS 
 7 I2C-LCDモジュール(3V3化)





 1 動作回路の作製   2017.02.12
 到着したデバイスは1.5mmピッチの基板です。注文前の説明ではわからなかったので、ブレッドボードに挿せる2.54mmピッチにする変換基板を作ることにしました。幅のサイズがやや大きいので全体が載る基板にするとブレッドボードの差し込み穴がほとんど使えなくなりそうです。そこで、横には伸びますが秋月の変換基板のように横にずらせたタイプとしました。下の写真で見えると思います。
このデバイスは裏面に端子名が印刷されているのですが、このようにサイドが空いた形にすると完成後も印刷が見えて便利です。

(2019.06.11)ボードを作り直しました。
書き込もうとするとエラーになることが多くなりました。かなり時間を使って、どうやらその後にボードに載せたresetスイッチが働いていないようでした。たまたま書き込めてLED点灯動作のときにresetスイッチを押すと点灯のままであったり、点滅を続けることがあったりしました。独立したresetスイッチを増設すると問題なく書き込みができます。無理なはんだ付けが支障をきたしているようです。多分ちょい付けが時間で接続不良になったのでしょう。
そこで、新しく作ることにしました。スイッチを置く場所の確保のため幅を4穴から6穴に広くしました。resetスイッチとプログラムスイッチの両方を基板に載せました。同時にプルアップ・プルダウンの抵抗と回路も組み込みました。3端子のGNDも結線して一ヶ所のGNDをつなぐだけでも動作するように考えました。基板の配線を考えたときのスケッチをペイントで書き直したものもあげておきます。

(以上 2019.06.11追記)

結線は次のとおりです。


基本回路を追加しました。(2017.03.15)


動作時に関係するポートは GPIO0 GPIO2 GPIO15 の3個ですが、解説サイトによって違いがありました。そこで、データシートに従って配線しました。
 uart download mode  GPIO0=L GPIO2=H GPIO15=L
 flush boot mode    GPIO0=H GPIO2=H GPIO15=L
GPIO0だけを切り替えれば良いことになります。(2017.03.01追記 書込み時は、リセット時にGPIO0がLになっていれば良いようです。GPIO0とGND間にタクトスイッチをつけてこれを押したままでリセットボタンの押しています。もちろんリセットボタンを離してからGPIO0スイッチを離しています。GPIO0は10kでプルアップしています。)
なお、消費電流が多いので(80mA。200mAという説もある。)3.3V電源は別に供給しています。

配線が完了すればATコマンドのテストです。通常使用しているCH340のUSB-シリアルコンバーターでテストしましたが設定を変えても(115200、CR+LFに)うまく行きません。リセットすると何やら返って来ますので動いてはいるようです。コンバーターのせいかと考えてFTDIのFT232RFを使った自作ものに変えると通信できました。


うまく通信できないときは、flush boot mode(GPIO0=H)にしてリセットし(ややこしい文字などが表示される。のち「ready」が出る。)ATコマンドを実行するとできます。リセットの後は uart download mode(GPIO0=L)でもATコマンドが実行できます。

コンバーターのCH340のものはどうしてもうまく行きませんでした。また、CP2102を使った自作品ではうまく応答できました。CH340がダメな理由は不明です。

−−−−とりあえず動いたということで。
top


 2 espボードの登録(Arduino-IDEに)   2017.02.13

 aruduino-IDEで処理するためにsep8266ボードを登録します。こちらのページを参考にしました。
1.aruduino-IDE 1.8.1 はすでにインストールしてあります。
2.指示に従って上記のページに示された  http://arduino.esp8266.com/stable/package_esp8266com_index.json を
 Arduino-IDEの「ファイル」→「環境設定」→「追加のボードマネージャーのURL」にペーストします。
3.「ツール」→「ボード」→「Bords Managerをクリック」
4.最後の欄にある ESPボード をクリック。
5.最新バージョンを指定して、「インストール」をクリック。
6.IDEの設定でボードは「Generic ESP8266 Module」を選択します。
7.「Flush Size」は4M(1M SPIFFS)を選びました。(3Mはかけない、という...)
8.書込装置は esptool とのことですが、ないのでデフォルトの 「AVRISP mkII」で書込みができました。
9.Reset Method は ck にしています。(GPIO0は手動設定、リセットも手動)
top


 3 Lチカをしてみる   2017.02.13

 IDEのテストとしてLチカをしてみました。
17番ピンのGPIO16に抵抗を付けたLEDを差し込み、サンプルスケッチのbasics-Blinkを編集します。
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(16, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(16, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(16, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}
portを16に変えただけです。

GPIO0をLにして、コンパイルが終わる直前を見計らって(ええかげんです)リセットスイッチを押しました。
コンパイルも書込みもかなり時間がかかりました。が、Lチカに成功しました。

「最大1044464バイトのフラッシュメモリのうち、スケッチが222201バイト(21%)を使っています。
最大81920バイトのRAMのうち、グローバル変数が31576バイト(38%)を使っていて、
ローカル変数で50344バイト使うことができます。
と表示されました。基本操作でメモリを消費しているように思います。
top


 4 ファームを戻す   2017.02.12

 Lチカを書き込むと、ATコマンドを受け取るファームは消えてしまう、とは知りませんでした。そこで、元の状態に戻す方法をWEBで調べました。なかなかうまく行かなかったのですが、「下手な鉄砲も数撃ちゃ当たる」で、なんとか戻りました。その方法をメモしておきます。

主としてねむいさんのぶろぐを参考にしました。
ファーム書込みデータ(ファイル)はここから ESP8266 NONOS SDK V2.0.0 20160810をダウンロードして解凍します。
解凍すると esp8266_nonos_sdk_v2.0.0_16_08_10 という名のフォルダができ、その中の ESP8266_NONOS_SDK/bin に設定ファイルがあります。
書込みツールはここから Flash Download Tools V3.4.4 (ESP8266 & ESP32)をダウンロードしました。ESPFlashDownloadTool_v3.4.4.exe が実行ファイルです。
書込みツールESPFlashDownloadTool_v3.4.4.exeを実行すると下図左の窓が現れるのでESP8266を選びます。

続いて右に示した窓が出ますので、赤枠の部分を指定しました。
・Download Patch Config のファイル名は前述の/binにあるファイルから選択します。アドレスは手入力です。ファイル名とアドレス数値は図から読めるので記述は省略します。
・COMポートは接続に応じて選び、ボーレートはdefaultの115200とします。
・図は書込み終了時のものですが、書込み開始は「START」をクリックします。「FINISH」が出れば終わりです。
・なお、書込み前に GPIO0を[L]にしてresetスイッチを押し、書き込みモードにしています。リセット時に[L]にしておけば、それ以降は[H]でも良いようです。なお、GPIO0は10kでプルアップしています。
・終了後、青枠の部分にROM情報、MACアドレスが表示されます。
GPIO0を[H]にしてATコマンドを送りました。

間違ったコマンドを送ってしまって返答がなくなったときもこの処置で元に戻るそうです。しかしボーレートは覚えていたほうが良いのでしょうね。

top


 5 気圧センサーBMP280テスト   2017.02.26
 aruduino-IDEを使ってのBMP280気圧センサーのテストをしました。 IDEには上記の通りESPボードを登録してあります。また、BMP280用にlibraryにAdafruit_BMP280、Adafruit_Sensor-masterを登録してあります。
基本回路は上記「1 動作回路の作製」の通りで、SCLとSDAを追加しているだけです。BMP280はプルアップ抵抗がつけられていますのでそれぞれの端子をつなぐだけです。
  BMP280
  Vcc → 3.3V
  GND → GND
  SCL → IO5(8266)
  SDA → IO4(8266)
  CSB → 3.3V I2C接続
  SDO → 3.3V slave address 1110111 (0x77)



プログラムはIDEの「スケッチ例」をそのまま使っています。

/***************************************************************************
  This is a library for the BMP280 humidity, temperature & pressure sensor

  Designed specifically to work with the Adafruit BMEP280 Breakout 
  ----> http://www.adafruit.com/products/2651

  These sensors use I2C or SPI to communicate, 2 or 4 pins are required 
  to interface.

  Adafruit invests time and resources providing this open source code,
  please support Adafruit andopen-source hardware by purchasing products
  from Adafruit!

  Written by Limor Fried & Kevin Townsend for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ***************************************************************************/

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11 
#define BMP_CS 10

Adafruit_BMP280 bme; // I2C
//Adafruit_BMP280 bme(BMP_CS); // hardware SPI
//Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));
  
  if (!bme.begin()) {  
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }
}

void loop() {
    Serial.print(F("Temperature = "));
    Serial.print(bme.readTemperature());
    Serial.println(" *C");
    
    Serial.print(F("Pressure = "));
    Serial.print(bme.readPressure());
    Serial.println(" Pa");

    Serial.print(F("Approx altitude = "));
    Serial.print(bme.readAltitude(1013.25)); // this should be adjusted to your local forcase
    Serial.println(" m");
    
    Serial.println();
    delay(2000);
}
bmp280のライブラリでSCL、SDAのIOピンが定義されており、また、スレーブアドレスも記述があるようでそれを知らなくてもSDO端子をプルアップすれば正しいスレーブアドレスとなるようです。
I2Cの動作を考えなくても、何も知らなくてもシリアルへの表示はできるようです。
便利といえば便利ですが、狐につままれたようにも感じます。


aruduino-IDEでビルドすると、
 最大1044464バイトのフラッシュメモリのうち、スケッチが239873バイト(22%)を使っています。
 最大81920バイトのRAMのうち、グローバル変数が32264バイト(39%)を使っていて、ローカル変数で
 49656バイト使うことができます。
と表示されます。IOは少ないのですがmega328pと比べると随分メモリが多いようです。
top



6 ADC入力のテスト_CdS   2017.05.10 2017.03.14

 UARTドライブのLCDをテストするために一部変更しました。(2017.05.10)
CdS光センサーを使ってアナログ入力の実験をしました。ハードウエアは基本回路に次の1,2を付け加えました。
1.16番ピン TOUT(ADCin)に抵抗で分圧したCdSを付けた。 Vcc(3V3)−−CdS−−TOUT−−1k−−GND
2.5番ピン GPIO13 とGND間に 抵抗付きLEDをモニタとして入れた。

ESP8266のアナログ入力IOは TOUT名の1端子だけだそうです。またこのピンは0〜1Vの範囲しか入力できないそうです。
プログラムはここのサイトからいただきました。ただ、delayタイムだけは変更しています。
シリアルモニタは次のように表示されました。

Arduino-IEDでは最高電圧値を1024で示すようです。この値が端子のmV値を表していると考えて良いと思います。
シリアルモニタの値は10WLED電球の下に置き、手で光を遮った状態から明るくしたものです。

アナログ入力端子は1つしかありませんが、0〜1Vに調整した入力を測定するには簡単で便利だと思いました。
  プログラムです。
//ESP-WROOM-02でアナログ入力をするために必要
extern "C" {
#include "user_interface.h"
}
 
void setup() {
 Serial.begin(9600); //シリアル通信速度をR8C/M12A表示に合わせた。
 pinMode(13, OUTPUT);
}
 
//TOUTピンからの入力値を取得
int getToutValue(){
 int res = system_adc_read(); //ここでTOUTの値を取得
 return res; 
}
 
void loop() {
 int val= getToutValue();
 delay(50);                               //LCDドライブの処理時間待
 Serial.print("1,01,value:");
 if(val<1000){Serial.print(" ");}
 if(val<100){Serial.print(" ");}
 Serial.print(val);
 Serial.println("              ");
 delay(50);                              //LCDドライブの処理時間待
 Serial.println("2,01,                "); //2行目は空白にする

 //delay(1000); 

 if(val > 580){
 digitalWrite(13, HIGH);
 delay(500); 
 }
 else{
 digitalWrite(13, LOW); 
 delay(500); 
 }
}
}
3.3V-UARTドライブのLCDの利用確認をしました。ESP8266のボーレイトをR8C/M12Aの私の常用として9600bpsにしています。115200bpsで使えるほうが便利なのですが、R8C/M12Aはこの速度には対応できませんでした。なお、R8C/M12Aのソフトウエアの時間から連続して表示命令を出すと間に合わないようです。50msのdelayを入れると計画した表示になりました。当然Teratermの速度も落ちるのですが私には問題ではありません。
top




 7 I2C-LCDモジュール(3V3化)    2017.12.09
 arduino pro mini で使った「LCD I2Cインタフェース ボード試用」の”中国製LCDとEasyWordMall 1602 LCD ブラック IIC/I2C/TWI/SPI シリアル インタフェース ボード モジュールの組み合わせ”がESP8266-WROOM-02で使えるかどうかを試してみることにしました。

少し困ったことに、LCDは5V仕様に対してWROOM-02はmax3.6Vとなっています。また、インターフェイスボードの3.3V対応も調べる必要があります。
aruduino pro mini のLCD装置を3.3VにするとLCDの文字が見えなくなります。しかし、ルーペを使ってよく見ると正しい文字が表示されているのを発見しました。これは変換モジュールが正しく働いていることになります。

問題はLCDの表示だけです。LCDのVo端子にマイナスを供給すると正常に表示することが過去の例でわかっているのでその方法を考えます。しかし、今回はピンヘッダをはんだ付けしているのでVo端子を切り出すのが面倒です。
LCD側のハンダを吸い取り機で処理するとfreeになりました。モジュール側は吸い取り機がうまく働きません。ハンダ鏝でピンを長く熱してピンを固定しているプラスチックを柔らかくし強く押すとピンが動きました。反対側からペンチで引きながら加熱を続けるとピンヘッダが熱で壊れてペンチで引き抜くことができました。

乾電池の-1.5VをVoにつなぐと明るくなりすぎて読めません。2.7kを間に入れると読めるようになりました。これで適当な抵抗を介してマイナス電源を繋げば良いことになります。

負電源は7404タイプで発振してショットキーダイオードで整流すれば得られます(整流法の名は知りません)。今回は過去に知人からもらった SN74LV04APW を使いました。フラットパッケージで小さくできましたがハンダ付けにやや苦労しました。


ショットキーダイオードは今回は少し大きいのですが、40V 1A で 50個 ¥137 の中国製を使いました。無負荷ですと電源電圧とほぼ同じ負電源が得られます。直接Voにつなぐとオーバーになりましたので幾つか抵抗を試したところで4.7kの固定としました。



テストのスケッチは、pro mini で作ったものをボードを Generic ESP8266 Module を指定して再コンパイルするとそのまま実行できました。

なお、回路は SDAとSCLをデフォルトの IO4(SDA)、IO5(SCL)につなぎそれぞれ10kでプルアップしています。

あとがき:
I2C変換モジュールをLCDに完全はんだ付けしたものを改良しましたので手間がかかりました。結果的にモジュールの可変抵抗器が使えなくなっています。はんだ付け前に工夫すると利用できたかもしれません。もう1台ありますがやはり3.3V仕様に改良すると思います。MCは5Vでも周辺回路は3.3Vものが多いように感じます。
久しぶりに8266を触ると忘れていることが多いようです。リセットスイッチとIO0スイッチもどちらかな?という状態です。書込み時はリセットスイッチONの状態でIO0スイッチを押していればよい(同時に押して、リセットを先に離す)ということも後で自分の文を読んで思い出しています。
書込みの変換器もCH340が上手くゆかず、cp2102がOKと再確認しました。
Arduino-IDEが走るから当然とは言え、AVRとesp8266が同じプログラムで使えるのは驚きです。
        作者の覚え書き:C:\_0MicroComp\Arduino181\sketchbook\201711\HelloWorld_i2c_02

(2017.12.10) 2つ目を作りました。
ダイオードはショットキーではなく一般のシリコンを使ってみました。Vfがやや大きいので1kの抵抗で適当なコントラストになりました。これならショットキーを使わなくても良さそうです。
多少はまとまりが良くなったかな。
top


















工事中
























    2017.02.12

top
inserted by FC2 system