Працюємо з 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Модуль SHT30 для Wemos D1 mini

Модуль SHT30 для Wemos D1 mini

Шилд датчика температури та вологості на основі SHT30Комунікаційний інтерфейс I2CДіапазон вимірюванн..

79.34грн.

Змінний резистор 1 кОм

Змінний резистор 1 кОм

Змінний резистор або потенціометрОпір 1 кОмПотужність 0,5 ВтТип BЛінійна характеристикаТакі резистор..

12.02грн.

Радіатори для Orange PI або Raspberry PI

Радіатори для Orange PI або Raspberry PI

Набір з трьох радіаторів охолодження для процесора мінікомп'ютера та його мікросхем пам'ятіМатеріал ..

25.54грн.

Подвійна шестерня для зубчатого ременю на 20 зубів під вісь 5 мм

Подвійна шестерня для зубчатого ременю на 20 зубів під вісь 5 мм

Подвійна шестерня для передачі обертального моменту з одного валу на інший.Застосовується для розділ..

64.26грн.

ATtiny обзор контролерів

ATtiny обзор контролерів

Обозначение Память программ (FLASH) [Kбайт] Память данных [байт] Kол-во линий ввода/..