Kod strony WWW umieszczonej na serwerze WWW ESP8266:
<!DOCTYPE html> <html lang="pl"> <head> <title>WiFi Robot Control</title> <meta charset="utf-8"> </head> <body> <h1>WiFi Robot Control</h1> <button onclick="location.href='/forward'" id="buttonUp">Forward</button> <button onclick="location.href='/backward'" id="buttonDown">Backward</button> <button onclick="location.href='/left'" id="buttonLeft">Left</button> <button onclick="location.href='/right'" id="buttonRight">Right</button> <button onclick="location.href='/stop'" id="buttonSpace">Stop</button> <script> document.addEventListener("keydown", function(event) { event.preventDefault(); // Sprawdzanie naciśniętego klawisza if (event.key === "ArrowUp") { document.getElementById("buttonUp").click(); // Kliknięcie przycisku "Góra" } else if (event.key === "ArrowDown") { document.getElementById("buttonDown").click(); // Kliknięcie przycisku "Dół" } else if (event.key === "ArrowLeft") { document.getElementById("buttonLeft").click(); // Kliknięcie przycisku "Lewo" } else if (event.key === "ArrowRight") { document.getElementById("buttonRight").click(); // Kliknięcie przycisku "Prawo" } else if (event.key === " ") { document.getElementById("buttonSpace").click(); // Kliknięcie przycisku "Stop" } }); </script> </body> </html>
Serwer ESP8266 - odbieranie i przesyłanie komend:
WiFiClient client = server.available(); // Nasłuchiwanie na porcie 80 if (client) { Serial.println("Nowe połączenie"); String request = client.readStringUntil('\r'); // Odczytanie żądania HTTP Serial.println(request); client.flush(); // Obsługa przycisków if (request.indexOf("/forward") != -1) { Serial.println("Komenda: forward"); // Wysyłamy komendę forward Serial.write("forward\n"); } if (request.indexOf("/backward") != -1) { Serial.println("Komenda: backward"); // Wysyłamy komendę backward Serial.write("backward\n"); } if (request.indexOf("/left") != -1) { Serial.println("Komenda: left"); // Wysyłamy komendę left Serial.write("left\n"); } if (request.indexOf("/right") != -1) { Serial.println("Komenda: right"); // Wysyłamy komendę right Serial.write("right\n"); } if (request.indexOf("/stop") != -1) { Serial.println("Komenda: stop"); // Wysyłamy komendę stop Serial.write("stop\n"); }
Serwer (WeMos D1 ESP8266) jest podłączony do laptopa za pomocą kabla USB (zasilanie i przesyłanie danych). Za pomocą strony otworzonej w przeglądarce wysyłamy polecenia, które odczytujemy w monitorze portu szeregowego.
Układ działa poprawnie, również po dałączeniu płytki ze złączem do portu szeregowego robota.
Serwer (WeMos D1 ESP8266) jest podłączony do gniazda portu szeregowego w płytce Lofi Brain. Do płytki wgrałem "echo", który odczytuje komendy z portu Serial1 i przesyła do portu Serial (USB) płytki Arduino Pro Micro (Leonardo). Port Serial jest połączony przewodem USB z monitorem szeregowymArduino IDE.
Kod "echo":
void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { if (Serial1.available()) { char znak = (char)Serial1.read(); Serial.print(znak); } }
Uruchomienie szkicu LOFI.ino z projektu LOFI zrealizowanego w Cirkit Desinger (robot omijający przeszkody).
Arduino ProMicro (Leonardo) - kod odbierający komendy i sterujący robotem:
/* * LOFI Robot sterowany przez WiFi */ #define TRIG_PIN 14 // MISO pin on Pro Micro #define ECHO_PIN 15 // SCK pin on Pro Micro #define MOTOR_EN1 3 // D3 pin on Pro Micro #define MOTOR_IN1 2 // D2 pin on Pro Micro #define MOTOR_IN2 4 // D4 pin on Pro Micro #define MOTOR_EN2 5 // D5 pin on Pro Micro #define MOTOR_IN3 7 // D7 pin on Pro Micro #define MOTOR_IN4 8 // D8 pin on Pro Micro #define BUZZER_PIN 16 // MOSI pin on Pro Micro const int minpwm = 30; // Eksperymentalna wartość minimalna PWM void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(MOTOR_EN1, OUTPUT); pinMode(MOTOR_IN1, OUTPUT); pinMode(MOTOR_IN2, OUTPUT); pinMode(MOTOR_EN2, OUTPUT); pinMode(MOTOR_IN3, OUTPUT); pinMode(MOTOR_IN4, OUTPUT); pinMode(BUZZER_PIN, OUTPUT); Serial1.begin(9600); // Enable motors analogWrite(MOTOR_EN1, 125); analogWrite(MOTOR_EN2, 125); } void loop() { if (Serial1.available() > 0) { String command = Serial1.readStringUntil('\n'); command.trim(); if (command == "forward") { moveForward(); } else if (command == "backward") { moveBackward(); } else if (command == "left") { turnLeft(); } else if (command == "right") { turnRight(); } else if (command == "stop") { stopMotors(); } else if (command.startsWith("Speed:")) { int speedValue = command.substring(7).toInt(); // Pobranie wartości liczbowej speedValue = map(speedValue, 0, 100, minpwm, 255); // Skalowanie do PWM (minpwm - 255) analogWrite(MOTOR_EN1, speedValue); analogWrite(MOTOR_EN2, speedValue); } } } // Motor control functions void moveForward() { digitalWrite(MOTOR_IN1, HIGH); digitalWrite(MOTOR_IN2, LOW); digitalWrite(MOTOR_IN3, HIGH); digitalWrite(MOTOR_IN4, LOW); } void moveBackward() { digitalWrite(MOTOR_IN1, LOW); digitalWrite(MOTOR_IN2, HIGH); digitalWrite(MOTOR_IN3, LOW); digitalWrite(MOTOR_IN4, HIGH); } void turnRight() { digitalWrite(MOTOR_IN1, LOW); digitalWrite(MOTOR_IN2, HIGH); digitalWrite(MOTOR_IN3, HIGH); digitalWrite(MOTOR_IN4, LOW); } void turnLeft() { digitalWrite(MOTOR_IN1, HIGH); digitalWrite(MOTOR_IN2, LOW); digitalWrite(MOTOR_IN3, LOW); digitalWrite(MOTOR_IN4, HIGH); } void stopMotors() { digitalWrite(MOTOR_IN1, LOW); digitalWrite(MOTOR_IN2, LOW); digitalWrite(MOTOR_IN3, LOW); digitalWrite(MOTOR_IN4, LOW); }
WeMos D1 Mini (ESP8266) - serwer strony WWW:
/* This Arduino Sketch sets up a web server on the ESP8266 ESP-01 module to control the movement of a robot via the Arduino UNO. The web server has buttons to send commands to the Arduino to move forward, backward, left, right, and stop. */ #include <ESP8266WiFi.h> const char* ssid = "..."; const char* password = "..."; WiFiServer server(80); void setup() { // Initialize serial communication Serial.begin(9600); delay(10); // Connect to WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // Start the server server.begin(); Serial.println("Server started"); } void loop() { WiFiClient client = server.available(); // Nasłuchiwanie na porcie 80 if (client) { String request = client.readStringUntil('\r'); // Odczytanie żądania HTTP client.flush(); // Obsługa przycisków if (request.indexOf("/forward") != -1) { Serial.write("forward\n"); // Wysyłamy komendę forward } else if (request.indexOf("/backward") != -1) { Serial.write("backward\n"); // Wysyłamy komendę backward } else if (request.indexOf("/left") != -1) { Serial.write("left\n"); // Wysyłamy komendę left } else if (request.indexOf("/right") != -1) { Serial.write("right\n"); // Wysyłamy komendę right } else if (request.indexOf("/stop") != -1) { Serial.write("stop\n"); // Wysyłamy komendę stop } // Send the HTML page client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println(); client.println("<!DOCTYPE html>"); client.println("<html lang=\"pl\">"); client.println("<head>"); client.println("<title>WiFi Robot Control</title>"); client.println("<meta charset=\"utf-8\">"); client.println("</head>"); client.println("<body>"); client.println("<h1>WiFi Robot Control</h1>"); client.println("<button onclick=\"location.href='/forward'\" id=\"buttonUp\">Forward</button>"); client.println("<button onclick=\"location.href='/backward'\" id=\"buttonDown\">Backward</button>"); client.println("<button onclick=\"location.href='/left'\" id=\"buttonLeft\">Left</button>"); client.println("<button onclick=\"location.href='/right'\" id=\"buttonRight\">Right</button>"); client.println("<button onclick=\"location.href='/stop'\" id=\"buttonSpace\">Stop</button>"); client.println("<script>"); client.println("document.addEventListener(\"keydown\", function(event) {"); client.println(" event.preventDefault(); "); client.println(" // Sprawdzanie naciśniętego klawisza"); client.println(" if (event.key === \"ArrowUp\") {"); client.println(" document.getElementById(\"buttonUp\").click(); // Kliknięcie przycisku \"Góra\""); client.println(" } else if (event.key === \"ArrowDown\") {"); client.println(" document.getElementById(\"buttonDown\").click(); // Kliknięcie przycisku \"Dół\""); client.println(" } else if (event.key === \"ArrowLeft\") {"); client.println(" document.getElementById(\"buttonLeft\").click(); // Kliknięcie przycisku \"Lewo\""); client.println(" } else if (event.key === \"ArrowRight\") {"); client.println(" document.getElementById(\"buttonRight\").click(); // Kliknięcie przycisku \"Prawo\""); client.println(" } else if (event.key === \" \") {"); client.println(" document.getElementById(\"buttonSpace\").click(); // Kliknięcie przycisku \"Stop\""); client.println(" }"); client.println("});"); client.println("</script>"); client.println("</body>"); client.println("</html>"); client.println(); client.stop(); Serial.println("Client Disconnected."); } }