筆者が常駐している講義室にはプロジェクターとスクリーンが常設されていて、授業やイベントで使用しています。困ったことにスクリーン直上の照明スイッチが離れた場所にしかなく、状況によって誰かが走って行ってスイッチを押す、ということを行っていたので対策しました。
マイコンの電源を入れるとIPアドレスが表示されるので、同じWiFiに接続したパソコンやスマホのブラウザからアクセスするとその度にモータが動作してスイッチを押してくれます。
使った部品は次のとおりです。
- M5StickC Plus
- サーボモータSG90
- 壁面への固定プレート(自作)
- USB電源アダプタ、配線材料など
M5StickC PlusのプログラミングはArduino IDEを使いました。ソースコードは次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
#include <M5StickCPlus.h> // WPA2認証によるWiFi接続 #include <WiFi.h> #include <WiFiClientSecure.h> #include "esp_wpa2.h" const char* WIFI_SSID = "xxxxxxxx"; // SSID const char* WIFI_USERID = "xxxxxxxx"; // User ID const char* WIFI_PASSWORD = "xxxxxxxx"; // Password // サーボモータ #include <Servo.h> #define MOTOR_PIN 26 // サーボモータの信号ピン #define MOTOR_DELAY 500 // サーボモータ動作後の待ち時間 #define SWITCH_OFF 130 // サーボモータの回転角(通常時) #define SWITCH_ON 115 // サーボモータの回転角(スイッチ動作時) Servo motor; // WEBサーバー #include <WebServer.h> #include <ESPmDNS.h> WebServer server(80); void handleRoot() { server.send(200, "text/plain", "Request accepted."); // サーボモータを回転してもとに戻す motor.write(SWITCH_ON); delay(MOTOR_DELAY); motor.write(SWITCH_OFF); delay(MOTOR_DELAY); } void handleNotFound() { String message = "Invalid option in URI.\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); } void setup() { // システム初期化 M5.begin(); // 画面表示の初期化 M5.Lcd.setRotation(1); // スクリーンの向き M5.Lcd.setTextSize(2); // フォントサイズ M5.Lcd.printf("Connecting to WiFi: %s ", WIFI_SSID); // WiFi接続 WiFi.disconnect(true); // 念の為切断してから処理開始 WiFi.mode(WIFI_STA); // init wifi mode esp_wifi_sta_wpa2_ent_set_identity((uint8_t *)WIFI_USERID, strlen(WIFI_USERID)); esp_wifi_sta_wpa2_ent_set_username((uint8_t *)WIFI_USERID, strlen(WIFI_USERID)); esp_wifi_sta_wpa2_ent_set_password((uint8_t *)WIFI_PASSWORD, strlen(WIFI_PASSWORD)); esp_wifi_sta_wpa2_ent_enable(); //set config settings to enable function WiFi.begin(WIFI_SSID); // connect to wifi // WiFi接続の確認 int counter = 0; while (WiFi.status() != WL_CONNECTED) { // 接続できるまで待つ delay(500); // 0.5秒待ってリトライ M5.Lcd.print("."); counter++; if (60 <= counter) { // 30秒で接続できなければリセット M5.Lcd.print("\nERROR: Restarting WiFi\n"); counter = 0; ESP.restart(); } } M5.Lcd.begin(); M5.Lcd.fillScreen(BLACK); M5.Lcd.setCursor(0, 0); M5.Lcd.setTextSize(3); M5.Lcd.print(WIFI_SSID); M5.Lcd.print("\n\nhttp://"); M5.Lcd.print(WiFi.localIP()); // サーボモーターの初期化 pinMode(MOTOR_PIN, OUTPUT); motor.attach(MOTOR_PIN); delay(MOTOR_DELAY); motor.write(SWITCH_OFF); delay(MOTOR_DELAY); // WEBサーバーの開始 if (MDNS.begin("esp32")) { //M5.Lcd.print("\n\nSwitch started."); M5.Lcd.print("\n"); } server.on("/", handleRoot); server.onNotFound(handleNotFound); server.begin(); } void loop() { WiFiClientSecure client; server.handleClient(); delay(2); //allow the cpu to switch to other tasks } |
項目別に分けると次のようになっています。それぞれ基本的なことしかしていません。
- 学内WiFiネットワークへの接続 ← 4〜9行目、59〜78行目
- デバイスをWEBサーバーとして公開する ← 20〜46行目、68〜78行目、94〜108行目
- サーボモータ制御 ← 12〜17行目、27〜30行目、88〜92行目
- M5StickC Plusのシステムと表示まわり
一番難しかったのは壁面のスイッチへの固定方法でした。3Dプリンタで自作しましたが、微調整を繰り返して何度か試作を繰り返しました。モーターの回転角も設置状態に応じて「現場合わせ」しました。
コメント