IT не только работа |
|
IT
– сфера проникла практически во все отрасли человеческой жизни. В недалеком будущем уже рядовому пользователю будет
доступен интернет – холодильник, который сам под чутким руководством хозяина способен заказывать продукты через Internet.
Тем не менее, при таком НТП не выходят из моды вещи собственноручно сделанные, так называемые handmade
– сувениры. Об одном из таких собственноручно разработанном и собранном пойдет речь в этом разделе. |
|
Суть
разработки |
|
Сувенир
представляет собой набор светодиодов расположенных в форме сердца.
Управляющая
плата производит их последовательное включение – выключение
тем самым образуя
необходимые эффекты: бегущий огонь, пульсация напоминающая удары
сердца, плавное
последовательное загорание/затухание групп светодиодов. |
|
Элементная
база |
|
В
качестве управляющей микросхемы был использован контроллер ATmega8 [2].
Изначальный вариант планировался на использовании ATtiny2313,
но в ходе разработки оказалось, что 2 Кб Flash-памяти
недостаточно для организации большого количества эффектов (изначальный
план –
создание бегущих огней с длительностью одного цикла минимум на 30 с.),
для
оптимизации алгоритмов свечения под данный МК необходимо было
использовать Assembler что
усложняло разработку прошивки для контроллера. И последним критерием
отказа от ATtiny2313
было
всего лишь 17 возможных для использования бит портов ввода-вывода (при
условии
использования внутреннего тактового генератора). Это возможно
компенсировать
организацией матричного поля светодиодов, но т.к. это не
основополагающий
фактор для отказа от ATtiny2313,
то это не более, чем просто рассуждение. |
|
AtMega8
при тех же электрических параметрах обладает памятью
в 8 Кб Flash,
что дает возможность абстрагироваться от ПО низкого
уровня и использовать для создания прошивки С. Также данного объема
памяти
достаточно для создания прошивки с заданной продолжительностью эффектов
и
возможностью подключения 18 светодиодов (изначально планировалось
подключение
20, но создав макет платы в Sprint Layout и
тестовой распечатки в масштабе 1:1 мне не понравилось как они
расположены на
плате и было убрано 2 светодиода). Так как выводы контроллера
использовались
только под светодиоды, и их дефицит отсутствует, то необходимости в
организации
матричного поля светодиодов нет. Поэтому каждый светодиод был подключен
к
отдельной ножке контроллера. |
|
Питание
схемы производится посредством 3-х последовательно соединенных батареек
типа АА
со стандартным питанием на выходе 1,5В. Ведомых схем тут как таковых
нет, все
управление производится над светодиодом. |
|
Программная
реализация и основы использования ШИМ |
|
Для
создания эффекта плавно заграющегося и плавно затухающего огня нужно
использовать ШИМ – широтно-импульсную модуляцию (PWD
- Pulse-width modulation). [1]
Прежде, чем использовать его в своих целях
обратимся к теории и рассмотрим как это реализуется в реальности. |
|
Классический
ШИМ сигнал представляет собой цифровой сигнал, определенной постоянной
частоты.
Меняя скважность
(отношение
длительности периода к длительности импульса или длительность состояния
логической единицы в периоде сигнала) можно плавно менять эту площадь,
а значит
и напряжение на выходе. Например, на рисунке 1 показаны разные ШИМ
сигналы. |
|
Рисунок
1
– Демонстрация ШИМ-сигналов |
|
Таким
образом, если на выходе сплошные лог.1, то выходное напряжение будет
напряжением
высокого уровня, а если 50% времени будет высокий уровень, а 50% низкий
то
выходное напряжение будет равно половине напряжения высокого уровня. |
|
Реализовать
ШИМ на микроконтроллере можно двумя способами. Первый –
аппаратно. Для этого у
таймера есть специальный регистр сравнения OCR**. Когда значение в
счётном
регистре таймера достигает значения находящегося в регистре сравнения,
то могут
возникнуть следующие аппаратные события:
- прерывание
по совпадению;
- изменение
состояния внешнего выхода сравнения OC**.
Выходы
сравнения выведены наружу, они изображены на рисунке 2. |
|
Рисунок 2 – Выводы сравнения встроенного ШИМ |
|
Таким
образом, можно настроить ШИМ так, чтобы при значении в счетном регистре
больше,
чем в регистре сравнения на выходе была лог. 1, а если меньше –
то лог. 0. |
|
Для
поставленной задачи необходимо управлять 18-ю светодиодами с помощью
ШИМ. При
реализации матричной структуры доступа понадобится 6 каналов, что не
обеспечивает выбранный контроллер. Потому необходимо написать
программную
реализацию модуляции [3]. Простейшая реализация плавного включения на языке
С имеет
вид: |
|
while (1) {
k=3000;
// задаем ширину одного тактового
сигнала
while(k>1) {
for(i=1;
i<=k; i=i+1)
PORTC=PORTC
& 0b11111110; //LEDoff
for(i=k;
i<=3000; i=i+1)
PORTC=PORTC | 0b00000001; //LEDon
k=k-50; /* меняем выходное напряжение
ШИМ,
дает возможность задавать скорость нарастания напряжения */
}
} |
|
Так
как каждый светодиод был подключен к отдельному
порту, то доступ к нему не представляет проблемы, в ходе цикла возможно
в
качестве эффекта использовать любое количество светодиодов что не может
не
радовать. |
|
Следует
отметить, что при создании цикла for для
каждого порта оказалась неэффективной, поэтому для изменения напряжений
на 3-х
портах может быть реализована следующая программа: |
|
a=0; // задаем
количество каналов
while (a<3) { //
пока
все не перепробуем - не успокоимся
k=3000;
// ширина
одного импульса
while(k>1)
{
for
(i=k;i<3000;i++)
if (a==0) // если счетчик сейчас на 0 - переключаем 1-й LED
PORTC=PORTC
& 0b11111110;
if (a==1) // если
счетчик сейчас на 1 - переключаем 2-й LED
PORTC=PORTC
& 0b11111101;
if (a==2) // если
счетчик сейчас на 2 - переключаем 3-й LED
PORTC=PORTC & 0b111111011;
for
(i=1;i<k;i++)
if
(a==0)
PORTC=PORTC
| 0b00000001;
if
(a==1)
PORTC=PORTC
| 0b00000010;
if
(a==2)
PORTC=PORTC
| 0b00000100;
k=k-500;
// увеличиваем напряжение
}
a=a+1;
// меняем номер диода
}
|
|
Как
видно, задается счетчик для светодиодов,
который задает определенный номер. По этому номеру определяется какой
светодиод
(или возможная группа светодиодов при организации в структуре if нескольких
переключений) сейчас работает. На практике
оказалось, что перебор 18 условий каждый раз довольно проблематичная
задача и
за счет всех проверок скважность меняется. В итоге при последовательных
18
условных операторах уже на 6-м светодиоде было заметно, что загорается
он не
плавно, а с мерцанием. Поэтому все включения-выключения были вынесены в
2
процедуры: port_and() – выключение заданного LED,
port_or()
– включение
заданного LED.
Хоть использование goto и
не рекомендуется в программировании, но условным
оператором и метками по условиям был реализован доступ к заданной
операции
максимум за 5 операторов условия. Также процедуры сократили занимаемое
место в
памяти что, естественно, является лишь плюсом. |
|
После
«непродолжительных» мук над прошивкой был создан
окончательный вариант, который доступен для просмотра здесь с
необходимыми с
моей точки зрения комментариями. Полученный вариант сувенира был
подарен.
Взамен автор увидел круглые глаза счастья что и планировалось увидеть
т. к.
именно для благополучия и счастья родных большинство вещей и делается в
Мире. О
«таинственной коробочке» мне остались лишь фото(рисунок 3)
и видео (не представляется
возможным быть обнародованным). |
|
Рисунок 3 – Фото конечного результата |
|
Напоследок
хочу отметить: все, что не делается
человеком (а особенно собственноручно) должно быть сделано с
максимальной
самоотдачей, нужно вложить частичку своей души, чтобы
«оживить» проделанную
работу. Иначе она потеряется среди множества в Мире. |
|
«Внешность
вещей меняется согласно настроениям, и поэтому мы видим волшебство и
красоту в
них, тогда как волшебство и красота — в действительности в нас
самих.»
(с)
Джебран
Халиль Джебран.
|
|
Любите,
будьте любимы и почаще делайте приятное своим
близким :-) |
|
Список
использованной литературы.
1. Пояснение основ ШИМ для AVR
2. Datasheet
ATmega8
3. Программный
ШИМ
|
|