В этой технической статье мы рассмотрим, как управлять роботом Отто с использованием Wi-Fi и какие навыки и знания это может предоставить ученику. Мы также рассмотрим стек технологий, затронутых в этом процессе.
Часть 1: Управление роботом Отто через Wi-Fi
Робот Отто - это удивительное устройство, предоставляющее уникальную возможность учиться и развиваться в области программирования и робототехники. Ученик, который научится управлять роботом Отто через Wi-Fi, получит следующие навыки и понимание:
- Основы программирования: Управление роботом Отто требует написания программного кода, который определяет его движение и поведение. Ученик научится основам программирования, таким как структуры управления, функции и обработка событий.
- Работа с микроконтроллерами: Отто работает на базе микроконтроллера ESP8266, который является популярным устройством для IoT-проектов. Ученик узнает, как взаимодействовать с микроконтроллером, настраивать его и загружать программное обеспечение.
- Работа с Wi-Fi: Управление через Wi-Fi позволяет роботу Отто связываться с другими устройствами и интернетом. Ученик научится настраивать беспроводное подключение, отправлять и принимать данные через Wi-Fi.
- Разработка веб-интерфейсов: Добавление веб-интерфейса для управления роботом делает процесс интерактивным и занимательным. Ученик научится создавать простые веб-страницы с кнопками и элементами управления.
Часть 2: Стек технологий
В процессе управления роботом Отто через Wi-Fi ученик затронет следующий стек технологий:
- ESP8266 и микроконтроллеры: Ученик познакомится с микроконтроллерами, и в частности, с ESP8266, который используется для управления роботом. Этот микроконтроллер является основой множества проектов IoT и умного дома.
- Язык программирования Arduino: Для программирования микроконтроллера ESP8266 часто используется язык программирования Arduino C++. Ученик узнает, как писать код на C++, создавать функции и работать с библиотеками.
- Библиотеки для IoT и Wi-Fi: Управление роботом Отто через Wi-Fi требует использования библиотек для работы с Wi-Fi, HTTP-запросами и другими IoT-функциями. Ученик научится использовать такие библиотеки, как "ESP8266WiFi" и "ESPAsyncWebServer".
- HTML и JavaScript: Для создания веб-интерфейса управления роботом ученик познакомится с HTML и JavaScript. Он научится создавать кнопки и элементы управления на веб-странице и обрабатывать события с помощью JavaScript.
Инструкция:
- Замените SSID от Wifi сети и пароль к ней
- добавьте в менеджере библиотек ESPAsyncWeb, AsyncElegantOTA и PlayRtttl
- C:\Users*********\Documents\Arduino\libraries\AsyncElegantOTA\src\AsyncElegantOTA.h - заменить ESPAsyncWebServer.h на ESPAsyncWebSrv.h
- Включите консоль, чтоб понять - какой ip у ESP8266
- Вы получите web сервис - через который вы смежите управлять роботом Otto - http://192.168../move
Можно управлять как с клавиатуры, так и нажатием на кнопки.
код(скетч) для ардуино IDE:
#include <Otto.h>
Otto Otto;
#include<ESPAsyncTCP.h>
#include<ESPAsyncWebSrv.h>
#include<AsyncElegantOTA.h>
#include <PlayRtttl.hpp>
const char wifi_ssid[]="changeme";
const char wifi_pass[]="yourpass";
AsyncWebServer server(80);
#define LeftLeg 2 // left leg pin, servo[0]
#define RightLeg 0 // right leg pin, servo[1]
#define LeftFoot 4 // left foot pin, servo[2]
#define RightFoot 5 // right foot pin, servo[3]
#define Buzzer 13 //buzzer pin
const int buzzer = 13;
void serveprueba(AsyncWebServerRequest *request) {
request->send(200,"text/html",pprue());
String dir=request->arg("dir");
if (dir == "B") {
Backward();
}
if (dir == "F") {
Forward();
}
if (dir == "R") {
Right();
}
if (dir == "L") {
Left();
}
if (dir == "H") {
Horn();
}
}
String pprue() {
String cadena = R"=====(
<!DOCTYPE HTML>
<html>
<head>
<title>prueba</title>
<meta charset="UTF-8">
<style>
/* Стили для кнопок */
.control-button {
width: 100%;
padding: 50px;
font-size: 28px;
margin: 10px 0;
}
/* Стили для кнопок Влево и Вправо */
.half-width {
width: 50%;
}
/* Обертка для кнопок Влево и Вправо */
.button-wrapper {
display: flex;
justify-content: space-between;
width: 100%;
}
</style>
<script>
document.addEventListener("keydown", function(event) {
switch (event.key) {
case "ArrowUp":
moveForward();
break;
case "ArrowLeft":
moveLeft();
break;
case "ArrowRight":
moveRight();
break;
case "ArrowDown":
moveBackward();
break;
case "h":
case "H":
playHorn();
break;
}
});
function moveForward() {
fetch('/move?dir=F');
document.getElementById("status").textContent = "Движение вперед (F) инициировано!";
}
function moveLeft() {
fetch('/move?dir=L');
document.getElementById("status").textContent = "Движение влево (L) инициировано!";
}
function moveRight() {
fetch('/move?dir=R');
document.getElementById("status").textContent = "Движение вправо (R) инициировано!";
}
function moveBackward() {
fetch('/move?dir=B');
document.getElementById("status").textContent = "Движение назад (B) инициировано!";
}
function playHorn() {
fetch('/move?dir=H');
document.getElementById("status").textContent = "Сигнал гудка инициирован!";
}
</script>
</head>
<body>
<h1 style="border: 2px dotted #000000; text-align: center; color: #FF0000; background-color: #339999;">Пример страницы с управлением роботом</h1>
<button class="control-button" onclick="moveForward()">Move Forward (F)</button>
<div class="button-wrapper">
<button class="control-button half-width" onclick="moveLeft()">Влево (L)</button>
<button class="control-button half-width" onclick="moveRight()">Вправо (R)</button>
</div>
<button class="control-button" onclick="moveBackward()">Назад (B)</button>
<button class="control-button" onclick="playHorn()">Гудок</button>
<p id="status"></p>
</body>
</html>
)=====";
return cadena;
}
void Forward() {
Otto.walk(1,1000,1); // FORWARD
}
void Right() {
Otto.turn(1,1000,-1); // FORWARD
}
void Left() {
Otto.turn(1,1000,1); // FORWARD
}
void Backward() {
Otto.walk(1,1000,-1); // BACKWARD
}
void Horn() {
playRtttlBlockingPGM(buzzer,(char*)StarWars);
}
void setup() {
Serial.begin(115200);
delay(2000);
WiFi.begin(wifi_ssid,wifi_pass);
Serial.println("Conect");
while (WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(500);
}
Serial.println("ESP MAC Address: ");
Serial.println(WiFi.macAddress());
Serial.println();
Serial.print("Conect to: ");
Serial.println(WiFi.SSID());
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Otto.init(LeftLeg, RightLeg, LeftFoot, RightFoot, true, Buzzer);
Otto.home();
pinMode(13, OUTPUT);
server.on("/move",HTTP_GET,serveprueba);
server.on("/",HTTP_GET,[](AsyncWebServerRequest *request) {request->send(200, "text/plain","Otto Hello!" );});
server.on("/saludo",HTTP_GET,[](AsyncWebServerRequest *request) {request->send(200, "text/plain","Que igual ya no esta" );});
AsyncElegantOTA.begin(&server); //Start ElegantOTA
server.begin();
// pinMode(0, OUTPUT);
// pinMode(5, OUTPUT);
}
void loop() {
}