{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "オリジナルの作成:2015/11/03\n", "\n", "注意! ESP8266を単体で使うと、初期に書き込まれているプログラムを上書きし、ATコマンドが使えなくなります。 WiFiを使う場合には、ESP8266のWiFi用APIを使用することになります。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 0R-ESP8266を単体で使う\n", "## ESP8266の使い方\n", "ESP-WROOM-02に搭載されているESP8266は、単体としてもArduinoと同じように 使えることが以下のサイトに紹介されていました。\n", "\n", "- [技適済み格安高性能Wi-FiモジュールESP8266をArduinoIDEを使ってIoT開発する為の環境準備を10分でやる方法](http://qiita.com/azusa9/items/264165005aefaa3e8d7d)\n", "\n", "これに習って開発環境を整えてみます。\n", "\n", "### ArduinoIDEを整備\n", "esp8266をArduinoIDEで開発できるようにコミュニティが活動されています。\n", "\n", "- https://github.com/esp8266/Arduino\n", "\n", "esp8266の開発には1.6.4のArduino IDEを使いました。\n", "\n", "- https://www.arduino.cc/en/Main/OldSoftwareReleases#previous\n", "\n", "開発環境には少し古い1.6.4-673-g8cd3697(2015/05/22版)のバージョンを使用します。 Arduino IDEを起動し、Arduino Preferrencesを起動し、 Additional Boards Manager URLs: に以下のURLをコピーしてください。\n", "\n", "```\n", "http://arduino.esp8266.com/versions/1.6.4-673-g8cd3697/package_esp8266com_index.json\n", "```\n", "\n", "ツール→Boards Managerを選択し、スクロールするとesp8266が表示されるので、 これをクリックし、Installボタンを押します。\n", "\n", "\n", "\n", "これで、ボードメニューの下に「Generic ESP8266 Module」が表示されますので、これを選択します。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ブレッドボードでLチカを試す\n", "ESP8266のピン配置をCerevo TechBlogさんのブログから再度引用します。\n", "\n", "\n", "\n", "JP1は、GNDとIO0をショートさせてUART DownLoad Modeにします。 \n", "\n", "シリアルモジュールと USBシリアルモジュール との接続は、以下の通りです。RSTとシリアルのDTRの間に0.1μFのコンデンサーを入れ、 ArduinoIDEの書き込み時にリセットが掛かるようにします。\n", "\n", " | ESP-WROOM-02\t | USBシリアル | \n", " |---|---|\n", " | 12 TXD\t | RXD | \n", " | 11 RXD\t | TXD | \n", " | 15 RST | 0.1μF経由\tDTR | \n", " \n", "\n", "\n", "\n", "### ESP8266のピン配置\n", "ねむいさんのブログからESP-WROOM-02のピンの仕様を引用します。\n", "\n", "\n", "\n", "ESP8266用のArduinoについては、以下のマニュアルを参照できます。\n", "\n", "- https://github.com/esp8266/Arduino/blob/master/doc/reference.md\n", "\n", "ユーザが利用可能なピンは以下の通りです。\n", "\n", " | ESP-WROOM-02\t | Name\t | I/O\t | ArduinoIDE | \n", " |---|---|---|---|\n", " | 4\t | IO12\t | INPUT, OUTPUT, INPUT_PULLUP, PWM, SDA\t | 12 | \n", " | 5\t | IO13\t | INPUT, OUTPUT, INPUT_PULLUP, PWM\t | 13 | \n", " | 10\t | IO4\t | INPUT, OUTPUT, INPUT_PULLUP, PWM\t | 4 | \n", " | 14\t | IO5\t | INPUT, OUTPUT, INPUT_PULLUP, PWM, SCL\t | 5 | \n", " | 16\t | TOUT\t | AnalogIn (0 - 1.0V)\t | A0 | \n", " | 17\t | IO16\t | INPUT, OUTPUT, INPUT_PULLDOWN_16,PWM\t | 16 | \n", "\n", "### バージョン1.6.5ではコンパイルできない\n", "バージョンではMac OSX10.7.5でコンパイルすると以下の様なエラーがでましたので、 Arduino IDE1.6.4とesp8266の開発環境も1.6.4を使用します。\n", "\n", "\n", "\n", "```\n", "/Users/ユーザ名/Library/Arduino15/packages/esp8266/tools/esptool/0.4.5/esptoolが139を返しました。\n", "コンパイル時にエラーが発生しました。\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 定番LチカでI/Oをチェック\n", "LEDと抵抗470Ωを直結してGNDに接続し、ESP-WROOM-02の5番ピン(Arduinoの13)に接続します。\n", "\n", "これで、サンプルプログラムBlinkをアップロードすれば、Lチカの完成です。\n", "\n", "上手く行ったら、以下のピンでも試してみてください。\n", "\n", "- 4: Arduinoの12\n", "- 5: Arduinoの13(最初に確認済み)\n", "- 10: Arduinoの4\n", "- 14: Arduinoの5\n", "- 17: Arduinoの16\n", "\n", "### 温度を測る\n", "ESP-WROOM-02でのアナログリードについて、以下のサイトを参考にさせて頂きました。\n", "\n", "- http://qiita.com/azusa9/items/26e74e4e0d5773ce9c41\n", "\n", "注意:最初にリセットの配線をしていると、以下のSerialが正常に動作しません。 一度、LED点滅のテストが修了したら、リセットに使った配線は外して下さい。\n", "\n", "USBシリアルのリセットを外したので、スケッチを書き込む時には一度 USBシリアルを外してから行ってください。\n", "\n", "以下のスケッチでアナログ入力の値をみてみましょう。\n", "\n", "```C++\n", "#include \n", "extern \"C\" {\n", "#include \"user_interface.h\"\n", "}\n", "\n", "void setup() {\n", " Serial.begin(9600);\n", " Serial.println(\"start\");\n", "}\n", "\n", "void loop() {\n", " delay(1000);\n", " int val = system_adc_read(); //analogRead(A0);\n", " Serial.println(val);\n", "}\n", "```\n", "\n", "analogRead(A0)を使うと外れた値(918)が返ってきました。 これを上記サイトのsystem_adc_read()に替えると、実測値に近い値(259)が テスターの値が245.8mVで259/1023x1.0V=0.253Vと近い値が返されます。\n", "\n", "\n", "\n", "\n", "### タクトスイッチを追加\n", "次に、タクトスイッチを追加して、ボタンを押したときだけ温度を測るように 修正します。\n", "\n", "ブレッドボードに以下の様にタクトスイッチを追加します。 抵抗値は10KΩ、ESP-WROOM-02の10ピン(IO4)に接続します。\n", "\n", "\n", "\n", "タクトスイッチを押すと、シリアルモニタにLM35の読み取り値が表示されます。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## IFTTTに温度を送る\n", "準備が整ったで、LM35で読み取った温度をIFTTTに送ってみます。\n", "\n", "スケッチは、以下の通りです。\n", "\n", "```C++\n", "#include \n", "extern \"C\" {\n", "#include \"user_interface.h\"\n", "}\n", "\n", "#define ST_SSID \"SSID名\"\n", "#define ST_PASSWD \"SSIDのパスワード\"\n", "#define SERVER_NAME \"maker.ifttt.com\" \n", "#define SERVER_PORT 80\n", "\n", "#define EVENT \"RecordLM35\"\n", "#define SECRET_KEY \"ここにSECRET_KEYを入れてください\"\n", "\n", "int sw_pin = 4;\n", "int led_pin = 13;\n", "int lm35_value;\n", "char buf[128];\n", "WiFiClient client;\n", "\n", "void setup() {\n", " Serial.begin(9600);\n", " Serial.println(\"start\");\n", " // ピンの初期設定\n", " pinMode(sw_pin, INPUT);\n", " pinMode(led_pin, OUTPUT);\n", " digitalWrite(led_pin, LOW);\n", " // WiFiの設定\n", " // WiFiクライアントモードに設定\n", " WiFi.mode(WIFI_STA);\n", " // WiFiへの接続\n", " WiFi.begin(ST_SSID, ST_PASSWD);\n", " // 接続が完了するまで、LEDを点滅\n", " while (WiFi.status() != WL_CONNECTED) {\n", " digitalWrite(led_pin, HIGH);\n", " delay(500);\n", " digitalWrite(led_pin, LOW);\n", " delay(500);\n", " }\n", " // 接続が完了したら、LEDを点灯\n", " digitalWrite(led_pin, HIGH);\n", "}\n", "\n", "void loop() {\n", " if (digitalRead(sw_pin) == LOW) {\n", " Serial.println(\"SW pressed\");\n", " // チャタリング防止\n", " Serial.println(500);\n", " lm35_value = system_adc_read(); //analogRead(A0);\n", " int temp10 = (int)((lm35_value*1.0)/1023.0*1000); // 温度を0.1度までの整数に変換\n", " sprintf(buf, \"temp=%d.%df\", temp10/10, temp10%10);\n", " Serial.println(buf);\n", " // \n", " if (client.connect(SERVER_NAME, SERVER_PORT)) {\n", " Serial.println(\"connected\");\n", " // makerのIFTTTにイベントを送る\n", " sprintf(buf, \"GET /trigger/%s/with/key/%s?value1=%d.%d HTTP/1.1\", EVENT, SECRET_KEY, temp10/10, temp10%10);\n", " client.println(buf);\n", " client.println(\"Host: maker.ifttt.com\");\n", " client.println(\"Accept: */*\"); \n", " client.println();\n", " Serial.println(\"Request has sent!\");\n", " } \n", " } \n", "}\n", "```\n", "\n", "ルータへの接続確認のために、LEDも付けました。 単独で動かすときには、JP1の2と3ピンにジャンパーをセットします。 \n", "\n", "\n", "\n", "iPhoneには、IFTのイベントが発行されたとの通知が無事届きました。\n", "\n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 0 }