Arduino勉強会

2015/11/03からのアクセス回数 16705

注意! ESP8266を単体で使うと、初期に書き込まれているプログラムを上書きし、ATコマンドが使えなくなります。 WiFiを使う場合には、ESP8266のWiFi用APIを使用することになります。

ESP8266の使い方

ESP-WROOM-02に搭載されているESP8266は、単体としてもArduinoと同じように 使えることが以下のサイトに紹介されていました。

これに習って開発環境を整えてみます。

ArduinoIDEを整備

esp8266をArduinoIDEで開発できるようにコミュニティが活動されています。

esp8266の開発には1.6.4のArduino IDEを使いました。

開発環境には少し古い1.6.4-673-g8cd3697(2015/05/22版)のバージョンを使用します。 Arduino IDEを起動し、Arduino Preferrencesを起動し、 Additional Boards Manager URLs: に以下のURLをコピーしてください。

http://arduino.esp8266.com/versions/1.6.4-673-g8cd3697/package_esp8266com_index.json

ツール→Boards Managerを選択し、スクロールするとesp8266が表示されるので、 これをクリックし、Installボタンを押します。

th_install.png

これで、ボードメニューの下に「Generic ESP8266 Module」が表示されますので、これを選択します。

ブレッドボードでLチカを試す

ESP8266のピン配置をCerevo TechBlogさんのブログから再度引用します。

53f0389a5f6bf0a2dfde0073841dbd67.jpg

JP1は、GNDとIO0をショートさせてUART DownLoad Modeにします。 *1

シリアルモジュールと USBシリアルモジュール *2 との接続は、以下の通りです。RSTとシリアルのDTRの間に0.1μFのコンデンサーを入れ、 ArduinoIDEの書き込み時にリセットが掛かるようにします。

ESP-WROOM-02USBシリアル
12 TXDRXD
11 RXDTXD
15 RST 0.1μF経由DTR

brd_setting.png

ESP8266のピン配置

ねむいさんのブログからESP-WROOM-02のピンの仕様を引用します。

ESP-WROOM-02_pin.png

ESP8266用のArduinoについては、以下のマニュアルを参照できます。

ユーザが利用可能なピンは以下の通りです。

ESP-WROOM-02NameI/OArduinoIDE
4IO12INPUT, OUTPUT, INPUT_PULLUP, PWM, SDA12
5IO13INPUT, OUTPUT, INPUT_PULLUP, PWM13
10IO4INPUT, OUTPUT, INPUT_PULLUP, PWM4
14IO5INPUT, OUTPUT, INPUT_PULLUP, PWM, SCL5
16TOUTAnalogIn (0 - 1.0V)A0
17IO16INPUT, OUTPUT, INPUT_PULLDOWN_16,PWM16

最新のバージョン1.6.5ではコンパイルできない

最新のバージョンではMac OSX10.7.5でコンパイルすると以下の様なエラーがでましたので、 Arduino IDE1.6.4とesp8266の開発環境も1.6.4を使用します。

compile_error.png

/Users/ユーザ名/Library/Arduino15/packages/esp8266/tools/esptool/0.4.5/esptoolが139を返しました。
コンパイル時にエラーが発生しました。

定番LチカでI/Oをチェック

LEDと抵抗470Ωを直結してGNDに接続し、ESP-WROOM-02の5番ピン(Arduinoの13)に接続します。

これで、サンプルプログラムBlinkをアップロードすれば、Lチカの完成です。

上手く行ったら、以下のピンでも試してみてください。

温度を測る

ESP-WROOM-02でのアナログリードについて、以下のサイトを参考にさせて頂きました。

注意:最初にリセットの配線をしていると、以下のSerialが正常に動作しません。 一度、LED点滅のテストが修了したら、リセットに使った配線は外して下さい。

USBシリアルのリセットを外したので、スケッチを書き込む時には一度 USBシリアルを外してから行ってください。

以下のスケッチでアナログ入力の値をみてみましょう。

#include <ESP8266WiFi.h>
extern "C" {
#include "user_interface.h"
}

void setup() {
  Serial.begin(9600);
  Serial.println("start");
}

void loop() {
  delay(1000);
  int val = system_adc_read();  //analogRead(A0);
  Serial.println(val);
}

analogRead(A0)を使うと外れた値(918)が返ってきました。 これを上記サイトのsystem_adc_read()に替えると、実測値に近い値(259)が テスターの値が245.8mVで259/1023x1.0V=0.253Vと近い値が返されます。

LM35_test.png

タクトスイッチを追加

次に、タクトスイッチを追加して、ボタンを押したときだけ温度を測るように 修正します。

ブレッドボードに以下の様にタクトスイッチを追加します。 抵抗値は10KΩ、ESP-WROOM-02の10ピン(IO4)に接続します。

sw_brd.png

タクトスイッチを押すと、シリアルモニタにLM35の読み取り値が表示されます。

sw_monitor.png

IFTTTに温度を送る

準備が整ったで、LM35で読み取った温度をIFTTTに送ってみます。

スケッチは、以下の通りです。

#include <ESP8266WiFi.h>
extern "C" {
#include "user_interface.h"
}

#define ST_SSID       "SSID名"
#define ST_PASSWD     "SSIDのパスワード"
#define SERVER_NAME   "maker.ifttt.com"  
#define SERVER_PORT   80

#define EVENT         "RecordLM35"
#define SECRET_KEY    "ここにSECRET_KEYを入れてください"

int  sw_pin = 4;
int  led_pin = 13;
int  lm35_value;
char buf[128];
WiFiClient client;

void setup() {
  Serial.begin(9600);
  Serial.println("start");
  // ピンの初期設定
  pinMode(sw_pin, INPUT);
  pinMode(led_pin, OUTPUT);
  digitalWrite(led_pin, LOW);
  // WiFiの設定
  // WiFiクライアントモードに設定
  WiFi.mode(WIFI_STA);
  // WiFiへの接続
  WiFi.begin(ST_SSID, ST_PASSWD);
  // 接続が完了するまで、LEDを点滅
  while (WiFi.status() != WL_CONNECTED) {
    digitalWrite(led_pin, HIGH);
    delay(500);
    digitalWrite(led_pin, LOW);
    delay(500);
  }
  // 接続が完了したら、LEDを点灯
  digitalWrite(led_pin, HIGH);
}

void loop() {
  if (digitalRead(sw_pin) == LOW) {
    Serial.println("SW pressed");
    // チャタリング防止
    Serial.println(500);
    lm35_value = system_adc_read();  //analogRead(A0);
    int temp10 = (int)((lm35_value*1.0)/1023.0*1000);  // 温度を0.1度までの整数に変換
    sprintf(buf, "temp=%d.%df", temp10/10, temp10%10);
    Serial.println(buf);
    // 
    if (client.connect(SERVER_NAME, SERVER_PORT)) {
      Serial.println("connected");
      // makerのIFTTTにイベントを送る
      sprintf(buf, "GET /trigger/%s/with/key/%s?value1=%d.%d HTTP/1.1", EVENT, SECRET_KEY, temp10/10, temp10%10);
      client.println(buf);
      client.println("Host: maker.ifttt.com");
      client.println("Accept: */*");     
      client.println();
      Serial.println("Request has sent!");
    } 
  }  
}

ルータへの接続確認のために、LEDも付けました。 単独で動かすときには、JP1の2と3ピンにジャンパーをセットします。 *3

ESP8266_LM35_SW_LED.png

iPhoneには、IFTのイベントが発行されたとの通知が無事届きました。

IFT_Notifiaction.png

コメント

選択肢 投票
おもしろかった 8  
そうでもない 0  
わかりずらい 4  

皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。

スパム防止に画像の文字列も入力してください。


(Input image string)

*1 従ってATコマンドは使えなくなります。初期状態に戻すには、esp8266_flasher.exeを使ってFirmwareを書き込みます。
*2 FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)の互換モジュールで、Amazonで見つけました
*3 プログラムを書き込むには、JP1の1と2ピンにジャンパーをセット(IO0をGNDに接続)します。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc