Працюємо з 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 Leonardo R3 + USB кабель

Arduino Leonardo R3 + USB кабель

Микроконтроллер в интересном формфакторе Arduino LEONARDO R3Микросхема: ATmega32u4Контроллер работае..

205.48грн.

Модуль MicroSD карты памяти

Модуль MicroSD карты памяти

Модуль карточки памяти с интерфейсом SPI. Предназначен для сохранения различных данных контроллера: ..

21.85грн.

Шестерня для зубчатого ремня на 20 зубьев под ось 8 мм

Шестерня для зубчатого ремня на 20 зубьев под ось 8 мм

Используется для передачи и редукции крутящего момента от двигателя до оси 8 ммКоличество зубьев 20 ..

25.08грн.

Микроконтроллер ATTINY13A

Микроконтроллер ATTINY13A

Миниатюрный экономичный AVR 8-битный микроконтроллер, который можно программировать как программатор..

19.77грн.

ARM Cortex-M3 STM32F103C8T6

ARM Cortex-M3 STM32F103C8T6

Минимальная плата разработчика на 48 выводов от фирмы STM32 на основе чипа STM32F103C8T6.Для заливки..

169.95грн.