Працюємо з 09:00 до 20:00 без вихідних.
Самовивіз - Київ біля ТЦ Квадрат бул.Перова

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

Далее недолго думая была выбрана концепция дистанционного управления по примеру марсохода: дается команда и джип сам её выполняет и останавливается. Всё из-за неуверенности, что у моего 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 Pro Micro ATmega32U4

Arduino Pro Micro ATmega32U4

Миниатюрная плата разработчика из линейки Arduino на основе микропроцессора ATMega 32U4Тактовая част..

125.71грн.

DIP переключатель на 4 положения

DIP переключатель на 4 положения

Миниатюрный переключатель на 4 положенияИспользуется для переключения режимов работы какого либо эле..

7.24грн.

Драйвер шагового двигателя L298N

Драйвер шагового двигателя L298N

Модуль драйвера для управления работой одного двухполюсного шагового двигателя или двумя двигателями..

65.79грн.

Универсальная монтажная плата на 400 отверстий

Универсальная монтажная плата на 400 отверстий

Макетная плата на 400 отверстий для макетирования любительских схемотехнических проектов. Имеет 4 ли..

54.04грн.

Оптоизолятор четырёхканальный

Оптоизолятор четырёхканальный

Четырёхканальная гальвано-развязка на оптопарах для подключения входных дискретных сигналов к контро..

60.91грн.