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