Працюємо з 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Набір свердл 0,5 ... 3,0 мм

Набір свердл 0,5 ... 3,0 мм

Набір мініатюрних свердл для дреля діаметрами від 0.5 мм до 3.0 ммСвердла призначені для свердління ..

92.50грн.

Модуль PS/2

Модуль PS/2

Модуль порта PS2 для подключения компьютерной клавиатуры или мыши к плате контроллераПитающее напряж..

40.00грн.

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

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

Використовується для передачі та редукції обертаючого моменту від двигуна до вісі 8 ммКількість зубц..

61.15грн.

Блок живлення 12 В 2 А з роз'ємом 5,5мм x 2,5мм

Блок живлення 12 В 2 А з роз'ємом 5,5мм x 2,5мм

Вхідна напруга змінного струму 100...240 В 50/60 ГцВихідна стабілізована напруга 12 ВМаксимальний ст..

93.06грн.

Збільшуючий перетворювач напруги 0,9...5В у 5В

Збільшуючий перетворювач напруги 0,9...5В у 5В

Мініатюрний перетворювач напруги до 5ВВхідна напруга постійного струму 0,9 ... 5 ВНа виході USB-порт..

24.14грн.