Организация диммера для Божьей коровки
По просьбам коллег по хобби я с удовольствием расписываю, как именно я делал передний прожектор и как сделал диммер.
Для подсветки, как я писал в основной записи на тему модификации валькеры, я выбрал лампу подсветки салона о восьми светодиодах. Лампа настолько яркая, что смотреть даже близко в ее сторону на полной яркости не возможно. А вторая прелесть: все уже организовано на работу от 12 вольт бортовой сети автомобиля (где бывает и 13.5, если что). Оставалось только решить, как влючать эту штуковину с пульта.
Учитывая, что teensy уже стояла, то именно она и была выбрана на роль читалки одного из PWM каналов приемника и интерпретации его показаний.
Для чтения я использовал простейший arduino код:
#define RCPIN 2
#define LAMP1 10
volatile uint16_t channel;
uint16_t channel_start;
void setup() {
pinMode(RCPIN, INPUT);
attachInterrupt(RCPIN, RCchannel, CHANGE);
pinMode(LAMP1, OUTPUT);
}
void loop() {
if (channel < 1200) {
digitalWrite(LAMP1, LOW);
}
if (channel >= 1500) {
digitalWrite(LAMP1, HIGH);
}
delay(1000);
}
void RCchannel() {
if (digitalRead(RCPIN) == HIGH) {
channel_start = micros();
} else {
channel = (uint16_t) (micros() - channel_start);
}
}
Этот код просто читает значение на канале, подключенном к пину №2, измеряет интервал времени, когда на канале есть сигнал (PWM), далее запоминает длинну сигнала и сохраняет в переменную channel.
В ней и сохраняется драгоценное значение PWM. По показаниям монитора (serial monitor) данные менялись от примерно 950 до 1950. Таким образом текущий код зажигает единицу на десятом пине, который включает лампу.
Теперь попробуем сделать диммер. Для этого нужно заставить диод моргать с нужной частотой, чтобы яркость менялась (это не лампочка, которую можно напряжением делать тусклее). Не буду объяснять, как работает сам код диммера, думаю, что загуглить две функции в справке вы сможете. Фрагмент, отвечающий за работу диммера будет такой:
int thr1 = 1300; //ниже этого порога диод гасим полностью
int thr2 = 1700; //выше этого порога диол горит постоянно (полная яркость)
if (channel < thr1) {
analogWrite(LAMP1, 0);
}
if ((channel >= thr1) & (channel <thr2)) {
ledvalue = constrain(channel,thr1,thr2);
ledvalue = map(ledvalue,thr1,thr2,0,255);
analogWrite(LAMP1,ledvalue);
}
if (channel >= thr2) {
analogWrite(LAMP1, 255);
}
Пожалуй, самое страшное закончили. Теперь осталось только коммутировать нашими слаботочными 3.3 вольтами на выходе с teensy (или arduino) большие и страшные 12В с аккумулятора. Для этого можно подобрать удобный транзистор, но я (по совету товарища, а так же по тому, что у него оно было, а у меня - нет) решил использовать страшные irlml2402. Я, к сожалению, далеко не так силен в электронике, и понять назначение сей хреновины могу с трудом, но суть тут почти та же, что и у транзистора, только разрывает он землю, а не 12В. Сам затвор выполнен в smd форм-факторе, поэтому он был аккуратно припаян к проводкам и посажен в маленькую каплю эпоксидки, после чего обжат в термоусадку.
В итоге - простой и эффектный диммер приятно вешается на любой удобный канал, а народ, разинув рты, смотрит на это, как на чудо. 😁