Topic: Радиоуправляемые модели
Предлагаю в данной теме делиться опытом внедрения RemoteXY в радиоуправление.
You are not logged in. Please login or register.
RemoteXY community → Проекты с RemoteXY → Радиоуправляемые модели
Предлагаю в данной теме делиться опытом внедрения RemoteXY в радиоуправление.
Первый проект с иcпользованием RemoteXY был создан совершенно случайно.
Детям была подарена игрушка Ford Shelby с 4-х канальным управлением, которая им вскоре надоела и была сломана. Катали её без пульта, от чего был сожжён обратным током от двигателя контроллер управления. Я взялся за дело и за пару бессонных ночей придумал новое управление. С телефона.
Использовал следующие платы:
HC-05, Arduino PRO mini, TB6612FNG и старый добрый КРЕН5А
Захотелось не просто управлять движением, а добавить световую индикацию с автоматическим управлением.
Алгоритм родился следующий (АР- автоматический режим, РР - ручной режим):
1. При движении вперёд или назад выключается стоп-сигнал (АР)
2. При остановке включается стоп-сигнал (АР)
3. При движении назад - включается задний ход (АР)
4. Включение фар с телефона (РР)
5. При повороте вправо-влево, мигает соответствующий поворотник (АР)
6. Управление скоростью двигателя вперёд-назад (РР)
Код изначально создан в RemoteXY , но был доработан под этот проект
/*
* Питание на всю электронику через КРЕН5А
* драйвер двигателей TB6612FNG с управлением напряжением на двигатели
* AIN1, AIN2 входы двигателя вперёд-назад
* BIN1, BIN2 входы двигателя поворота
* AO1, AO2 выходы двигателя вперёд-назад
* BO1, BO2 выходы поворота
* PWMA на выход 9 ШИМ (управление скоростью)
* PWMB (незачем управлять скоростью, потому что это поворот, просто подаем высокий уровень), STBY, VCC на +5В
* VM питание моторов 7.4В. Подключение к двум аккумуляторам 18650 3.7В (последовательное соединение)
* Bluetooth HC-05
*/
#define REMOTEXY_MODE__SOFTSERIAL
#include <SoftwareSerial.h>
#include <RemoteXY.h>
// настройки соединения
#define REMOTEXY_SERIAL_RX 3
#define REMOTEXY_SERIAL_TX 2
#define REMOTEXY_SERIAL_SPEED 9600
// конфигурация интерфейса
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
{ 255,6,0,0,0,83,0,6,0,0,
1,0,4,0,27,27,1,226,150,178,
0,1,0,4,36,27,27,3,226,150,
188,0,1,0,35,36,27,27,2,226,
151,132,0,1,0,69,36,27,27,6,
226,150,186,0,2,0,35,1,19,10,
3,226,152,128,0,79,70,70,0,4,
128,35,17,60,11,1,130,1,4,0,
27,63,4,130,1,35,36,61,27,4 };
// структура определяет все переменные вашего интерфейса управления
struct {
// управляющие переменные
uint8_t FWD; // вперёд
uint8_t BCKWD; // назад
uint8_t LEFT; // влево
uint8_t RIGHT; // вправо
uint8_t R_LIGHT; // фары
int8_t ACCELERATE;// =0..100 положение слайдера
int SPEED; //скорость
uint8_t connect_flag; // =1 if wire connected, else =0
} RemoteXY;
#pragma pack(pop)
/////////////////////////////////////////////
// END RemoteXY include //
/////////////////////////////////////////////
#define PIN_FWD 4 //+мотора движения
#define PIN_BCKWD 5 //-мотора движения
#define PIN_LEFT 6 //+мотора поворота
#define PIN_RIGHT 7 //-мотора поворота
#define PIN_R_LIGHT 8 //фары
#define PIN_RIGHT_LIGHT 11 //правые поворотники
#define PIN_LEFT_LIGHT 12 //левые поворотники
#define PIN_STOP_LIGHT 13 //стоп-сигналы
#define PIN_MOTOR_SPEED 9 //управление скоростью
int BLINK = LOW;
long previousMillis = 0; // здесь будет храниться время последнего изменения состояния светодиода
long interval = 500; // частота мигания поворотников (0.5 Гц)
void setup()
{
RemoteXY_Init ();
//выходы и входы
pinMode (PIN_FWD, OUTPUT);
pinMode (PIN_BCKWD, OUTPUT); //использовать выход для подключения света заднего хода
pinMode (PIN_LEFT, OUTPUT);
pinMode (PIN_RIGHT, OUTPUT);
pinMode (PIN_R_LIGHT, OUTPUT);
pinMode (PIN_RIGHT_LIGHT, OUTPUT);
pinMode (PIN_LEFT_LIGHT, OUTPUT);
pinMode (PIN_STOP_LIGHT, OUTPUT);
pinMode (PIN_MOTOR_SPEED, OUTPUT);
// TODO you setup code
}
void loop()
{
RemoteXY_Handler ();
analogWrite(PIN_MOTOR_SPEED, (RemoteXY.ACCELERATE)*2.55); //управление скоростью: 0..100*2.55 чтобы получить диапазон 0..255
digitalWrite(PIN_FWD, (RemoteXY.FWD==0)?LOW:HIGH); //вперёд
digitalWrite(PIN_BCKWD, (RemoteXY.BCKWD==0)?LOW:HIGH); //назад
digitalWrite(PIN_LEFT, (RemoteXY.LEFT==0)?LOW:HIGH); //влево
digitalWrite(PIN_RIGHT, (RemoteXY.RIGHT==0)?LOW:HIGH); //вправо
digitalWrite(PIN_R_LIGHT, (RemoteXY.R_LIGHT==0)?LOW:HIGH);//фары
//стоп-сигнал
if (RemoteXY.FWD==HIGH||RemoteXY.BCKWD==HIGH) //пришёл сигнал - отключаем стопы
{
digitalWrite(PIN_STOP_LIGHT,LOW); //отключение стопов при движении вперед
}
else digitalWrite(PIN_STOP_LIGHT,HIGH); //стоит машина - включаем стопы
//используем таймер вместо delay
if (millis() - previousMillis >= interval)
{
previousMillis = millis();
if (BLINK == LOW)
{
BLINK = HIGH;
}
else
{
BLINK = LOW;
}
}
//поворотники
if (RemoteXY.LEFT==HIGH) //пришел сигнал - мигаем поворотником влево
{
digitalWrite(PIN_LEFT_LIGHT,BLINK); //левый поворотник
}
else
{
digitalWrite(PIN_LEFT_LIGHT,LOW);
}
if (RemoteXY.RIGHT==HIGH) //пришёл сигнал - мигаем поворотником вправо
{
digitalWrite(PIN_RIGHT_LIGHT,BLINK); //правый поворотник
}
else
{
digitalWrite(PIN_RIGHT_LIGHT,LOW);
}
}
было бы не плохо если еще схему приложили))
RemoteXY community → Проекты с RemoteXY → Радиоуправляемые модели
Powered by PunBB, supported by Informer Technologies, Inc.