1

Topic: Радиоуправляемые модели

Предлагаю в данной теме делиться опытом внедрения RemoteXY в радиоуправление.

2

Re: Радиоуправляемые модели

Первый проект с и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);
      }
}

3

Re: Радиоуправляемые модели

было бы не плохо если еще схему приложили))