今回はモジュールのテストじゃなくて目的を持って工作をしてみようと思います。というか、Arduinoを勉強し始めた動機自体がこういうのが欲しいと思ったのがきっかけだったりします。
リモートワークを行う上で、オフィスの方々に自分がPCの前にいるかどうか物理的に知らせる装置を作りたいな、と。
在宅勤務といえどもお昼ご飯やトイレなんかで席を離れることはあるし退勤してるかどうかも、ぱっと見でわかる装置があったら便利じゃないかなーと思いまして。
作ってみることにしました。
使った部品
・Arduino UNO
・USBケーブル
・ブレッドボード
・ACアダプター12V1A
・Jumper Wires * 13
・10kΩ抵抗 * 3
・ESP-WROOM-02(使用電圧: 3.0V~3.6V)
・サーボモーター(使用電圧: 4.2V~6V)
基本的に(6)、(7)の記事で書いたサーボモーターとWi-fiモジュールで扱ったパーツを合わせています。一つだけ追加したのは、モーターとWi-fiを両方使うとUSBだけだと電源が足りなくなるためACアダプターを追加しました。
実は電源が足りないと気づくまでにすごく時間がかかりました。回路もプログラムも合ってるはずなのになぜ動かないのか悩みに悩みました…。こういう時、基礎知識に自信がないと打開するのに時間がかかってしまいますね…。
プログラム
まずサーバーには前回の記事と同じ要領で、アクセスすると”IN”,”OUT”,”BYE”の文字列を返すPHPをアップしておきます。
最終的にはACアダプターからの電源だけで動きますが、テスト中はシリアルモニタで内容確認したいので、USBも繋いでいました。
#include <TESP8266.h> #include<Servo.h> // Wifi const char* ssid = "任意のSSID"; const char* password = "接続パスワード"; const char* host = "ホスト情報"; const char* path = "ファイルのパス"; TESP8266 httpClient(12,11); // サーボモーター設定 Servo servo1; int i = 0; //状態記録用 void servo(String sw) { servo1.attach(4); //デジタル4番ピンをサーボの角度命令出力ピンとして設定 if(sw == "IN") { if(i!=1){ /*在席*/ servo1.write(160); delay(1000); i=1; //Serial.print("取得結果 IN \r\n"); } } if(sw == "OUT") { if(i!=2){ /*離席*/ servo1.write(10); delay(1000); i=2; //Serial.print("取得結果 OUT \r\n"); } } if(sw == "BYE") { if(i!=3){ /*退席*/ servo1.write(90); delay(1000); //Serial.print("取得結果 BYE \r\n"); i=3; } } //余計なタイミングで作動しないよう、接続を解除 servo1.detach(); } void setup() { //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); // 取得文字列の整形 String resultString = raw.substring(3); resultString.replace("\n", "0"); resultString.replace("0", ""); resultString.trim(); //Serial.println("取得結果 " + resultString); servo(resultString); // 1秒おきに取得を繰り返す delay(1000); }
ブレッドボード図
基本的にWi-fiモジュールとサーボモーターを繋いだだけのシンプルなものです。
見た目の工作
今回はテストじゃなくて実際に使うものなので、ちょっと見た目の部分も工作します。サーボモーターの角度によって、在席か離席の旗をあげる簡易ロボットを作ってみました。
機構部分は、上下出来るようになっている腕の部分とモーターを糸で繋ぎ、モーターの回転で糸を引っ張ると角度によってどちらかの旗が上がる仕様になっています。物理の創作レベルが拙すぎて辛くなりますね…。
見た目をよくするには何がしかの素材を整形しなきゃなんですが、そこまでやるのはちょっと大変なので布を被せる事にしました。すっぽり覆って仕舞えばちょっと愛嬌のあるお化けロボットの出来上がり。布は全てを覆い隠してくれました。
実際に動かしてみるとこんな感じです。リモコンとなるWebページでArduinoに返す値を変更することによって、ロボットが上げる旗を変えます。
使用の結果
実際に連続して使用し続けてみたところ、いくつか問題点もありました。
・Wi-fiへの接続が途切れることがある(電源を繋ぎ直すと復活)
・モーターと腕をつなぐ糸が3ヶ月くらいで切れる(ピアノ線など強いもの変更して解決)
それに連続使用期間4ヶ月くらいでWi-fiモジュールが壊れてしまいました。
ただ思ったよりもずっと連続使用出来ましたねー。耐久性はもともとかなり心配していたのですが、壊れたのも700円くらいのWi-fiモジュールだけでArduinoは無事でした。
長持ちさせるにはパーツに負荷をかけないよう、遠隔でオンオフできるスイッチとかつけられれば良いんですかね…。
まだ改良の余地が沢山ありそうです。