Импульсные сигналы приемника радиоуправляемой модели. Возможность реализации программно.

2lafrost
Offline
Зарегистрирован: 21.11.2017

Всем доброго времени суток! Гуру, дайте совет, стоит ли заморачиваться на следующую тему:

Имеется китайская NANO V3 ATMega328P и 8-ми канальный модуль на WS2812 оттуда же. Я хотел поставить на радиоуправляемую модель, в багги HIMOTO, FPV камеру с передатчиком. Но прикинул, что лучше ставить 2 камеры, для организации заднего вида. К счастью нашел на Али 2-х канальный переключатель для камер работающий через 3-й (свободный канал), но незадача в том, что в пульте крайне неудобно расположен переключатель 3-го канала. Вопрос в следующем: возможна ли реализация на NANO считывания импульсных сигналов и их эмуляция ардуиной? Т.е. При торможении включается красный, а при заднем ходе эмулируется сигназ 3-го канала для переключения камеры и включается белый. Как то так. Спасибо.

 

Oleg G
Offline
Зарегистрирован: 27.11.2017

Можно. Я делал. Вот код моей схемы огней для авто. 
 

//attiny861,фюз внутр 8МГц(cdiv8=1), все остальное по дефолту, автоогни с калибровкой нейтрали, изменяемой яркостью фар и звуком "гудка"
// Ch1 - газ
// Ch2 - руль
// Ch3 - свет 0/габарит/бл/дал
// Ch4 - сигнал
//#include <EEPROM.h>
unsigned long ppm_trh,ppm_str,ppm_light,ppm_aux1;
  int pinCh1=0; //  вход "газ"
  int pinCh2=1; // вход "руль"
  int pinCh3=2; // вход "свет"
  int pinCh4=14; // вход "сигнал"
  int lightstop = 10;                 // стоп
  int revers = 11;                 // задний ход
  int strR = 12;                 // правый поворот
  int strL = 13;                 // левый поворот
  int buttonPin = 9;            //кнопка калибровка нейтрали
  int buttonled = 7;            //светодиод калибровки
  int lightG = 8;                 // свет ШИМ
  int horn = 6;                 // бибикалка
  int thrState;        // флаг установки газа
  int trh_min;   //нижняя граница нейтрали газа, 
  int trh_max;   //верхняя граница нейтрали газа
  int str_min;   //нижняя граница нейтрали руля
  int str_max;   //верхняя граница нейтрали руля
  //int buttonState = HIGH;  
  
void setup()
{  
 
  pinMode (pinCh1, INPUT); //  Rx channel 1
  pinMode (pinCh2, INPUT); //  Rx channel 2
  pinMode (pinCh3, INPUT); //  Rx channel 3
  pinMode (pinCh4, INPUT); //  Rx channel 4
  //pinMode (buttonPin, INPUT_PULLUP); //  калибровка нейтрали, с подттяжкой, активный "0"
  pinMode(lightstop, OUTPUT); // устанавливаем режим работы вывода, как "выход"
  pinMode(revers, OUTPUT);    // устанавливаем режим работы вывода, как "выход"
  pinMode(strR, OUTPUT);      // устанавливаем режим работы вывода, как "выход"
  pinMode(strL, OUTPUT);      // устанавливаем режим работы вывода, как "выход"
  pinMode(lightG, OUTPUT);    // устанавливаем режим работы вывода, как "выход"
  pinMode(horn, OUTPUT);      // устанавливаем режим работы вывода, как "выход"
  pinMode(buttonled, OUTPUT);      // устанавливаем режим работы вывода, как "выход"
  
  
    
}
    uint32_t ms, ms1 = 0;
    bool led_stat    = true;
    
void loop()
{
// калибровка нейтрали при включении или сбросе, 3 сек,индикация светодиодом.кнопка на ресете
    while (millis () < 3000) {
      ppm_trh = pulseIn (pinCh1, HIGH, 20000); //read RC channel 1
        trh_min=ppm_trh-50;// нижняя граница нейтрали газа
        trh_max=ppm_trh+50;// верхняя граница нейтрали газа
    ppm_str = pulseIn (pinCh2, HIGH, 20000); //read RC channel 2
        str_min=ppm_str-50;// нижняя граница нейтрали руля
        str_max=ppm_str+50;// верхняя граница нейтрали руля
      digitalWrite(buttonled,HIGH);
    }
   digitalWrite(buttonled,LOW); // выкл свд, калибровка закончена 
// чтение канала газа, управление стопом и з.х.
   ppm_trh = pulseIn (pinCh1, HIGH, 20000); //read RC channel 1
    
    if (ppm_trh > trh_max ) {
      thrState=1; //   флаг включения газа вперед
    }
    else if (ppm_trh>trh_min&&ppm_trh<trh_max){
      thrState=0; // нейтраль газа 
    }
      if (ppm_trh <trh_min){
        if (thrState==1) {
          digitalWrite(lightstop, HIGH);  // если ГАЗ с максимума резко назад, то включается СТОП
        }
          else {
            digitalWrite(revers, HIGH);  // если ГАЗ с нейтрали назад, включается ЗАДНИЙ ХОД
            }
      }
          else {
      digitalWrite(revers, LOW);  // выключаем светодиоды заднего хода и стопов
      digitalWrite(lightstop, LOW);
        }

//чтение канала руля, управление поворотами
  ppm_str = pulseIn (pinCh2, HIGH, 20000); //read RC channel 2
    if (ppm_str < str_min ) {
      ms = millis();
// период мигания стопов 500 мс   
   if( ( ms - ms1 ) > 500 || ms < ms1 ){
       ms1 = ms;
// Инвертируем светодиод       
       digitalWrite(strR, led_stat); // Мигаем правым
       led_stat = !led_stat;
       digitalWrite(strL, LOW);// гасим противоположный поворот
   }
    }
    else if (ppm_str > str_max ){
     ms = millis();
// период мигания стопов 500 мс   
   if( ( ms - ms1 ) > 500 || ms < ms1 ){
       ms1 = ms;
// Инвертируем светодиод       
       digitalWrite(strL, led_stat); // мигаем левым
       led_stat = !led_stat;
       digitalWrite(strR, LOW); // гасим противоположный поворот 
   }
    }
    else if (ppm_str>str_min&&ppm_str<str_max){
      digitalWrite(strL, LOW);   // выключаем повороты
      digitalWrite(strR, LOW);   // 
    }
  // управление фарами(яркостью), пропорционально 4 положения:выключено,габарит,ближний,дальний
  ppm_light = pulseIn (pinCh3, HIGH, 20000); //read RC channel 3
    if (ppm_light<1250) {
    analogWrite(lightG, 0);   // выключаем фары
     }
    else if (ppm_light>1250&&ppm_light<1500) {
    analogWrite(lightG, 30);   // включаем яркость "габарит"
    }
    else if (ppm_light>1550&&ppm_light<1700) {
    analogWrite(lightG, 127);   // включаем яркость "ближний"
    }
    else if (ppm_light>1750) {
    analogWrite(lightG, 255);   // включаем яркость "дальний"
    }
// включение сигнала, простой ШИМ,дискретный или проп. канал
  ppm_aux1 = pulseIn (pinCh4, HIGH, 20000); //read RC channel 4
    if (ppm_aux1>1700) {
      analogWrite(horn,180);// сигнал ШИМом, для аттини861, 
    //digitalWrite(horn, HIGH);   // включаем "сигнал" , если просто нужен лог.выход
    //tone(horn, 320); // выдаём на "сигнале" сигнал с частотой 320 Гц "гудок", работает на атмега328
  }
    else  {
      analogWrite(horn,0);//
      //noTone(horn); // выключено, работает на атмега328
    //digitalWrite(horn, LOW);   // выключаем сигнал
  }
 }