Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 19: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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
УЗ датчик відстані з герметичним випромінювачем

УЗ датчик відстані з герметичним випромінювачем

Ультразвуковий датчик відстані з герметичним двонапрямленим випромінювачемДобре підходить для середо..

250.14грн.

Адаптер USB 2.0 в TTL UART

Адаптер USB 2.0 в TTL UART

Комунікаційний конвертер USB 2.0 в TTL UARTЗаснований на мікросхемі CP2102Містить самовідновлюв..

120.03грн.

Стійка нейлонова М3 8мм + 6мм

Стійка нейлонова М3 8мм + 6мм

Стійка для кріплення усіляких електронних модулів до корпусу пристроюВисота стійки 8 ммДовжина зовні..

3.56грн.

AMS1117-3.3 мікросхема стабілізатор напруги

AMS1117-3.3 мікросхема стабілізатор напруги

Мікросхема - лінійний регулятор напруги застосовується для отримання стабілізованої напруги 3,3 ВВхі..

5.77грн.

Датчик звуку

Датчик звуку

Інтелектуальний дискретний датчик звуку. Робоча напруга живлення 4...6 В постійного струму. Чутливіс..

47.61грн.