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 





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

結線は次のとおりです。


基本回路を追加しました。(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のFT323RFを使った自作ものに変えると通信できました。


うまく通信できないときは、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.03.14

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

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


やや暗い状態でCdSの抵抗値を測ったところ約7kΩだったので分圧抵抗は15kΩとしました。CdSに掛かる電圧は 3.3V*7/(15+7)=1.05V となります。暗い状態では1Vを少し超えますが目をつぶります。Arduino-IEDでは最高電圧値を1024で示すようです。この値が端子のmV値を表していると考えて良いと思います。
シリアルモニタの値は10WLED電球の下に置いた状態で、途中手で光を遮っています。

アナログ入力端子は1つしかありませんが、0〜1Vに調整した入力を測定するには簡単で便利だと思いました。
  プログラムです。
//ESP-WROOM-02でアナログ入力をするために必要
extern "C" {
#include "user_interface.h"
}
 
void setup() {
 Serial.begin(115200); //シリアル通信も通常のArduinoとは違う
 pinMode(13, OUTPUT);
}
 
void loop() {
 int val= system_adc_read();//ここでTOUTの値を取得
 Serial.print("value:");
 Serial.println(val);
 
 if(val > 580){
 digitalWrite(13, HIGH);
 delay(2000); 
 }
 else{
 digitalWrite(13, LOW); 
 delay(2000); 
 }
}
top


















工事中
























    2017.02.12

top
inserted by FC2 system