siroitori0413 が 2021年02月27日23時06分39秒 に編集
初版
タイトルの変更
小4理科学校教材の車を前進・停止をリモート操作可能にする
タグの変更
M5Stack
M5StickC
秋葉原2021
メイン画像の変更
本文の変更
# 小学校の理科教材のモーターで走る車をラジコンにする 息子が貰ってきた小学校の理科教材のモーターで前進走行する車です。 スイッチを付けたら走り続ける仕様となっていますが、これを改造して前進・停止がリモート操作できるようにしようと思いました。  # 材料 - 小4理科教材 ダイワ 電気と光F型(電源を入れたらモーターで前進する簡単な車であれば何でも良いと思います) × 1個 - M5StickC× 1個 - リレーモジュール× 1個 # 作り方 リレーモジュールとM5StickCの接続は以下のように接続します。  そしてリレーモジュールを理科教材のスイッチ(写真の黄色いパーツ)に繋がってた部分に差し替えます。スイッチに差し替える向きはどちらの向きでも大丈夫です。  連結車両をLEGOで作りました。   # プログラム Arduino IDEでM5StickCに以下のコードを書きこみます。 ```arduino: #include <M5StickC.h> #include <WiFi.h> #include <WiFiClient.h> #include <WiFiAP.h> #include "time.h" const char *ssid = "M5StickCtrl"; const char *password = ""; bool CurrentValue = false; WiFiServer server(80); RTC_TimeTypeDef RTC_TimeStruct; RTC_DateTypeDef RTC_DateStruct; int lastDrawTime = 0; void setup() { M5.begin(); M5.Lcd.setRotation(3); M5.Lcd.fillScreen(BLACK); M5.Lcd.setTextSize(1); M5.Lcd.setCursor(0, 10); pinMode(26,OUTPUT); Serial.println("Configuring access point..."); WiFi.softAP(ssid, password); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); server.begin(); M5.Lcd.println("Connect:"); M5.Lcd.println(ssid); M5.Lcd.println("Enter:"); M5.Lcd.println(myIP); delay(1000); M5.Lcd.qrcode(myIP.toString(), 80, 0, 80, 15); } void loop() { WiFiClient client = server.available(); if (client) { Serial.println("Client Connected."); String currentLine = ""; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if (c == '\n') { if (currentLine.length() == 0) { client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html; charset=utf-8;"); client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head>"); client.println("<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />"); client.println("</head>"); client.println("<body>"); client.println("<form method=\"get\">"); client.println(String("<input name=\"control\" type=\"text\" value=\"") + (String(!CurrentValue ? "On" : "Off")) + (String("\" style=\"display:none;\" \\>"))); client.println(String("<button type=\"submit\">Turn ") + String(!CurrentValue ? "On" : "Off") + String("</button>")); client.println("</form>"); client.println("</body>"); client.println("</html>"); Serial.println("html Rendering"); break; } else if (currentLine.indexOf("GET /?") == 0) { int pos1 = 0; int pos2 = 0; String val = ""; pos1 = currentLine.indexOf('control=', pos2); pos2 = currentLine.indexOf(' ', pos1); val = currentLine.substring(pos1 + 1, pos2); if (val == "On") { CurrentValue = true; } else { CurrentValue = false; } if (CurrentValue) { digitalWrite(26,HIGH); } else { digitalWrite(26,LOW); } client.println("HTTP/1.1 302 Request Succsessful"); client.println("Location: /"); client.println(); client.println("Request was succsessful. redirect to <a href=\"/\"> here. </a>"); } else { currentLine = ""; } } else if (c != '\r') { currentLine += c; } } } client.stop(); Serial.println("Client Disconnected."); } } ``` # 実行する 上記プログラム書き込み後、M5StickCの画面にQRコードが表示されると思います。 まず、リモコン操作したい端末(スマホ/PC)から、WiFiの設定で「M5StickCtrl」というSSIDが登場しているはずなのでここにつなぎます。そのとき、4G回線とかに接続しているスマホなどであればそれもいったんオフ(機内モードなど)にしておいた方が良いみたいです。  その後、M5StickCの画面上のQRコードを読み取るか、リモコン操作したい端末のブラウザにIPアドレスをURLとして入力します。  上記の画面が出たらOKです。 「Turn On」を押すと、ラジコンカーが前進します。 ボタンの表記が「Turn Off」に変わり、そのボタンを押すと停止します。 @[youtube](https://www.youtube.com/watch?v=5BzAqZx6ZkE)