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