Працюємо з 09:00 до 19:00 без вихідних
Самовивіз не працює до 03.08

Решил я недавно сделать апгрейд радиоуправляемого игрушечного джипа своего сына. Радиоуправление почти сразу перестало работать. Как показало вскрытие, в машинке установлены слишком слабые и неповоротливые двигателёчки. Основной двигательный моторчик я сразу заменил на больший размером и мощностью. Для этого пришлось поработать гравером, с установленой на него циркулярной пилой (а как иначе выделить достаточно места?). Так же была выброшена плата радиоприемника.

Далее недолго думая была выбрана концепция дистанционного управления по примеру марсохода: дается команда и джип сам её выполняет и останавливается. Всё из-за неуверенности, что у моего 2,5 летнего сына получится управлять двигателями стандартным пультом. Я уверен, что он будет надолго зажимать элементы управления независимо от поведения машинки. А принцип марсохода: проедь 20см и остановись, вполне подойдёт. Тем более, что я давно мечтал его опробовать хотя бы в простейшем варианте. В данной реализации будем ехать не 20см, а заданное время - 1 сек.

Итак будем управлять двумя реверсивными (вращение в обе стороны) двигателями: основным и рулевым. Питать их будем от аккумулятора 3,7 В, но можно и до 12 В в принципе подавать, если согласовать питание контроллера или организовать его отдельным аккумулятором.
В силовой части используем простейший миниатюрный драйвер шагового двигателя L9110S или любой не менее мощный, который вы найдёте. Вобщем я всё нарисовал на картинке.

 

WiFi контроллер использован мой любимый NodeMCU 0.9 ESP8266, но можно использовать и меньший размером WeMos D1 mini.

Аккумулятор можно зарядить через микро-USB, после чего он питает драйвер двигателей напрямую и WiFi-контроллер через повышающий преобразователь до 5 В.

Код программы:

#include <ESP8266WiFi.h>
const char* ssid = "имя вашей сети вайфай";
const char* password = "пароль вашей сети";
int up = 2; //номера дискретных выходов
int down = 14;
int left = 4;
int right = 12;
// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);
void setup() {
  Serial.begin(9600);
  delay(10);
  //подготовка выходов
  pinMode(up, OUTPUT);
  digitalWrite(up, 0);
  pinMode(down, OUTPUT);
  digitalWrite(down, 0);
  pinMode(left, OUTPUT);
  digitalWrite(left, 0);
  pinMode(right, OUTPUT);
  digitalWrite(right, 0);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  //Запуск сервера
  server.begin();
  Serial.println("Server started");
  //выводим IP адрес в монитор порта
  Serial.println(WiFi.localIP());
}
void loop() {
  //проверяем подключился ли клиент
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  //Ожидаем пока клиент не пришлет какие-нибудь данные
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  
  //Чтение первой строки запроса
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
  
  //обработка команды
  if (req.indexOf("/gpio/up") != -1){
    digitalWrite(up, 1);
    digitalWrite(down, 0);
    delay(1000);
    digitalWrite(up, 0);
    digitalWrite(down, 0);
    }
  else if (req.indexOf("/gpio/down") != -1){
    digitalWrite(up, 0);
    digitalWrite(down, 1);
    delay(1000);
    digitalWrite(up, 0);
    digitalWrite(down, 0);
    }
  else if (req.indexOf("/gpio/left") != -1){
    digitalWrite(up, 1);
    digitalWrite(down, 0);
    digitalWrite(left, 1);
    digitalWrite(right, 0);
    delay(1000);
    digitalWrite(up, 0);
    digitalWrite(down, 0);
    digitalWrite(left, 0);
    digitalWrite(right, 0);
    }  
  else if (req.indexOf("/gpio/right") != -1){
    digitalWrite(up, 1);
    digitalWrite(down, 0);
    digitalWrite(left, 0);
    digitalWrite(right, 1);
    delay(1000);
    digitalWrite(up, 0);
    digitalWrite(down, 0);
    digitalWrite(left, 0);
    digitalWrite(right, 0);
    }    
  else {
    Serial.println("invalid request");
  }
  
  client.flush();
  // подготовка к ответу
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n ";
  
  s += "<center><br><a href='http://192.168.1.97/gpio/up'>UP</a><br>";
  s += "<br><a href='http://192.168.1.97/gpio/left'>LEFT</a>&emsp;&emsp;&emsp;&emsp;&emsp;";
  s += "<a href='http://192.168.1.97/gpio/right'>RIGHT</a><br>";
  s += "<br><a href='http://192.168.1.97/gpio/down'>DOWN</a>";
  s += "</center></html>\n";
  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");
}

Программа написана в Arduino IDE. Как настроить Arduino IDE для работы с контроллером NodeMCU 0.9 ESP8266 посмотрите по ссылке.
После загрузки программы в контроллер, монитором порта можно прочитать IP-адрес, который плата получит после соединения с вашим WiFi-роутером. В браузере компьютера необходимо в адресной строке прописать этот адрес и перейти на страницу, которую сгенерирует программа контроллера. Она будет выглядеть следующим образом:

UP

LEFT     RIGHT

DOWN


При нажатии на ссылку UP, машинка проедет вперед в течении 1сек и остановится. При нажатии на DOWN, машинка 1 секунду будет ехать назад. LEFT - двигатель поворота повернёт колёса влево и машинка проедет 1 сек влево. То же самое и вправо при нажатии на RIGHT.
Вся эта система будет работать только при настроенной WiFi-точке доступа (WiFi-роутере), но в будущем мне интересно поиграться с контроллером NodeMCU 0.9 ESP8266, который сам будет организовывать точку доступа и выполнять функцию WEB-сервера, тоесть при заходе на его айпи из браузера, будем видеть web-страничку с элементами управления. Так же интересно организовать передачу данных с одного такого контроллера в другой посредством их автономной WiFi-сети.

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Обмен данными между двумя Arduino при помощи программного UART

Обмен данными между двумя Arduino при помощи программного UART

Обмен данными между двумя Arduino при помощи программного UARTКоммуникация по последовательному порт..

IRF4905 P-канальный MOSFET-транзистор 74А 55В

IRF4905 P-канальный MOSFET-транзистор 74А 55В

Мощный полевой транзистор пятого поколения для коммутации нагрузки до 74 А напряжением до 55 ВСопрот..

17.62грн.

LAN Ethernet шилд ENC28J60

LAN Ethernet шилд ENC28J60

Ethernet шилд расширения с маркировкой HR911105A. Подходит для различных плат контроллера. Питание 5..

101.61грн.

Гайка М2,5 шестигранная из нержавейки

Гайка М2,5 шестигранная из нержавейки

Гайка для крепления элементов электронных проектов..

0.89грн.

Контроллер заряда аккумулятора 3,7В или 4,2В 1А

Контроллер заряда аккумулятора 3,7В или 4,2В 1А

Плата для зарядки литиумных аккумуляторов 3,6 - 4,2В и запитки его нагрузки.Зарядка производится чер..

19.18грн.