Управление прожектором без RC-switch
Понадобилось подрубить фары к коптеру на NAZE32 под iNAV/CleanFlight. Фары надо включать отдельным диапазоном канального импульса, например > 1700 ms. Приемник подключен по CPPM, так что выходы каналов проброшены на выходы моторов посредством вкладки Servo.
Для питания светодиодов использован драйвер: JRLED MR16-9W Power Driver for Light Lamp Bulb (DC 12~14V / 5PCS)
Линзы 2шт: 22mm 30 Degree Condensing Lens for LED Light - White (5 PCS)
Светодиоды 2шт (последовательно): Eipstar JR 3W 180lm 5500K Neutral Light LED Module
Драйвер собран на микросхеме MC34063A, которая имеет вывод 5 (COMP) для управления напряжением светодиода. По умолчанию на нем 0 через подключение к GND, что дает максимальное напряжение. Я отогнул его и подключил через резистор 8.2k к земле. Если на вывод подать 5V, светодиод выключится. Но проблема в том, что iNAV/CleanFlight не может выдать лог.1 на моторные выводы при попадании канального импулься в заданный диапазон. Хорошо бы иметь для этого что-то типа конфигурации на вкладке Flight Modes…
Поэтому управлять этим драйвером через GPIO без допиливания iNAV не получится… Но есть другое решение.
Можно использовать RC-switch, но это дополнительный вес на маленьком коптере и вообще ломает идеалы 😁
Решение - снимать сигнал с вывода контроллера MinimOSD и допилить его прошивку. Я использовал вывод 3 в среде Arduino (вывод PD3 контроллера, прямо над отметкой на корпусе). Пробросил от него провод на видеоконнектор +12V, который предварительно откусил от платы.
В прошивке scarab-osd сделал включение этого вывода по канальному импульсу и также режим мигания 2Hz для отдельного диапазона импульса. Вывод 3 контроллера MinimOSD подключен к проброшенному моторному пину контроллера NAZE32.
Изменения в файлах:
Config.h (добавить в конец):
// AP; START;
/************ Adding Custom GPIO output pin controlled by channel value; Used for LED driver control *********/
// Comment out CUSTOM_OUT_PIN if this logic is not needed at all;
#define CUSTOM_OUT_PIN 3 // This pin will output logical level;
#define CUSTOM_OUT_STICK 7 // Ch.7 is AUX3 in iNAV;
// These conditions may be commented out if not needed;
#define CUSTOM_OUT_HIGH_CONDITION (MwRcData[CUSTOM_OUT_STICK] > 1675) // This condition is checked first;
#define CUSTOM_OUT_FLASH_CONDITION (MwRcData[CUSTOM_OUT_STICK] > 1500) // Flashing at 2Hz; This is checked if condition for HIGH evaluated false;
// These setting define what means LOW and HIGH from logical level point; they allow to invert signal;
#define CUSTOM_OUT_HIGH LOW // My LED driver requires inverted signals;
#define CUSTOM_OUT_LOW HIGH
// AP; STOP;
MW_OSD.ino (добавить в конец функции setup():
// AP; START; Custom output support;
#if defined CUSTOM_OUT_PIN
pinMode(CUSTOM_OUT_PIN, OUTPUT);
digitalWrite(CUSTOM_OUT_PIN, CUSTOM_OUT_LOW);
#endif
// AP; STOP; Custom output support;
MW_OSD.ino (добавить в конец функции loop():
// AP; START; Custom output support;
#if defined CUSTOM_OUT_PIN
byte customLedState = CUSTOM_OUT_LOW;
#if defined CUSTOM_OUT_HIGH_CONDITION
if (CUSTOM_OUT_HIGH_CONDITION) {
customLedState = CUSTOM_OUT_HIGH;
}
#endif
#if defined CUSTOM_OUT_FLASH_CONDITION
if (timer.Blink2hz && (CUSTOM_OUT_FLASH_CONDITION)) {
customLedState = CUSTOM_OUT_HIGH;
}
#endif
digitalWrite(CUSTOM_OUT_PIN, customLedState);
#endif
// AP; STOP; Custom output support;
Все протестил и замазал liquid electrical tape.