今回はちょっと飛躍してWi-fi通信ができるモジュールに挑戦です。
下記の記事を参考に組み立てましたが、回路の方も前回よりも一気にハードルが上がって四苦八苦しました。
データを送受信をするIoTデバイスの作り方 [Arduino版]
使った部品
・Arduino UNO
・USBケーブル
・ブレッドボード
・Jumper Wires * 10
・ESP-WROOM-02(使用電圧: 3.0V~3.6V)
・10kΩ抵抗 * 3
ESP-WROOM-02は秋月電子通商で購入したこちらのDIP化キットで、ピンヘッダを半田付けすればモジュールの準備は完了です。
プログラム
Arduinoを使ってWi-fi通信を実現するには、Arduinoからシリアル通信でATコマンドを送受信してESP-WROOM-02を操作するようです。
参考記事にあるように「TESP8266」というオープンソースライブラリをダウンロード。ZIP形式でインストールして、ディレクトリの中にある「connect_DHCP.ino」というサンプルプログラムをArduinoに書き込みます。
ちなみに通信方式には”HardwareSerial”と”SoftwareSerial”があるようですが、今回僕はSoftwareの方で行いました。
以下、connect_DHCP.inoをシンプルにしたものです。
#include <TESP8266.h> // Wifiの情報 const char* ssid = "ネットワーク名を入力"; const char* password = "ネットワークのパスワードを入力"; //アクセスするサーバー情報 const char* host = "ホスト"; const char* path = "アクセスするファイルのパス"; // SoftwareSerial (RX受信ピン番号,TX送信ピン番号) //この場合、12ピンのRXはESPのTXに、11ピンのTXはESPのRXに接続。 TESP8266 httpClient(12,11); void setup() { // シリアルの通信速度(115.2kbps) Serial.begin(115200); // ESP-WROOM-02との接続確認(ATコマンドのテスト) while(true) { if(httpClient.statusAT(true)) { Serial.println("*** ESP-WROOM-02と接続しました。"); break; } else Serial.println("*** ESP-WROOM-02と接続できません。"); delay(1000); } // アクセスポイントに接続(DHCP) while(true) { if(httpClient.connectAP(ssid, password)) { Serial.println("*** アクセスポイントに接続しました。"); break; } else Serial.println("*** アクセスポイントに接続できませんでした。 再試行中..."); delay(1000); } // Wifi接続の確認 while(true) { if(httpClient.statusWiFi()) { Serial.println("*** Wifi接続しました。"); break; } else Serial.println("*** Wifi接続できません。"); delay(1000); } } void loop() { // HTTP GETリクエストの実行 uint32_t filesize = 0; // (戻り値)ファイルサイズ String raw = httpClient.get(host, path, filesize); // substringで不要な文字から後方の文字だけを取得 String resultString = raw.substring(3); // 残りの改行を0に変換した上でリプレイスで削除 resultString.replace("\n", "0"); resultString.replace("0", ""); Serial.println("取得結果 " + resultString); delay(1000); }
最後の文字列整形、もうちょっとスマートに出来る気もするんですが今回はとりあえずこれで…。
それと、今回は取得先のサーバーにアップしたファイルに関してはあまり記述しませんが、仕組み的にはサーバーにある.txtファイルの内容をphpで返すといったものを作りました。
phpファイルは以下のものになります。
<?php //fopenでファイルを開き、"r"の読み込み限定モードでアクセス。 $fp = fopen("log.txt", "r"); //テキストファイルから1行ずつ取得して$lineに格納。 while ($line = fgets($fp)) { // 取得した値を送信する print($line); } //fcloseでファイルを閉じる。 fclose($fp); ?>
ブレッドボード図
FritzingにESP-WROOMのパーツがないので今回は回路図はなしで….。ピン数が同じパーツを見立ててブレッドボード図だけ作りました。
今回一番苦労したのは、ESP-WROOM-02の配線でしたね…。回路図をちゃんと読めない、基本がおぼつかない自分はネットで情報探してきてもその正否がわからず…。
合ってるはずなのに起動しなかったり、配線間違っていて過負荷かかえて壊してないか悩んだりと前回までよりすごく時間がかかりました…。
でも、こうしてサーバーの情報にアクセス出来るようになれば出来ることがぐっと広がるので悩んだ価値はありました。次回はこれまで作ったものを使ってひとつ実用品を作ってみたいと思います。