Своими руками беспроводная Wifi машинка на NodeMCU и RemoteXY

.Своими руками беспроводная Wifi машинка на NodeMCU и RemoteXY

В данном проекте я собираю беспроводную Wifi машинку используя самые простые и доступные средства. Установил NodeMCU на микроконтроллере ESP8266. Поставил драйвер L9110S. Сперва думал что драйвер будет греться. Но двигателя постоянного тока которые были в машине не очень мощные и драйвера L9110S достаточно для управления. Вы можете поставить на сваю WIFI машинку другой драйвер например L298N.

Схема подключения для L9110S и для L298N одинаковая. Программа также будет работать с обоими драйверами.

Схема подключения для L9110S или L298N

Схема подключения всех элементов Wi-fi машинки выглядит следующим образом

Схема подключения всех элементов Wi-fi машинки

На Сайте http://remotexy.com/ru/editor/ Сделал приложение RemoteXY.

Приложение RemoteXY NodeMCU для вайфай машинки


Код получился следующий

////////////////////////////////////////////// 
//        RemoteXY include library          // 
////////////////////////////////////////////// 
// определение режима соединения и подключение библиотеки RemoteXY  
#define REMOTEXY_MODE__ESP8266WIFI_LIB_POINT
#include <ESP8266WiFi.h> 
#include <RemoteXY.h> 
// настройки соединения  
#define REMOTEXY_WIFI_SSID "PortakPK" 
#define REMOTEXY_WIFI_PASSWORD "" 
#define REMOTEXY_SERVER_PORT 6377 
// конфигурация интерфейса   
#pragma pack(push, 1) 
uint8_t RemoteXY_CONF[] = 
  { 255,5,0,0,0,84,0,7,5,0,
  1,1,5,7,22,13,5,208,146,208,
  191,208,181,209,128,208,181,208,180,0,
  1,1,6,43,20,13,4,208,157,208,
  176,208,183,208,176,208,180,0,1,1,
  75,8,18,12,1,208,146,208,187,208,
  181,208,178,208,190,0,1,1,76,43,
  18,13,2,208,146,208,191,209,128,208,
  178,208,190,0,3,3,44,15,13,35,
  2 }; 
// структура определяет все переменные вашего интерфейса управления  
struct { 
    // input variable
  uint8_t button_1; // =1 если кнопка нажата, иначе =0 
  uint8_t button_2; // =1 если кнопка нажата, иначе =0 
  uint8_t button_3; // =1 если кнопка нажата, иначе =0 
  uint8_t button_4; // =1 если кнопка нажата, иначе =0 
  uint8_t select_1; // =0 если переключатель в положении A, =1 если в положении B, =2 если в положении C, ... 
    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 
} RemoteXY; 
#pragma pack(pop) 
///////////////////////////////////////////// 
//           END RemoteXY include          // 
///////////////////////////////////////////// 
#define PIN_BUTTON_1 D1
#define PIN_BUTTON_2 D2
#define PIN_BUTTON_3 D3
#define PIN_BUTTON_4 D4
void setup()  
{ 
  RemoteXY_Init ();  
  pinMode (PIN_BUTTON_1, OUTPUT);
  pinMode (PIN_BUTTON_2, OUTPUT);
  pinMode (PIN_BUTTON_3, OUTPUT);
  pinMode (PIN_BUTTON_4, OUTPUT);
  // TODO you setup code 
} 
void loop()  
{  
  RemoteXY_Handler (); 
  digitalWrite(PIN_BUTTON_1, (RemoteXY.button_1==0)?LOW:HIGH);
  digitalWrite(PIN_BUTTON_2, (RemoteXY.button_2==0)?LOW:HIGH);
  digitalWrite(PIN_BUTTON_3, (RemoteXY.button_3==0)?LOW:HIGH);
  digitalWrite(PIN_BUTTON_4, (RemoteXY.button_4==0)?LOW:HIGH);
  // TODO you loop code 
  // используйте структуру RemoteXY для передачи данных 
}

Подправил код управления движениями и поворотами.

// Движения и повороты ///
  if (RemoteXY.button_1==1) // вперед
  {
     digitalWrite(PIN_BUTTON_1, HIGH);
     if (RemoteXY.select_1 == 1 || RemoteXY.select_1 == 2) //если силектор в положении 1 или 2 включаем переднии фары
      {
        digitalWrite(PIN_LED_5, HIGH);
        digitalWrite(PIN_LED_6, HIGH);
      }
    }
   if (RemoteXY.button_2==1) // назад
  {
      digitalWrite(PIN_BUTTON_2, HIGH);
      if (RemoteXY.select_1 == 1 || RemoteXY.select_1 == 2)//если силектор в положении 1 или 2 включаем стоп сигналы
      {
        digitalWrite(PIN_LED_STOP, HIGH);
      }
    }
  if (RemoteXY.button_3==1)  // влево
  {
     digitalWrite(PIN_BUTTON_3, HIGH);
    }
   if (RemoteXY.button_4==1)  // вправо
  {
      digitalWrite(PIN_BUTTON_4, HIGH);
    }
 //END Движения и повороты ///

Настроил работу селектора

//  Положение селектора 0 и 2   ///   
  if (RemoteXY.select_1 == 2)
      {
        Migalka ();// Мигалка 
      }   
  if (RemoteXY.select_1 == 0)
      {
          digitalWrite(PIN_LED_STOP, LOW); //
          digitalWrite(PIN_LED_5, LOW); // 
          digitalWrite(PIN_LED_6, LOW); // 
          digitalWrite(PIN_LED_7,  LOW); // 
          digitalWrite(PIN_LED_8, LOW); // 
      } 
 //END Положение селектора 0 и 2 ////

Добавил функцию управления полицейским стробоскопом. Данная функция написано на основании Урок 6 - Полицейский стробоскоп своими руками на Arduino.

void Migalka() // Мигалка 
{
 unsigned long curstro1Millis = millis();  // устанавливаем время в сейчас
  if ((curstro1Millis - prestro1Millis) > interval[x]) // проверяем интервал
    {
      if (open) // если true
        digitalWrite(status ? PIN_LED_7 : PIN_LED_8, HIGH); //
      else // иначе
       digitalWrite(status ? PIN_LED_7 : PIN_LED_8, LOW); // 
       x++;
      if (x == 6) // если последний проход по циклу
      {
        status = !status; // передаем слово (меняем текущий пин) меняем false на true и наоборот;
        x=0;
      }
      open = !open; //меняем false на true и наоборот 
    prestro1Millis = curstro1Millis;
  }
}

Чтобы машинке не продолжала движения когда кнопка отпущена написал вот такой код.

// Кнопка не нажата. снимам сигнал с пина //    
   if (RemoteXY.button_1==0)
   {
      digitalWrite(PIN_BUTTON_1, LOW);  
      digitalWrite(PIN_LED_5, LOW); // 
      digitalWrite(PIN_LED_6, LOW); // 
   }
   if (RemoteXY.button_2==0)
   {
      digitalWrite(PIN_LED_STOP, LOW); //
      digitalWrite(PIN_BUTTON_2, LOW); 
   }
   if (RemoteXY.button_3==0)
      digitalWrite(PIN_BUTTON_3, LOW); 
   if (RemoteXY.button_4==0)
      digitalWrite(PIN_BUTTON_4, LOW); 
 //END Кнопка не нажата. снимам сигнал с пина //

В итоге скетч для управления Wifi машинкой в среде Arduino IDE получился следующим.

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////
// определение режима соединения и подключение библиотеки RemoteXY 
#define REMOTEXY_MODE__ESP8266WIFIPOINT_LIB
#include <ESP8266WiFi.h>
#include <RemoteXY.h>
// настройки соединения 
#define REMOTEXY_WIFI_SSID "PortalPK"
#define REMOTEXY_WIFI_PASSWORD ""
#define REMOTEXY_SERVER_PORT 6377 
// конфигурация интерфейса  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 5,0,102,0,6,12,2,1,1,72
  ,10,21,13,49,63,12,12,2,208,155
  ,208,181,208,178,208,190,0,1,1,72
  ,37,21,13,48,82,12,12,1,208,159
  ,209,128,208,176,208,178,208,190,0,1
  ,1,5,10,21,12,5,83,12,12,5
  ,208,146,208,191,208,181,209,128,208,181
  ,208,180,0,1,1,5,37,21,12,5
  ,63,12,12,4,208,157,208,176,208,183
  ,208,176,208,180,0,3,3,44,12,14
  ,38,29,66,8,22,2 }; 
// структура определяет все переменные вашего интерфейса управления 
struct {
    // input variable
  uint8_t button_1; // =1 если кнопка нажата, иначе =0 
  uint8_t button_2; // =1 если кнопка нажата, иначе =0 
  uint8_t button_3; // =1 если кнопка нажата, иначе =0 
  uint8_t button_4; // =1 если кнопка нажата, иначе =0 
  uint8_t select_1; // =0 если переключатель в положении A, =1 если в положении B, =2 если в положении C, ...   
    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 
} RemoteXY;
#pragma pack(pop)
/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////
#define PIN_BUTTON_1 D1
#define PIN_BUTTON_2 D2
#define PIN_BUTTON_3 D3
#define PIN_BUTTON_4 D4
//светодиоды
#define PIN_LED_STOP D0
#define PIN_LED_5 D5
#define PIN_LED_6 D6
#define PIN_LED_7 D7
#define PIN_LED_8 D8
// переменные 
boolean status = true; // флаг, что активна левая
boolean open = true; // флаг, включения
int interval[6]={50, 120, 90, 240, 150, 50};    // интервал включения/выключения LED
long prestro1Millis = 0;        // до мигания ( в целом переменная времени)
int x=0;
void setup() 
{
  RemoteXY_Init (); 
  pinMode (PIN_BUTTON_1, OUTPUT);
  pinMode (PIN_BUTTON_2, OUTPUT);
  pinMode (PIN_BUTTON_3, OUTPUT);
  pinMode (PIN_BUTTON_4, OUTPUT);
    pinMode (PIN_LED_STOP, OUTPUT);
    pinMode (PIN_LED_5, OUTPUT);
    pinMode (PIN_LED_6, OUTPUT);
    pinMode (PIN_LED_7, OUTPUT);
    pinMode (PIN_LED_8, OUTPUT);
}
void loop() 
{ 
  RemoteXY_Handler ();
 // Движения и повороты ///
  if (RemoteXY.button_1==1) // вперед
  {
     digitalWrite(PIN_BUTTON_1, HIGH);
     if (RemoteXY.select_1 == 1 || RemoteXY.select_1 == 2) //если силектор в положении 1 или 2 включаем переднии фары
      {
        digitalWrite(PIN_LED_5, HIGH);
        digitalWrite(PIN_LED_6, HIGH);
      }
    }
   if (RemoteXY.button_2==1) // назад
  {
      digitalWrite(PIN_BUTTON_2, HIGH);
      if (RemoteXY.select_1 == 1 || RemoteXY.select_1 == 2)//если силектор в положении 1 или 2 включаем стоп сигналы
      {
        digitalWrite(PIN_LED_STOP, HIGH);
      }
    }
  if (RemoteXY.button_3==1)  // влево
  {
     digitalWrite(PIN_BUTTON_3, HIGH);
    }
   if (RemoteXY.button_4==1)  // вправо
  {
      digitalWrite(PIN_BUTTON_4, HIGH);
    }
 //END Движения и повороты ///   
 //  Положение селектора 0 и 2   ///   
  if (RemoteXY.select_1 == 2)
      {
        Migalka ();// Мигалка 
      }   
  if (RemoteXY.select_1 == 0)
      {
          digitalWrite(PIN_LED_STOP, LOW); //
          digitalWrite(PIN_LED_5, LOW); // 
          digitalWrite(PIN_LED_6, LOW); // 
          digitalWrite(PIN_LED_7,  LOW); // 
          digitalWrite(PIN_LED_8, LOW); // 
      } 
 //END Положение селектора 0 и 2 ////      
 // Кнопка не нажата. снимам сигнал с пина //    
   if (RemoteXY.button_1==0)
   {
      digitalWrite(PIN_BUTTON_1, LOW);  
      digitalWrite(PIN_LED_5, LOW); // 
      digitalWrite(PIN_LED_6, LOW); // 
   }
   if (RemoteXY.button_2==0)
   {
      digitalWrite(PIN_LED_STOP, LOW); //
      digitalWrite(PIN_BUTTON_2, LOW); 
   }
   if (RemoteXY.button_3==0)
      digitalWrite(PIN_BUTTON_3, LOW); 
   if (RemoteXY.button_4==0)
      digitalWrite(PIN_BUTTON_4, LOW); 
 //END Кнопка не нажата. снимам сигнал с пина // 
}
void Migalka () // Мигалка 
{
 unsigned long curstro1Millis = millis();  // устанавливаем время в сейчас
  if ((curstro1Millis - prestro1Millis) > interval[x]) // проверяем интервал
    {
      if (open) // если true
        digitalWrite(status ? PIN_LED_7 : PIN_LED_8, HIGH); //
      else // иначе
       digitalWrite(status ? PIN_LED_7 : PIN_LED_8, LOW); // 
       x++;
      if (x == 6) // если последний проход по циклу
      {
        status = !status; // передаем слово (меняем текущий пин) меняем false на true и наоборот;
        x=0;
      }
      open = !open; //меняем false на true и наоборот 
    prestro1Millis = curstro1Millis;
  }
}

Код долек от идеального.

При тестирование машинки выявлены следующие недостатки:

1. стандартных батареек не хватает для плавного запуска двигателя машинки. Машинка пищит и не едет.

2. При сильном ударе об стену батарейки отходят и микроконтроллер на время теряет питание в связи с чем происходит потеря сигнала Wifi .

3. Заряда батареек хватает всего на 1 неделю при использовании по 30-60 мин в день .


P.S.: Начал устранят минусы. Ждите продолжения.

Понравилась статья? Поделитесь ею с друзьями:

Вернуться в раздел: Проекты на NodeMCU, ESP8266, ESP-01 Дата публикации 29 марта , 2017

Комментарии

Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.

Baha34567
#5 Baha34567 (31 мая, 2020 в 05:29)
привет а можно ли на HC-05 блютуз модуле сделать чтобы ходы были плавными, тоесть машинка разгонялась плавно, и как это сделать спасибо за ранее, 
Baha34567
#4 Гость: Baha34567 (25 мая, 2020 в 16:13)

по блютузу можно сделать если да то скинте скеч и естли планость в движении

Валера Бойко
#3 Гость: Валера Бойко (21 февраля, 2019 в 19:34)

Хорошая идея.Надо попробовать сделать самому.Вот это машинка будет просто замечательная

Сергей Яковлев
#2 Гость: Сергей Яковлев (21 февраля, 2019 в 19:34)

а это для любого модуля вайфая?

Inf Ect
#1 Гость: Inf Ect (21 февраля, 2019 в 19:33)

А как инвертировать серву и сделать 2 отдельных джойстика с самоцентровкой?


Cлучайные товары

Посмотреть товар в Магазине »

Мы в соц сетях

Подпишись на канал Telegram

Portal-PK (Портал ПК) © 2015 - 2024
Разработка проектов
AT Block
DWIN Box