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

Підсилювач PAM8610 10x2Вт з регулюванням гучності та роз'ємами

Стерео підсилювач звукової частоти класу D зі змінним резистором регулювання гучності, роз'ємами та ..

105.66грн.

Датчик руху інфрачервоний

Датчик руху інфрачервоний

Датчик реагує на рух людей, тварин або швидку зміну температури речей у радіусі своєї дії. Він викор..

32.69грн.

Держатель 8мм линейных направляющих CNC или 3d принтера

Держатель 8мм линейных направляющих CNC или 3d принтера

Тримач для кріплення циліндричних направляючих каретки CNC-станка або 3d-принтераПід діаметр направл..

82.59грн.

Автоматичне реверсивне управління двигуном з ATtiny85

Автоматичне реверсивне управління двигуном з ATtiny85

Постановка задачі проекту Ставимо задачу автоматично тягати двигуном постійного струму корисну вагу..

Конектор круглий на 40 пінів 2,54мм мама

Конектор круглий на 40 пінів 2,54мм мама

Конектор для пайки на друковану плату з круглими отворами. Відстань між пінами 2,54 мм. Кількість пі..

16.87грн.