Как рассказываю в предыдущей статье, электроника машинки была подключена по вот такой схеме.
И потаилась
от 4 батареек формата АА. Так как постоянно
покупать батарейки надоело, я решил
переделать питание от
аккумулятора
18650
. А так как у меня аккумуляторы из
старой батареи ноутбука
, они плохо
держат заряд. По этой причине я решил
сделать питание от двух аккумуляторов.
Но как показала практика, данные
аккумуляторы оказались еще хуже чем я
думал. Даже 2 не держат нагрузку и
Wi-Fi
постоянно отваливался. Как я разбирал
батарею от ноутбука смотрите
тут. Позднее
я разобрал второй батарею от ноутбука.
Аккумуляторы были розового цвета. И
держат они нагрузку неплохо. Даже один
аккумулятор 18650 справлялся с нагрузкой
без проблем.
Собрал я машинку на NodeMCU без изменения управляющей
программы и был удивлен машинка постоянно
дрифтовала, ее разворачивала постоянно.
Для
дрифта это отлично, но нормально
поездить можно только на улице по
асфальту. Поэтому я решил переделать
управление рулем и управляющую программу.
На схеме выше
приведен принцип
подключения аккумулятора
через повышающий DC-DC
преобразователя
и контролера заряда. Благодаря данной
схеме подключения можно заряжать
аккумулятор не вынимая его из машинки,
что достаточно удобно и практично.
Также по
схеме видно что остался один двигатель
и появился сервопривод. Сейчас управление
поворотами происходит благодаря
сервоприводу.
Скетч для
NodeMCU в среде программирования Arduino IDE
для приложения RemoteXY
выглядит вот так:
//////////////////////////////////////////////
// RemoteXY include library //
//////////////////////////////////////////////
// определение режима соединения и подключение библиотеки RemoteXY
#define REMOTEXY_MODE__ESP8266WIFI_LIB_POINT
#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[] =
{ 255,3,0,0,0,25,0,6,5,2,
5,8,43,13,39,39,10,52,43,43,
2,3,131,13,12,14,37,10,18,45,
17,4 };
// структура определяет все переменные вашего интерфейса управления
struct {
// input variable
int8_t joystick_1_x; // =-100..100 координата x положения джойстика
int8_t joystick_1_y; // =-100..100 координата y положения джойстика
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 MOTOR_RIGHT_UP D1
#define MOTOR_RIGHT_DN D2
/* определяем пины управления левым мотором
#define MOTOR_LEFT_UP D3
#define MOTOR_LEFT_DN D4*/
#include <Servo.h>
#define PIN_SERVO D4
Servo servo;
//светодиоды
#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_LED_STOP, OUTPUT);
pinMode (PIN_LED_5, OUTPUT);
pinMode (PIN_LED_6, OUTPUT);
pinMode (PIN_LED_7, OUTPUT);
pinMode (PIN_LED_8, OUTPUT);
servo.attach(PIN_SERVO);
}
void loop()
{
RemoteXY_Handler ();
// Положение селектора 0 и 2 ///
if (RemoteXY.select_1 == 2)
{
Migalka ();// Мигалка
}
if (RemoteXY.select_1 == 1)
{
digitalWrite(PIN_LED_STOP, HIGH); //
digitalWrite(PIN_LED_5, HIGH); //
digitalWrite(PIN_LED_6, HIGH); //
}
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 ////
/* управляем мотором */
int y = RemoteXY.joystick_1_y;
if (y>100) y=100;
if (y<-100) y=-100;
if (y>20) {
analogWrite(MOTOR_RIGHT_UP, y*10.23);
digitalWrite(MOTOR_RIGHT_DN, LOW);
}
else if (y<-20) {
digitalWrite(MOTOR_RIGHT_UP, LOW);
analogWrite(MOTOR_RIGHT_DN, (-y)*10.23);
}
else {
digitalWrite(MOTOR_RIGHT_UP, LOW);
digitalWrite(MOTOR_RIGHT_DN, LOW);
}
int x = RemoteXY.joystick_1_x;
if (x>100) x=100;
if (x<-100) x=-100;
if (x>10) {
servo.writeMicroseconds(x*2.5+1600);
}
else if (x<-10) {
servo.writeMicroseconds(x*2.5+1600);
}
else {
servo.writeMicroseconds(1600);
}
}
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;
}
}
Повторить
данную машинку может каждый желающий.
Вам не нужно писать код или писать
приложения для Android. Достаточно загрузить
прошивку в
NodeMCU. И на свое устройства
установить приложение
RemoteXY. Подключиться
к
Wi-fi сети с имением PortalPK. И ваше устройство
станет пультом для машинки.
Используем библиотеку ESP8266WiFi версии 1.0 из папки: C:\Users\Администратор\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries\ESP8266WiFi
exit status 1
Ошибка компиляции для платы NodeMCU 1.0 (ESP-12E Module).
#2 Гость: Дмитрий Дунденков (21 февраля, 2019 в 19:30)
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.