В этой статье мы рассмотрим как построить робота, управляемого через Интернет или WiFi, используя плату NodeMCU ESP8266. Этот робот с управлением по WiFi сделан с использованием чипа Wemos D1 в качестве блока управления. Для управления парой двигателей мы использовали модуль L298n. Мы можем запитать цепь от любой батареи, так как требуемое напряжение составляет более 5 В. Роботом можно управлять с помощью приложения Android, которое разработано с использованием программного обеспечения MIT APP Inventor.
Ранее на нашем сайте мы рассматривали и другие проекты роботов с различным управлением на основе платы Arduino Uno:
- робот, управляемый по WiFi;
- робот, управляемый с помощью DTMF сигналов;
- робот, управляемый с компьютера;
- робот, управляемый с помощью жестов рук и акселерометра;
- робот, управляемый по Bluetooth.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress) или мини-плата Wemos D1.
- Модуль драйвера двигателя L298N (купить на AliExpress) (или можно купить просто микросхему данного драйвера).
- Комплект шасси робота.
- Аккумулятор 18650 3,7 В - 2 шт.
- USB-кабель.
- Макетная плата.
- Соединительные провода/перемычки.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема робота
Схема для нашего проекта WiFi-управляемого робота на основе NodeMCU ESP8266, приведена на следующем рисунке. Она разработана с использованием программного обеспечения Fritzing. Мы будем управлять двумя двигателями постоянного тока с помощью микросхемы драйвера двигателя L298. Для этого приложения вы можете использовать двигатель постоянного тока со скоростью 200-300 об/мин. Основным блоком управления является плата Wemos D1, которая соединяет и управляет всей схемой и оборудованием. А для питания схемы мы будем использовать батарею постоянного тока напряжением 6 В или пару литий-ионных батарей, соединенных последовательно.
Подключите аккумулятор к входу питания драйвера двигателя L298. Подключите все 4 входа L298 к контактам ESP8266 D3, D4, D7 и D8. Подайте 5 В на Wemos через контакт 5 В L298. Подключите выходные контакты L298 к левому и правому двигателям.
Соберите роботизированную машину с основанием и шасси. Я использовал пару 3,7-вольтовых аккумуляторов Samsung 18650 для питания схемы. Аккумуляторы соединены последовательно, поэтому общее напряжение составляет около 8 В. Я использовал прозрачное шасси, изготовленное из стекловолокна. Вы можете использовать металлический или деревянный материал, который соответствует вашим требованиям. Плотно прикрутите все компоненты и установите их на шасси. Используйте качественные и прочные колеса, чтобы робот мог двигаться даже по неровным поверхностям.
Дизайн приложения Android
Теперь нам нужно разработать приложение Android для нашего робота на ESP8266, управляемого по WiFi. Самый простой способ разработать приложение Android — использовать MIT App Inventor. MIT APP Inventor позволяет разрабатывать приложения для телефонов Android с помощью веб-браузера и подключенного телефона или эмулятора. Серверы App Inventor хранят вашу работу и помогают вам отслеживать ваши проекты. Более подробно приемы создания приложений Android с помощью MIT App Inventor мы рассматривали в этой статье.
Я просто разработал интерфейс для этого робототехнического проекта. Приложение имеет 5 пар переключателей для отправки команд 0 и 1 на веб-сервер.
Аналогично ниже представлен редактор блоков, содержащий информацию о назначениях и программировании.
Соберите/скомпилируйте приложение и экспортируйте его на свой телефон Android. Вы можете установить файл APK на свой телефон. Также вы можете загрузить уже готовый APK-файл WiFi-управляемого робота
Исходный код программы
Исходный код программы для робота, управляемого по WiFi, очень просты, и вы можете запрограммировать плату Wemos D1 (NodeMCU ESP8266) с помощью Arduino IDE.
В этой части кода измените SSID и пароль WiFi в этих строках.
1 2 |
const char* ssid = "Azephyrad"; const char* password = "@guinevere@@@"; |
Скопируйте полный код ниже и загрузите его на плату ESP8266.
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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
/* include library */ #include <ESP8266WiFi.h> /* define port */ WiFiClient client; WiFiServer server(80); /* WIFI settings */ const char* ssid = "Azephyrad"; const char* password = "@guinevere@@@"; /* data received from application */ String data = ""; /* define L298N or L293D motor control pins */ int leftMotorForward = 2; /* GPIO2(D4) -> IN3 */ int rightMotorForward = 15; /* GPIO15(D8) -> IN1 */ int leftMotorBackward = 0; /* GPIO0(D3) -> IN4 */ int rightMotorBackward = 13; /* GPIO13(D7) -> IN2 */ void setup() { Serial.begin(115200); /* initialize motor control pins as output */ pinMode(leftMotorForward, OUTPUT); pinMode(rightMotorForward, OUTPUT); pinMode(leftMotorBackward, OUTPUT); pinMode(rightMotorBackward, OUTPUT); //connect to your local wi-fi network WiFi.begin(ssid, password); // Attempt to connect to WiFi network: while (WiFi.status() != WL_CONNECTED) { Serial.print("."); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: // Wait 3 seconds for connection: delay(3000); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); //You can get IP address assigned to ESP /* start server communication */ server.begin(); } void loop() { /* If the server available, run the "checkClient" function */ client = server.available(); if (!client) return; data = checkClient (); /************************ Run function according to incoming data from application *************************/ /* If the incoming data is "forward", run the "MotorForward" function */ if (data == "forward") MotorForward(); /* If the incoming data is "backward", run the "MotorBackward" function */ else if (data == "backward") MotorBackward(); /* If the incoming data is "left", run the "TurnLeft" function */ else if (data == "left") TurnLeft(); /* If the incoming data is "right", run the "TurnRight" function */ else if (data == "right") TurnRight(); /* If the incoming data is "stop", run the "MotorStop" function */ else if (data == "stop") MotorStop(); } /********************************************* FORWARD *****************************************************/ void MotorForward(void) { digitalWrite(leftMotorForward, HIGH); digitalWrite(rightMotorForward, HIGH); digitalWrite(leftMotorBackward, LOW); digitalWrite(rightMotorBackward, LOW); } /********************************************* BACKWARD *****************************************************/ void MotorBackward(void) { digitalWrite(leftMotorBackward, HIGH); digitalWrite(rightMotorBackward, HIGH); digitalWrite(leftMotorForward, LOW); digitalWrite(rightMotorForward, LOW); } /********************************************* TURN LEFT *****************************************************/ void TurnLeft(void) { digitalWrite(leftMotorForward, LOW); digitalWrite(rightMotorForward, HIGH); digitalWrite(rightMotorBackward, LOW); digitalWrite(leftMotorBackward, HIGH); } /********************************************* TURN RIGHT *****************************************************/ void TurnRight(void) { digitalWrite(leftMotorForward, HIGH); digitalWrite(rightMotorForward, LOW); digitalWrite(rightMotorBackward, HIGH); digitalWrite(leftMotorBackward, LOW); } /********************************************* STOP *****************************************************/ void MotorStop(void) { digitalWrite(leftMotorForward, LOW); digitalWrite(leftMotorBackward, LOW); digitalWrite(rightMotorForward, LOW); digitalWrite(rightMotorBackward, LOW); } /********************************** RECEIVE DATA FROM the APP ******************************************/ String checkClient (void) { while (!client.available()) delay(1); String request = client.readStringUntil('\r'); request.remove(0, 5); request.remove(request.length() - 9, 9); return request; } |
Подключите кабель передачи данных micro-USB к компьютеру и плате Wemos D1 Mini.
В Arduino IDE выберите Tools, а в Board Part выберите Wemos D1 Mini Board. В случае, если вы используете NodeMCU Board, вы можете выбрать NodeMCU 1.0 Board. Затем выберите COM Port и нажмите кнопку upload, чтобы загрузить код.
Тестирование робота, управляемого по WiFi
После загрузки кода нажмите на последовательный монитор. Таким образом, последовательный монитор отобразит IP-адрес как только подключится к сети WiFi. Запомните этот IP-адрес, так как он требуется в приложении Android.
Откройте приложение Android, установленное на вашем телефоне, и введите IP-адрес, который вы записали ранее.
Теперь вы можете управлять роботом. Чтобы переместить робота вперед, нажмите клавишу со стрелкой ВВЕРХ, а чтобы переместить его назад, нажмите клавишу со стрелкой ВНИЗ. Аналогично, чтобы переместить робота влево и вправо, нажмите клавиши со стрелками Влево и Вправо.
Вот как вы можете создать своего собственного робота, управляемого по WiFi, и управлять им с помощью приложения для Android.