macsbug

Just another WordPress.com site

Archive for 10月 2015

ESP8266 と I2C

leave a comment »

ESP8266 における I2C の配線とプログラム方法を示します。                                                    2015.10.24



I2C は、SCL と SDA 信号を使用し、使用する為には、ピン番号を設定する必要があります。
I2C の配線は Liblary の Wire で定義します。
スケッチは、以下。

#include <Wire.h>
void setup(){
Wire.begin(SDA,SCL) ;
}

例:Wire.begin(0,2) ;  : GPIO_0 と OLED の SDA を接続。 GPIO_2 と OLED の SCL を接続。


確認方法:

ESP8266 単体で I2C OLED を動かす」の回路を使用し、全てのピンの組み合わせを確認しました。

例:Wire.begin(0,2) ;   Wire.begin(14,0) ;


結果:
左、SDA 端子 0,2,4,4,12,13,14 と 右、SCL端子 0,2,4,4,12,13,14 の組み合わせを全て確認。
全ての端子は Wire.begin(SDA,SCL)  の設定で使用可能である事が解かりました。

SCL
  SDA
 GPIO 0 2 4 5 12 13 14
0  OK  OK  OK  OK  OK  OK
2  OK  OK  OK  OK  OK  OK
4  OK  OK  OK  OK  OK  OK
5  OK  OK  OK  OK  OK  OK
12  OK  OK  OK  OK  OK  OK
13  OK  OK  OK  OK  OK  OK
14  OK  OK  OK  OK  OK  OK

 


メモ:
ESP8266 のマニュアルは、I2C の記載があいまいで分かり難い。
ネットの記事では、動いた、動かない、GPIO_14=SCL固定 である等、多数の記事がある。
その為に、実際に全てのピン動作を確認しました。
今回は、ESP-WROOM-02 で確認しました。
確認するピンの数は多く時間を要しましたが、動く事が確認でき便利になりました。
結果論ですが、ESP-01(GPIO_0,GPIO_2 )でも使用する事が必要ですから、当たりまえといえば当たり前。
ESP-01は、同じ CPU を使用し端子は 8本です。CPUのGPIO端子を引き出せば、使える事になります。


 

広告

Written by macsbug

10月 23, 2015 at 10:05 pm

カテゴリー: ESP8266

ESP8266 ファームウェアアップデート

leave a comment »

ESP8266 に、スケッチを書き込むと、AT コマンドが使えなくなる。                 2015.10.21


AT コマンドを使えるようにするには、マックでターミナル操作が必要となります。
ターミナル操作は面倒ですが、手順をまとめ、確認しました。(ESP-01で確認)


手順: ターミナルと esptool を使用した方法。
01. ESP8266 の GPIO_0 を GND にする。
02. USB接続したデバイス名を Arduino IDEで調べてメモる。例:cu.usbserial-A9MX5FJ3
03. esptool-master.zip をダウンロードし、解凍されると esptool-master フォルダーができる。
04. ファームウエアーの入手:New-AI-v0.9.5.0 AT Firmware フォルダーの中から、
_   AI-v0.9.5.0 AT Firmware.bin をダウンロードしファイル名を a.bin に変更し
_   esptool-master フォルダーに入れる。
05. 以下、ターミナル入力
06. cd desktop/esptool-master/
07. sudo python setup.py install
08. ESP8266 のRST端子をGNDにしてOPENする。(RESETをかける)
09. 以下の文に、メモしたUSBデバイス名を入れてターミナル入力する。
10. esptool.py -p /dev/cu.usbserial-A9MX5FJ3 write_flash 0x000000 a.bin
11. Connecting…
_      Erasing flash…
_   Writing at 0x00019400… (20 %)
_      Wrote 520192 bytes at 0x00000000 in 56.2 seconds (74.0 kbit/s)… を表示して終了。
12. ESP8266 の GPIO_0 を OPEN にする。
13. ESP8266 のRST端子をGNDにしてOPENする。(RESETをかける)
14. ATコマンドで調べる。


メモ:
1. o.9.5.2 のバージョンは、0.952 support SmartLink:v0.9.5.2 AT Firmware.bin
2. sudo python setup.py install は、ライブラリー内の Python 2.7 に、easy-install.pth,
_  esptool-0.1.0-py2.7, pyserial-2.7-py2.7 を作成し、Python が動作するようになる。
_  1度作成すればよいので次回から 「sudo python setup.py install 」は、不要となる。
3. ESP-WROOM-02 については、未検証です。
4. メモリーを書き換える操作は、書き換えてはいけない部分を書き換えてしまう場合があります。
_  たとえば、MacAddress を書き換えてしまうとかです。この記事は、私の備忘録の為にメモしたものです。
_  もとに戻らなない場合もありますので、実施する場合は各自の責任で行ってください。
_  また、ESP-WROOM-02 の場合は、技適の件がありますので、各自でお調べください。
5. ここでの事例は、全てのESP8266 に対してのものではない。


参考:
ATコマンドできない件:
Cerevo TechBlog:
_ ESP8266モジュール単体でミニ四駆をワイヤレス化!(技適済みWi-Fiモジュール[ESP8266]で始めるIoT入門)
_ Cerevoブレイクアウトボードで単体使用する場合の注意点が3点あります。
_ 3  一端書き込むと、「B」位置に戻しても、ATコマンドを受け付けるデフォルトの状態には戻りません
_ 戻すにはArduinoIDEではなく、別のツールが必要になります。

epstool の件:
hokori.net:EPSのTIFFプレビューを取得追加などできる 「epstool」
ESP8266 JAPAN:アップロードの実際(esptool-ck編)
JUNKHACK:espeink make その3
Qiita:ESP8266のファームウェアを更新する

MemoryMapの件:
ESP8266 Memory Map
Memory Map:
BRILLIANTSERVICE TECHNICAL BLOG:技適OKな中華IoTモジュールを使いこなす
Firmware Over The Air (FOTA) for ESP8266 SoC


 

 

Written by macsbug

10月 21, 2015 at 5:02 am

カテゴリー: ESP8266

ESP8266 + NTPCliant で時刻を取得し OLED に表示する

leave a comment »

ESP8266 + NTPCliantESP8266 + OLED を組み合わせて NTP時計を作る。   2015.10.19
NTPを使用すると、RCT(リアルタイムクロック) や GSP、電波時計より便利かと思います。
ネットワークがあれば、時刻が取得できる訳です。


基礎知識:不勉強ながら注意が必要と思いました。
NTP (network time protocol)とは、TCP/IPネットワークを通じて正しい現在時刻を取得するため
のプロトコルの一つ。コンピュータの内部時計の時刻を正しく調整するために、ネットワーク上で
時刻情報を配信しているサーバに問い合わせる手順を定義したもの。目的は、時刻合わせの為。
NTPへの短時間の繰り返しアクセスは、ネットワークや自宅回線の負荷になる為、注意が必要です。



準備:
1. ESP8266(ESP-WROOM-02) +  I2C OLED(128 x 64) 。
2. Udp NTP Client:ESP8266WiFi のサンプルを試す:NTPCliant
3. OLED:ESP8266 単体で I2C OLED を動かす
4. Arduino IDE と ESP8266 開発環境。既に習熟済みである事。


配線:ESP8266 と OLED の配線は、信号線2本のみです。
_  ESP8266 IO_14 (14) — OLED (SCL)、ESP8266 IO_13 (13) — OLED (SDA) 。
_  他の IO 端子を使用してもかまいません。
_  ESP8266 の使用する端子は、10kΩ で +3.2V へプルアップしておきましょう。
_  ESP-01 の場合:例:ESP-01  IO_0 — OLED (SDA)、 IO_2 — OLED (SCL) 。
スケッチの設定:SSID、Passwarod は、各自の環境にあわせて入力の事。


謝辞:
NTP Client は、Sandeep Mistry氏の「NTPClient」を使わせて頂きました。
OLED は、Chiang Mai Maker Clubの「ESP_Adafruit_SSD1306」を使わせて頂きました。


参孝:
Network Time Protocol
Network time syncronized clock for Arduino



// ESP8266(ESP-WROOM-02) + OLED(128 x 64) + Udp NTP Client

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Time.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <ESP_Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

char ssid[] = "xxxx";   // your network SSID (name)
char pass[] = "xxxxxx"; // your network password
unsigned int localPort = 2390; // local port to listen for UDP packets
IPAddress timeServerIP(129, 6, 15, 28); // time.nist.gov NTP server
const char* ntpServerName = "time.nist.gov";// time.nist.gov NTP server address
const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
WiFiUDP udp; // UDP instance to let us send and receive packets over UDP

void setup(){
 Wire.begin(13,14);      // SDA(GPIO_13), SCL(GPIO_14)
 display.begin(SSD1306_SWITCHCAPVCC, 0x78>>1);
 display.clearDisplay(); // Clear the buffer.
 display.setTextSize(1); // font size 1 ( minnimum )
 display.setTextColor(WHITE);
 display.setCursor(0,0);display.print("Connecting to");
 display.setCursor(0,9);display.print("ssid =");
 display.setCursor(40,9);display.print(ssid);display.display();
 WiFi.begin(ssid, pass);
 int y=5;
 while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  display.setCursor(y,18);display.print(".");display.display();
  y = y + 5;
 }
 display.setCursor(0,27);display.print("WiFi connected");
 display.setCursor(0,36);display.print("IP:");
 display.setCursor(20,36);display.print(WiFi.localIP());display.display();
 display.setCursor(0,45);display.print("Starting UDP");display.display();
 udp.begin(localPort);
 display.setCursor(0,54);display.print("Local port:");
 display.setCursor(68,54);display.print(udp.localPort());display.display();
 delay(3000);
}

void loop(){
WiFi.hostByName(ntpServerName, timeServerIP);//get a random server from the pool
 display.setTextSize(1);display.setCursor(120,0);
 display.print("*");display.display(); // sending NTP packet...on
 sendNTPpacket(timeServerIP); // send an NTP packet to a time server
 delay(1000); // wait to see if a reply is available
 int cb = udp.parsePacket();
 if (!cb) {}
  else { // We've received a packet, read the data from it
  udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
  unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
  unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
  unsigned long secsSince1900 = highWord << 16 | lowWord; // NTP time
  const unsigned long seventyYears = 2208988800UL; // subtract seventy years:
  unsigned long epoch = secsSince1900 - seventyYears; //Unix time:
  setTime(epoch + (9 * 60 * 60)); // JST +‹9 HR

  display.clearDisplay();display.setTextSize(2);
  String ms="";String ds="";
  if (month() < 10){ ms="0";}
  if (day() < 10){ ds="0";}
  String ymd=String(year())+"."+ms+String(month())+"."+ds+String(day());
  display.setCursor(5,10);display.print(ymd);display.display();

  String hs="";String mi="";String ss="";
  if (hour() < 10){ hs="0";}
  if (minute() < 10){ mi="0";}
  if (second() < 10){ ss="0";}
  String hm=hs+String(hour())+":"+mi+String(minute());
  display.setCursor(18,40);display.print(hm);display.display();
 }
 display.setTextSize(1);display.setCursor(120,0);
 display.print(" ");display.display(); // sending NTP packet...off
 delay(10000); // wait ten seconds before asking for the time again
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address){
 memset(packetBuffer, 0, NTP_PACKET_SIZE);// set all bytes in the buffer to 0
 // Initialize values needed to form NTP request
 // (see URL above for details on the packets)
 packetBuffer[0] = 0b11100011; // LI, Version, Mode
 packetBuffer[1] = 0; // Stratum, or type of clock
 packetBuffer[2] = 6; // Polling Interval
 packetBuffer[3] = 0xEC; // Peer Clock Precision
 packetBuffer[12] = 49; // 8 bytes of zero for Root Delay & Root Dispersion
 packetBuffer[13] = 0x4E;
 packetBuffer[14] = 49;
 packetBuffer[15] = 52;
 udp.beginPacket(address, 123); //NTP requests are to port 123
 udp.write(packetBuffer, NTP_PACKET_SIZE);
 udp.endPacket();
}


 

 

Written by macsbug

10月 19, 2015 at 12:27 pm

カテゴリー: ESP8266

ESP8266 単体で I2C OLED を動かす

leave a comment »

ESP8266 単体で OLED を動かす。                                                                                             2015.10.18

ESp8266 で、表示装置が簡単に使えるようになると、多彩な電子工作が出来ます。
たとえば、動作確認の為の、LED や Arduinoにあるシリアルモニターを
このディスプレーで表示する事ができ、部品が不要になります。



準備:
1. ESP8266:秋月電子通商の ESP-WROOM-02 と基板。
2. OLED:Blue 0.96 int I2C 128X64 OLED Display。I2C 128X64 OLED Display for Arduino を参照の事。
3. ESPとOLEDの配線:2本。ESP8266(IO_0) – OLED(SDA)、(IO_1) – OLED(SCL)。Vcc=+3.2V,GND=GND。
4. Liblary: ESP_Adafruit_SSD1306
5. Liblary: Adafruit_GFX
6. Arduino IDE:ライブラリ−のインストール方法と、ESP8266 への書き込み方法は習熟済みである事。


ポイント:
I2C :配線は Liblary の Wire で定義する。
基本:Wire.begin(SDA,SCL);  例:Wire.begin(0,2);  0:GPIO_0,  2:GPIO_2
SDAとSCLは、OLEDの端子に記載されている。
ESP8266 側は、空いているGPIO端子を使用する。尚、10kohm程度でプルアップ(+)しておく事。
注:ESP8266 に於ける、I2C の端子の解説は多数あり要注意の事。ESPのマニュアルの記載は解りにくい。

OLED:
_ 特徴:とにかく明るく見易い。配線数4本のみ。グラッフィック可能。文字、画像表示のサンプルあり。
_    サンプルは非常に良く出来ていて、参考にすると多彩な表現が容易に出来ます。
_ 電源:ESP8266と同じ、3.2Vで動作する。
_ 電源端子:販売されているOLEDは、2種類有り、VCC とGND の配置が逆になっているので、要注意!!
_ アドレス:OLED の基板の裏に書いてある。例:0x7A、0x78
_ スケッチとアドレス:Setupで、display.begin(SSD1306_SWITCHCAPVCC, 0x78>>1); と定義する。
_ 価格:ブログ記載時、ebayにて 883円。国内で高い場合は、共同購入しましょう。

ESPの電源:
_ 電源の入力は容量の大きな物を使用する事。これが前提です。
_ 秋月の基板は良く出来ています。それは、ESPの裏側が全面グランドパターンになっているからです。
_ ノイズ対策ができます:基板に小さな穴を開け、ESPの裏のグランドと基板のグランドをハンダ付けする。
_ さらに、3端子のグランドを基板のグランドに付け、放熱させる事が出来る。
_ 端子と3端子のグランドが接近している為、他の端子周辺には絶縁テープを付ける事。
_ この時、3端子の出力は、最大限、ESPの電源端子に近づけてハンダ付けする事。
_ 3端子のグランド側は極力太い線か銅板でグランドに付ける。
_ 3端子Regulatorの入出力には、1uFと10uFのチップ積層電解コンデンサーを付ける。
_ さらに、47uFの導電性高分子アルミ個体電解コンデンサーを付けると、かなり安定します。
_ 以上、Analog Discovery にて、ESPの電源端子をモニターして確かめた内容です。
_ この事を、順序立てて行う事により、大きなコンデンサーを付ける必要はなくなります。
_ 尚、写真は製作中のもので、3端子は横に付けてあるとか、47uF は外してあります。


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <ESP_Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

void setup() {
Wire.begin(0,2);  // (SDA,SCL):ESP8266(IO_0)-OLED(SDA),(IO_1)-OLED(SCL)
display.begin(SSD1306_SWITCHCAPVCC, 0x78>>1); // OLED ADDRESS
display.clearDisplay(); // Clear the buffer.
}

void loop() {
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(30,10);
display.println("Hello");
display.setCursor(30,40);
display.println("World");
display.display();
delay(2000);
}

参考:
มาเล่น ESP8266 กับจอ OLED 128×64 ด้วย Arduino ESP กัน
nathan.chantrell.net:WiFi MQTT Display with the ESP8266


Written by macsbug

10月 19, 2015 at 2:06 am

カテゴリー: ESP8266

ESP8266WiFi のサンプルを試す:mDNS_Web_Server

leave a comment »

ESP8266 のサンプルが動く事を確かめる。                 2015.10.18

その2: mDNS_Web_Server



準備:
ハード :ESP-WROOM-02 及び 書き込み環境が用意されている事。
開発環境:Arduino IDE 1.6.5:Tools -> Board に Generic ESP8266 Module の設定及び選択されている事。
スケッチ:ESP8266WiFi のサンプルを試す:WiFiAccesspoint と同様。esp8266/libraries を使用する。


スケッチを選択する:
Liblary > esp8266 > ESP8266mDNS > mDNS_Web_Server


スケッチの変更:
冒頭にある、以下の SSID と Password に、使用するルーターの値を入力する。
const char* ssid = “…………”;
const char* password = “…………..”;


ブラウザーに、ESPのIP(例:192.168.100.26)を入力すると、ESP の mDNS_Web_Server から 返事が来る。
これで、HTTPサーバーが出来る訳です。
以上で、動きました。


参考:
ともの技術メモ:ESP-8266用ArduinoIDEでサンプルを動かす


 

Written by macsbug

10月 17, 2015 at 10:50 pm

カテゴリー: ESP8266

ESP8266WiFi のサンプルを試す:NTPCliant

with one comment

ESP8266 のサンプルが動く事を確かめる。                 2015.10.17

その2:NTPCliant


日本時間:JST is 2015/10/15 9:28:18 が表示されている。

UTC time: The UTC time is 0:28:18 が表示されている。


準備:
ハード :ESP-WROOM-02 及び 書き込み環境が用意されている事。
開発環境:Arduino IDE 1.6.5:Tools -> Board に Generic ESP8266 Module の設定及び選択されている事。
スケッチ:ESP8266WiFi のサンプルを試す:WiFiAccesspoint と同様。esp8266/libraries を使用する。
ルーター:NTP の ポート 123 ( TCP/UDP )を開けておく事。TCP か UDP は、用途に応じて設定する事。


スケッチを選択する:
Liblary > esp8266 > ESP8266WiFi > examples > NTPCliant


スケッチの変更:
冒頭にある、以下の SSID と Password に、使用するルーターの値を入力する。
char ssid[] = “*********”; // your network SSID (name)
char pass[] = “********”; // your network password

時間の値を変更する:
取得した時間の値は、UNIX Time の為、日本時間に変更するスケッチを追加する。
スケッチの 2/3程の場所にある以下
// now convert NTP time into everyday time:
Serial.print(“Unix time = “);
// Unix time starts on Jan 1 1970. In seconds, that’s 2208988800:
const unsigned long seventyYears = 2208988800UL;
// subtract seventy years:
unsigned long epoch = secsSince1900 – seventyYears;
// print Unix time:
Serial.println(epoch);

の下に、次のスケッチを追加する。

Serial.println();
// Timeライブラリに時間を設定(UNIXタイム)し日本標準時にあわせる。+9時間
setTime(epoch + (9 * 60 * 60));
Serial.print(“JST is “);
Serial.print(year());
Serial.print(‘/’);
Serial.print(month());
Serial.print(‘/’);
Serial.print(day());
Serial.print(‘ ‘);
Serial.print(hour());
Serial.print(‘:’);
Serial.print(minute());
Serial.print(‘:’);
Serial.println(second());
Serial.println();


以上で、動きました。

setTime(UTC + (9 * 60 * 60));  により
年=year()、月=month()、日=day()、時=hour()、分=minute()、秒=second() が取得できます。


メモ:時間は応用性が広い為、役に立ちます。
_ ネット環境さえあれば、RTC(リアルタイムクロック)やGPS、電波時計を使用しなくとも直ぐ使える訳です。


参考:
Ardunio:Arduino Time library
PJRC:Time library
なんでも作っちゃう、かも:NTPを使ってインターネット経由で時刻をあわせる
Fourmotion:Display Internet based Time (NTP)


 

Written by macsbug

10月 17, 2015 at 8:11 am

カテゴリー: ESP8266

ESP8266WiFi のサンプルを試す:WiFiAccessPoint

leave a comment »

ESP8266 のサンプルが動く事を確かめる。           2015.10.17

その1:WiFiAccessPoint



準備:
ハード :ESP-WROOM-02 及び 書き込み環境が用意されている事
開発環境:Arduino IDE 1.6.5:Tools -> Board に Generic ESP8266 Module の設定及び選択されている事。
スケッチ:Sandeep Mistry氏の sandeepmistry から esp8266-Arduino をダウンロードする。
_ 必要の無い物もある為、ここでは、esp8266 というフォルダーを作り Liblary をまとめる。
_ 以下の Liblary(ESP8266WiFi等々) の中味を esp8266 フォルダーに入れ Arduino のライブラリ−に入れる。
_ esp8266-Arduino > esp8266com/esp8266 > libraries > ESP8266WiFi等々
_ 追記: 2016.06.21:ライブラリ WiFiAccessPoint のURL:WiFiAccessPoint


スケッチを選択する:
Liblary > esp8266 > ESP8266WiFi > WiFiAccessPoint


スケッチの変更:
冒頭にある、以下の SSID と Password に、使用するルーターの値を入力する。

/* Set these to your desired credentials. */
const char *ssid = “xxx“;
const char *password = “xxxx“;


以上、これだけで、動きました。

 

Written by macsbug

10月 17, 2015 at 7:52 am

カテゴリー: ESP8266