Своими руками беспроводная Wifi машинка на NodeMCU и RemoteXY
В
данном проекте я собираю беспроводную
Wifi машинку используя самые простые и
доступные средства. Установил
NodeMCU на микроконтроллереESP8266. Поставил драйвер
L9110S.
Сперва
думал что драйвер будет греться.
Но двигателя
постоянного
тока которые были в машине не очень
мощные
и драйвера L9110S достаточно для управления.
Вы можете поставить на сваю WIFI машинку
другой драйвер например
L298N.
Схема
подключения для
L9110S
и
для L298N
одинаковая.
Программа также будет работать с обоими
драйверами.
Схема подключения всех элементов Wi-fi машинки выглядит следующим образом
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 мин в день
.
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.