В предыдущей статье я привёл способ создания магнитного левитатора-ночника, но он ещё недостаточно поражает воображение. Пришло время заставить левитирующий светильник переливаться всеми цветами.
Для нашей цели подойдёт простой микроконтроллер Attiny44A. На борту у него имеется два таймера с четырьмя ШИМ-выходами, три из которых мы и используем. К сожалению, заполнение ШИМ можно изменять всего от 0 до 255, но и этого хватает для плавного изменения свечения каждого из цветов RGB светодиода.
Катушка L1 содержит 200 витков эмалированного провода 0,3 мм. Конденсатор C1 – танталовый на 16 В. Конденсатор C2 служит для устранения высокочастотных помех в питании микроконтроллера. Далее идёт стабилизатор напряжения на TL431, делителем R6-R8 задаётся напряжение стабилизации (в моём случае это 5,12 В), а через резистор R2 излишки напряжения уходят на землю. И здесь стоит пояснить почему именно так организована стабилизация напряжения. В первом варианте LDO-стабилизатор стоял только на питании микроконтроллера и ограничивал напряжение на нём на 3,3 В. После включения устройство проработало буквально несколько секунд и как только ярко загорелся зелёный светодиод, всё погасло. Вскрытие показало пробой конденсатора С1. Я поспешил и не учёл, что энергия от первичной катушки поступает постоянно в неизменном объёме, а потребление схемы изменяется в зависимости от текущего сигнала на транзисторах светодиодов и при низком потреблении энергии (горит только зелёный светодиод через резистор в 1 кОм) напряжение на конденсаторе улетало больше 30 В. Соответственно один из выходов был стабилизировать потребление энергии с чем прекрасно справляется TL431, которая открывается при напряжении на управляющем контакте 2,5 В и ток начинает утекать на землю через ограничивающий резистор.
Резисторы R3, R4, R5 имеют разный номинал, так как светодиоды разного цвета имеют разную яркость свечения при одинаковом токе. Самый яркий оказывается зелёный, синий немного тусклее и самый тусклый и прожорливый – красный.
Перебор цветов осуществляется по данной схеме. На первом этапе на красный светодиод подаётся единица, на синий ноль, а на зелёный подаётся ШИМ, с постепенно увеличивающемся коэффициентом заполнения, пока не будет достигнута единица, после этого переходим ко второму этапу и так далее.
RGB-светодиод необходимо подпилить, чтобы свет рассеивался на окружающий корпус, а не светил в одну точку. Вся схема уместилась на небольшой плате и была собрана в такой же корпус, что и светильник из предыдущей статьи.
Код для микроконтроллера писал в CodeVisionAVR. Микроконтроллер работает на частоте в 1 МГц, соответственно ШИМ настроен на 3,9 кГц.
#include <tiny44.h>
#include <delay.h>
//Заменяем названия регистров ШИМ на наименования цветов для удобства
#define RED OCR0A
#define BLUE OCR0B
#define GREEN OCR1AL
int RGB=0;
int i=0;
void main(void)
{
// Настроаиваем биты 6 и 7 порта А на выход
DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
// Настроаиваем бит 2 порта В на выход
DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Настраиваем Timer0
// Частота 1 МГц, на выводы А и В подаётся неинвертированный сигнал ШИМ
// Период ШИМ 0,256 мс
TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Настраиваем Timer1
// Частота 1 МГц, на вывод А подаётся неинвертированный сигнал ШИМ
// Период ШИМ 0,256 мс
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
RGB=0;//Выбор с какого пункта начинать цикл
i=60;//Переменная для задержки в мс, чем больше значение, тем медленней перебор цветов
while (1)
{
switch(RGB)
{
case 0:{RED=0xFF; BLUE=0; if(GREEN==0xFF){RGB=1;} else{GREEN++;} break;}
case 1:{GREEN=0xFF; BLUE=0; if(RED==0){RGB=2;} else{RED--;} break;}
case 2:{GREEN=0xFF; RED=0; if(BLUE==0xFF){RGB=3;} else{BLUE++;} break;}
case 3:{BLUE=0xFF; RED=0; if(GREEN==0){RGB=4;} else{GREEN--;} break;}
case 4:{BLUE=0xFF; GREEN=0; if(RED==0xFF){RGB=5;} else{RED++;} break;}
case 5:{RED=0xFF; GREEN=0; if(BLUE==0){RGB=0;} else{BLUE--;} break;}
}
delay_ms(i);
}
}
В итоге получилось завораживающее устройство, которое красиво переливается в темноте.
И бонусом для всех дочитавших схема магнитного левитатора из 2007 года.
Левитатор был собран в виде П‑образной конструкции. Сверху был закреплён электромагнит, намотанный проводом 0,5 мм на болте М10. В полутора сантиметрах ниже располагалась оптопара HL1-BL1, в луче которой висел металлический предмет (например АА батарейка). К сожалению, фото готового левитатора не сохранились. Жаль, что в те годы про неодимовые магниты я не знал, а датчик холла был только в трамблёре девятки).
Комментарии (3)
s_kirill
23.08.2023 17:43можно вообще убрать транзисторы, подключив светодиод напрямую через резисторы R7, R9 и R10 (уменьшив их сопротивление). выход тиньки способен отдать до 40-ка миллиампер.
VT100
P.S. Можно поиграться с усреднением ШИМ и/или увеличением несущей частоты.
Alex_GESUE Автор
Неплохо проверить влияние R2. Максимальный ток, который способен отвести D2 из-за его наличия — около 13 мА. Если выпрямитель способен выдать больше — напряжение будет расти.
Да, я это учёл и в моём случае такого номинала хватает, что бы напряжение не росло, но если просчитаться, то проблема с высоким напряжением сохранится.