Световые эффекты для радиоуправляемой машинки.

Старик Похабыч

★★★★★★✩
14 Авг 2019
1,986
502
Москва
Для красоты хочется что бы все мигало и блестело, переливалось красками )
Делать все планируется разного размера и цвета светодиодами , подключаемыми к мультисерво шилду, вот такому
Требуется некое кол-во идей, что можно еще добавить.

Пока есть такие мысли
Головная оптка:
1) Крупные белые светодиод - фары, при движении вперед горят ярко, при движении назад и остановке горят тускло. Можно сделать , что тускло гореть начинают после некоторого времени простоя. Да, наверное исправлю на такое. Может быть отключено кнопкой включения / выключения света на пульте.
2) Поворотники. Две пары желтых, мелких светодиода мигающие с определенной частотой. Включаются при отклонении рулевого колеса вправо или влево.
Задние фонари:
1) Стоп сигнал. При снижении PWM сигнала в сторону заднего хода горит ярко красным цветом, при движении вперед или остановке горит тускло. Наверное введу такое же условие , как и для головного света, что если стоит больше n секунд, то загорается ярко.
2) Фонарь заднего хода, включается при движении задним ходом, в остальное время выключен.

Вся эта обвеска работает в автономном режиме, т.е. не требует внимания оператора.
Что можно добавить в будущем:
1) Фара-искатель. Несколько белых светодиодов на крышу. Но включать надо будет с пульта. Под вопросом.
2) Аварийка. Те же поворотники, но работать начинают после того, как куда то врежешься, для этого надо поставить акселерометр. Далекое будущее, тоже под вопросом пока.
аварийка.

На макетке все работает.

Буду рад комментариям

ЗЫ. Как изменить размер картинки ? Что то она на пол экрана...
 
Последнее редактирование:

Старик Похабыч

★★★★★★✩
14 Авг 2019
1,986
502
Москва
Вот реализация того, что было задумано:

для работы необходимо установить библиотеку Adafruit PCA9685 PWM Servo Driver Library

Плата подлкючается элементарно по i2c , должна быть общая земля.
+5 вольт подавал отдельно от ардуины, светодиоды подключал без резисторов, на полную катушку не жарил, по вольтметру не боле 2.2 вольт, где то даже меньше.
На А6 подключен потенциометр , который заменяет полученные по NRF данные (см. протокол передачи данных из этой темы Еще одна простая машинка на NRF) и для управления скоростью и для поворота, ну один у меня остался. второй не нашел, что бы сделать раздельное управление.
Слабое снижение скорости не зажигает стоп-сигналы, буду считать это движение накатом ), на самом деле все равно есть дребезг в получении данных с потенциометра +-1 единица, поэтому на такое изменение стоп -сигналы не реагируют.
При движении стоп сигналы горят в слабо, делают вид, что они габариты. (я им так сказал). Тоже самое делают фары при движении задним ходом
Светодиод зеленого цвета это фонарь заднего хода.
C++:
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
static int vol_o=0;

void setup() {
  // put your setup code here, to run once:
  pinMode(A6, INPUT);
  Serial.begin(9600);

  pwm.begin();
  pwm.setOscillatorFrequency(27000000);  // The int.osc. is closer to 27MHz
  pwm.setPWMFreq(1600);  // This is the maximum PWM frequency
  Wire.setClock(400000);
};


void loop() {
  // получение данных с потенциометра, ка бы это было при работе с NRF
  int trys=30;
  int a6 = 0;
  for (int i = 0; i <trys ; i++)a6 = a6 + analogRead(A6);
  int vol = map(a6 / trys, 0, 1018, -100, +100);
  if (vol_o!=vol)
    {
      Serial.print(vol_o);Serial.print("->");Serial.println(vol);
      vol_o=vol;
    }
  //

  // Povorotnik(vol); // подпрограмма обработки прворотников
  Front_Rear(vol); // фары и стопы
}

void Povorotnik(int vol)
{
  byte Period=200; // период мигания, пока в переменной, можно в дефайн
  static uint32_t on_Time = 0;
  static bool On_Off = false;

  if (abs(vol) < 10) vol = 0; // если едем примерно прямо, поворотники  включаю
  if (vol == 0)
  {
    pwm.setPWM(3, 0, 0);
    pwm.setPWM(2, 0, 0);
    return;
  }
  if ((millis() - on_Time) > Period)
  {
    On_Off = !On_Off;
    if (vol < 0)
    {
      pwm.setPWM(3, 0, 2000 * On_Off);
      pwm.setPWM(2, 0, 0);
    }
    else
    {
      pwm.setPWM(2, 0, 2000 * On_Off);
      pwm.setPWM(3, 0, 0);
    };
    on_Time = millis();
  };
};

void  Front_Rear(int vol)
{
  static uint32_t on_Time = 0;
  static int old_vol = 0;
  if (abs(vol) < 3) vol = 0;
  if (vol == 0)
  {
    if ((millis() - on_Time) > 2000)
    {
      pwm.setPWM(12, 0, 0);
      pwm.setPWM(14, 0, 100);
      pwm.setPWM(15, 0, 100);
      pwm.setPWM(10, 0, 3000);
      pwm.setPWM(11, 0, 3000);
    }
    old_vol = vol;
    return;
  };

  on_Time = millis();

  if (vol > 0)
  {
    pwm.setPWM(14, 0, 3000);
    pwm.setPWM(15, 0, 3000);
    pwm.setPWM(12, 0, 0);
    }
    else
    {
    pwm.setPWM(14, 0, 1000);
    pwm.setPWM(15, 0, 1000);
    pwm.setPWM(12, 0, 2000);
    };

  if ((abs(old_vol) - abs(vol)) > 1)
  {
    pwm.setPWM(11, 0, 3000);
    pwm.setPWM(10, 0, 3000);
    Serial.println(vol);
  }
  else
  {
    pwm.setPWM(11, 0, 100);
    pwm.setPWM(10, 0, 100);
  };

  old_vol = vol;
};
112.jpg
 
Последнее редактирование: