Управление светодиодом на мк attiny13

Переходим от Arduino к программированию ATtiny13 на C

Программирование даёт не только огромный простор для фантазии и возможностей, но, как и любой , одновременно навязывает свой стиль и ограничивает возможности.

Поэтому, если чувствуется, что Arduino становится тесноват — можно не только перейти на 32-битные контроллеры (например, STM32), но и попробовать более низкоуровневое программирование контроллеров.

Уходя ближе «к железу» — программировать придётся на более близком к железу уровне — и если это не ассемблер, то уж язык программирования Си — точно.

Пример подобного программирования уже приводился в статье .

У такого стандартного программирования микроконтроллеров есть существенное преимущество перед использованием Arduino-вских скетчей. Однако, за низкоуровневый полный контроль и возможность использовать все ресурсы микроконтроллера, приходится расплачиваться долгим и внимательным изучением документации (datasheet-а) на микроконтроллер. Т.е.

, если у вас ещё не было опыта работы с конкретным микроконтроллером — то вместо быстренького набрасывания скетча для решения своей задачи — вам придётся потратить дополнительное время на изучение мат. части.

Разумеется, не всегда это может быть оправдано и если задачу нужно и можно быстро решить при помощи Arduino — то почему бы и нет? Однако, если решение задачи на Arduino невозможно, то придётся потратить время на получение ценных опыта и знаний, которые помогут открыть все возможности, которые под силу микроконтроллеру.

Для примера, возьмём меленький, простой и дешёвый контроллер ATtiny13.

8-битный AVR микроконтроллер с 1 КБ программируемой Flash памяти — RISC архитектура — 120 команд, (большинство выполняется за один такт) — 32 8-битных регистра общего применения — 1 КБ программируемой Flash памяти программы — 64 байта EEPROM памяти данных, (до 100 000 циклов записи/стирания) — 64 байта SRAM памяти (статическое ОЗУ) — Один 8-разрядный таймер/счётчик с отдельным предделителем и два ШИМ канала — 4-канальный 10-битный АЦП со встроенным ИОН — Программируемый сторожевой таймер (watchdog) со встроенным генератором — Встроенный аналоговый компаратор — Внутрисистемное программирование через SPI порт — Внешние и внутренние источники прерывания Корпусное исполнение: — 8-выводные PDIP и SOIC корпуса: 6 программируемых линий ввода-вывода Диапазон напряжения питания, частота: 1.8 – 5.5В (для ATtiny13V) — до 10МГц 2.7 – 5.5В (для ATtiny13) — до 20МГц

Выводы микроконтроллера ATtiny13:

Как видим, микросхема микроконтроллера — маленькая — всего 8 ножек. Чтобы заставить её работать — нужно просто воткнуть её в макетную плату, подтянуть RESET (первый пин — на схеме обозначается — PB5) к шине питания через 10-килоомный резистор и подать питание — например, 5V снятые с пинов питания контроллера Arduino / CraftDuino.
В статье , уже подробно расписано как нужно подключить микроконтроллер ATtiny13 к контроллеру Arduino или CraftDuino, чтобы его можно было программировать через выводы микросхемы FT232RL используя режим bit-bang (режим управления отдельными выводам микросхемы). Поэтому сразу переходим к софтовой части. Раз решили программировать «по-взрослому», то и среда разработки нужна «взрослая».

Идём на сайт -a, и скачиваем свежую версию .

Atmel Studio — (наследница AVR Studio) — это бесплатная среда разработки для микроконтроллеров Atmel.

Сама IDE должна быть знакома, т.к. используется оболочка от Microsoft Visual Studio, однако следует обратить внимание, что в качестве компилятора используется GCC. После установки, на рабочем столе появится ярлык с симпатичной красной божьей коровкой. Запускаем IDE и привычным образом, быстренько создаём проект.

File -> New -> Project…

Выбираем С/С++ и GCC C Executable Project, пишем имя проекта, например, blink 🙂

Затем, среда предложит выбрать тип используемого микроконтроллера — выбираем ATtiny13.

Всё — шаблонный файл уже создан и можно начинать программировать:

Предлагаемый шаблон программы — напоминает что-то :

#include int main(void) { while(1) { //TODO:: Please write your application code } }
Описание работы портов микроконтроллера и используемых для насткройки и работы регистров, очень подробно приводится в документации на микроконтроллер — . Как увидим далее, конфигурирование и работа с портами сводится к установке соответствующих битов в нужных регистрах микроконтроллера. Если вы уже имели дело с установкой/проверкой/очисткой битов (работа с битовыми масками), то вам будет проще разобраться в происходящем. Но, на всякий случай, напомню: чтобы установить бит N — нужно выполнить побитовое ИЛИ с числом, где этот бит установлен (чтобы получить такое число — мы побитово сдвигаем влево единицу на заданное число позиций). Соответственно, чтобы сбросить бит N — нужно выполнить побитовое И с числом в котором установлены все биты кроме заданного (чтобы получить такое «интвертированное число» — мы сначала получаем число в котором бит установлен, а потом применяем к нему операцию побитового НЕ). value |= 1

Источник: http://robocraft.ru/blog/arduino/3423.html

Подключение семи RGB светодиодов к микроконтроллеру ATtiny13

Источник: http://radio-bes.do.am/publ/prekty_rgb_led_na_mk/podkljuchenie_semi_rgb_svetodiodov_k_mikrokontrolleru_attiny13/6-1-0-133

Лампа настроения с сенсорным управлением на Attiny13

Дата публикации: 02 февраля 2016.

Рейтинг:  5 / 5

Теперь немного подробнее о режимах. В первом режиме цвета решил менять по цветовому кругу, не стал выдумывать различные случайные генерации, да и размахнуться с этим было некуда в пределах ATtiny13. В принципе, таким образом я обхожу все оттенки цветов по окружности вокруг цветового круга. Любая другая точка, выбранная внутри круга даст нам один из наших оттенков, но с другой яркостью.

Долго эксперементировал с тем, как визуализировать настройку выбора скорости всякими помигиваниями. В итоге остановился на выборе скорости по цветам радуги + розовый цвет. Красный — самая быстрая скорость. Розовый — самая медленная. Настройка яркости осуществляется визуально одним цветом.

Через 30 секунд после того, как мы последний раз переключали режим, происходит следующее. Если мы находимся в одном из основных режимов, то настройки сохраняются. Если мы находимся в одном из настроечных режимов, то лампа возвращается к сохраненным настройкам. При следующем включении лампа возвращается к сохраненным настройкам.

Кому-то будет проще и быстрее посмотреть функционал на видео. Извиняйте за качество, крутыми гаджетами для съемки не обладаю. Цветопередача ужасная. К тому же, на видео настройка яркости видна плохо, т.к. камера постоянно подстраивалась под каждый уровень яркости.

Материалы

В качестве блока питания можно взять зарядник от телефона на подходящий ток. У меня уже очень давно были закуплены блоки питания и плафоны по 2 штуки. Плафон взял от светильника grono из магазина “Икея”. Еще вот похожие по размерам, но круглые — кварне.

Источником света в лампе является один или несколько RGB-светодиодов. Я взял один 3 Ваттный RGB-светодиод, который в номинале держит по 300 мА на каждый канал. Запитал его в щадящем режиме где-то по 200 мА на канал.

Долго думал, как же мне разместить блок питания прямо в плафон. Переживал, что он будет давать наводки на сенсор, все таки блок питания импульсный. Т.к. у меня тут завались гетинакса, то сделал металлизированную коробочку, поместил туда блок питания.

Схема, реализация

Схема получилась очень простой.

Для управления мощным светодиодом я взял полевики с дохлой материнской платы. И развел макет платы под них, изготовил пару плат.

Собрал все воедино, бросил коробочку на дно плафона. В качестве сенсора сделал кусок лакированной проволоки 0.3 мм, которую пустил по верхнему контуру плафона. Светодиод посадил временно только на термопасту, а проволоку на скотч.

Трудности отладки

Я уже писал как при разработке лампы я использовал бинарную модуляцию (БМ) и работал с сенсором. Так вот, сенсор требовал доработки, потому как он временами срабатывал сам собой.

Я выполнил советы Mail1977, за что его благодарю. Однако, это полностью не решило проблему. Дело оказалось в форме сенсора, в роли которого у нас выступает длинная проволока.

Я думаю, она вела себя как антенна и ловила всякую ерунду.

Тогда мне в голову пришла идея: заэкранировать наш сенсор, чтобы он не ловил помехи. И я сделал не одну проволоку, а витую пару. Второй конец которой подключил к земле нашей схемы управления светодиодом. (Здесь у меня вопрос, есть ли смысл посадить на эту землю и корпус блока питания?) И всё, помехи ушли!

Но это еще не все. Первая моя стабильная версия лампы была реализована с помощью БМ (исходник этой реализации я тоже вложу в архив).

Однако, помаргивания при плавном изменении цветов RGB-светодиода, все же, были видны, даже на частоте БМ 586 Гц. Особенно на маленьких яркостях. Частоту повышать уже больше не стал.

Переделал на программный ШИМ с частотой около 100 Гц. На глаз теперь все происходит плавно!

Перспектива

Когда это все собрал и отладил, то был доволен. Но есть еще задумка. Как-то громоздко все это выглядит.

Подумал, что было бы интересно собрать аналог такой лампы в виде небольшого ночничка, который можно было бы питать от любого разъема USB, ведь у каждого есть зарядник для телефона.

Развел кругленькую плату (часть ее видно справа на фото готовых плат выше) для 9-ти RGB-светодиодов 5050 и разъема microUSB. Может быть в будущем соберу.

Исходник для прошивки написан на C в CodeBlocks под компилятор GCC AVR.

Желаю каждый проект довести до победного конца!

Источник: https://radioparty.ru/device/avr/618-touch-mood-lamp-attiny13

Персональный сайт – Управление RGB светодиодом на ATtiny13

Светодиод очень чуствителен к протекающему через него току. Так, если лампочку можно просто повесить на клемы батарейки, то светодиод от такого к себе отношения сначала помигает, а потом сдохнет, источая дикую вонь.

Поэтому, у каждого светодиода, помимо падения напряжения, указывается его максимально-допустимый рабочий и пиковый токи. Так, для мелких светодиодов, токи как правило равны 10 – 20 миллиампер, а падения напряжений для красных равно 2.

5 вольта, а для синих, зелёных и желтых около 4х вольт.

Для подключения одиночного светодиода к батарейке или иному источнику тока, используют гасящие резисторы или драйверы светодиодов. Драйвер светодиодов заслуживает отдельного обсуждения, а гасящий резистор опишу прямо здесь – в схеме далее будет таких аж 3 штуки)

Итак, для подключения светодиода с падением напряжения 3 вольта и током 20 миллиампер к источнику питания, скажем 5 вольт, последовательно в цепь необходимо воткнуть резистор. Расчет резистора в этом случае следующий:

R = (Uпит – Uпад) / Iдиода, что для нашего светодиода составит

R = (5 – 3)/0.020 = 100Ом.

При этом необходимо учитывать, что лишние 2 вольта осядут на резисторе в виде тепла. Для мелких светодиодов это может быть не принципиально, но для светодиодов с потреблением порядка 100 – 700мА это уже серьёзно. Для расчета выделяемой резистором в воздух мощности(в виде тепла) существует формула:

P = I*U

т.е. мощность равна силе тока в цепи * напряжение падения, что в нашем случае составит 0.02 * 2 = 0.04 ватта. Ну тут любая SMD-шка справится)

Вторая формула мощности, которую можно вывести через закон Ома –

U = I*R  -> P = I*(I*R)

P = I*I*R

Мощность равна сила тока в квадрате, умноженная на сопротивление. Т.е. для нашего случая 0.02А*0.02А*100Ом = 0.04 ватта.

В случае, когда нам необходимо последовательно запитать несколько светодиодов в цепи – например, 2 светодиода с падением 2.4 вольта от 5 вольт, диоды подключают последовательно, а гасящий резистор в этом случае должен погасить только (5В-2*2.4В) = 0.2 вольта, соответственно он будет равен 0.2/0.020 = 10Ом. Мощность его при этом составит 10*0.02*0.02 = 0.004 ватта.

Другое дело, когда в бой идут светодиоды повышеной яркости, с большим потребляемым током – например, рассматриваемый далее RGB светодиод позволяет мучать себя током в 350мА, т.е. 0.35А. Для его красной составляющей с падением напряжения 2.6 вольта резистор будет уже солидным – (5 – 2.6)/0.35 = 6.85Ом.

Но омы тут не главное – мощность, рассеиваемая данным резистором P = 0.35*0.35*6.85 = 0.839, что почти ватт. Резистор при этом будет греться как утюг (у меня термопара показывала 79 – 80 градусов), поэтому в моей схеме ниже я применяю двухватные резисторы.

И всё бы ничего, но расстояние между выводами такого резистора почти 20 миллиметров, и сам он размером в две микросхемы ATTiny13 в дипе)))

Ниже показан резистор на радиаторе и матовый стакан для зубных щеток, который будет использоваться в качестве плафона)

Шим – широтно-импульсная модуляция. Описание ШИМа даже википедия рекомендует почитать у DI HALTa, на easyelectronics.ru, поэтому много распинаться по теории не буду, а на практике покажу, как это сделано у меня на ассемблере.

Суть шима – подавать на управляемое устройство не сплошной сигнал, а кучу прерывистых. При этом устройство, питаемое от ШИМанутых импульсов, будет получать не полное питание, а лишь его часть(в случае, если в ШИМ есть скважины, т.е. отсутствие сигнала).

Для светодиода ШИМ является очень удобным способом управления его яркостью. Так, если для управления яркостью лампочки можно увеличивать или уменьшать напряжение в достаточно большом диапазоне, то для светодиода яркость регулируется его постоянным включением/выключением.

Например, при включении/выключении светодиода много раз в секунду, он будет гореть в половину своей яркости. Следует также учесть, что длительность сигнала/длительность отсутствия сигнала, не являются постоянными величинами – например мы можем 2мс держать светодиод включенным, 1 мс – выключенным.

В таком случае яркость его составит 2 / (2 + 1) от максимальной.

В идеале в ШИМ – схему необходимо встроить интегрирующую цепочку, чтобы скважины и импульсы приобрели вид кривой, а не пиков и провалов; но для данной схемы это не обязательно)

Фактически, у данного микроконтроллера есть две ноги, которые умеют генерировать аппаратный ШИМ, используя встроенные средства(таймеры). Но для RGB светодиода требуются три ноги, поэтому генератор я решил собрать самостоятельно.

Три ноги микросхемы объявлены как выходы; на них будет генерироваться сигнал.

Три переменных – brightR, brightG, brightB отвечают за яркость своего канала, R G и B соответственно. Их значение определяет, сколько тиков счетчика светодиод будет включен, а сколько – выключен.

/***********************************************************/
/*           Таймер. По таймеру лишь формируется ШИМ сигнал для RGB канала            */
/***********************************************************/
event_timer:   

    /*ШИМ для каждого канала в соответсвии с регистрами яркости*/

    push    tmp1    in        tmp1,    SREG    push    tmp1    push    tmp2    in        tmp1,    PORTB       

    ori        tmp1,    0b00011100            ;Выставляем биты вывода

    /*Проверяем, попадает-ли текущее значение счетчика в интервал 0..Яркость канала

    Если нет – выключаем порт*/    mov        tmp2,    current_pwm_value    cp        brightR,    tmp2    brpl    ev_t_skip_red    andi    tmp1,    0b11111011

ev_t_skip_red:

    cp        brightG,    tmp2    brpl    ev_t_skip_green    andi    tmp1,    0b11110111

ev_t_skip_green:

    cp        brightB,    tmp2    brpl    ev_t_skip_blue    andi    tmp1,    0b11101111

ev_t_skip_blue:

    /*Генерируем сигнал*/

    out        PORTB,    tmp1

    /*Увеличиваем счетчик pwm*/

    inc        tmp2    cpi        tmp2, c_max_gradations + 1    brne    ev_t_exit    clr        tmp2

ev_t_exit:

    mov        current_pwm_value, tmp2    pop        tmp2    pop        tmp1    out        SREG,    tmp1    pop        tmp1

    reti

Поясню ещё раз некоторые моменты алгоритма:

По переполнению таймера на единичку увеличивается счетчик current_pwm_value

  • Сравниваем яркость красного канала brightR с текущим значением счетчика current_pwm_value
  • Если счетчик больше яркости красного – гасим красный диод
  • Если счетчик меньше либо равен яркости красного – включаем красный диод

Для зеленого и синего канала повторяем соответствующую процедуру.

Счетчик current_pwm_value принимает значения от 0 до c_max_gradations; У меня в проекте c_max_gradations = 128, чего вполне достаточно для плавного изменения цветов. Максимальное значение данной константы – 254. Соответственно, яркости каналов также должны лежать в пределах от 0 до c_max_gradations.

Модуль индикации и управления – собственно светодиод с обвесом в виде транзисторов и резисторов, а модуль управления – кнопка и резистор для переключения программы))

Резисторы светодиода взяты на 2 Вт, чтоб грелись поменьше. Как вариант – можно набрать параллельно или последовательно, но и двухватники стоят вполне вменяемо – особенно, на фоне RGB диода с радиатором)

При сборке главное не перепутать резистор красного светодиода с резисторами остальных, иначе ток через красный светодиод сильно превысит норму и диодик сдохнет)

Транзисторы bc817-40 и резисторы R1 – R3(3кОм) взяты в корпусах для поверхностного монтажа, чтобы не занимали лишнего места. Большие резисторы и микросхема в дип-корпусе распологаются на стороне компонентов.

Потребление схемы достаточно большое, поэтому блок питания тоже нужно брать соответствующий – на пару ампер.

Ниже показана готовая плата устройства, с запаянными деталями.

Размер платы выбран таким, чтобы полностью прятаться под радиатором светодиода.

Печатная плата: Upravlenie_svetodiodom.lay

Проект для AVR Studio: TinyLed3.zip

Лампа стоит на столе и светится в ожидании корпуса:)

Внутри крепление выглядит следующим образом:

Источник: http://yacooler.narod.ru/index/0-8

Светодиодная сосулька на микроконтроллере: ATtiny13 и 20 светодиодов

  • Теоретическое отступление.

Эту часть можно вполне безопасно пропускать, она предназначена  исключительно для любопытствующих умов. Если Вам интересно, что же позволило подключить 20 светодиодов всего к пяти выводам контроллера, то эта часть для вас. Если же целью является просто повторение конструкции, можно смело переходить ко второй части.

Вывод микроконтроллера может находится в трех состояниях: вход, выход с лог. 0 и выход с лог. 1. Вот как раз режим входа без подтяжки (высокоимпедансное состояние) и позволяет подключить к каждой паре выводов по два встречно-параллельно включенных светодиода.

Фактически, вывод переведенный в Z-состояние ведет себя как не подключенный к схеме, и никакого влияния на нее не оказывает. Такое подключение получило название «Чарлиплексинг», по имени ее создателя  Чарли Аллена. Впрочем, этим методом пользовались и ранее.

На упрощенной схеме показана суть работы:

Рис. 1 Чарлиплексинг

При таком подключении возможное количество светодиодов рассчитывается по простой формуле: K = N * (N-1), где N — количество выводов.

С теорией разобрались, самое время применить эти знания на практике. У контроллера ATtiny13 восемь выводов. Из них два — питание, и еще один — RESET. Значит, под нашу затею остается 5 выводов. Считаем количество подключаемых светодиодов по уже известной формуле:

Мы можем подключить 20 светодиодов, что довольно неплохо, но хотелось бы еще использовать кнопку для переключения эффектов. Но если мы выделим отдельный пин для кнопки, то количество светодиодов сразу сократится до 12 (4 * (4-1)), что слишком расточительно. Потому немного схитрим, и подключим кнопку к выводу RESET.

Да, вывод RESET можно сделать обычным пином порта, но тогда микроконтроллер станет недоступен для последовательного ISP программирования, что очень неудобно, параллельный программатор есть далеко не у всех.

Да и ситуация когда микросхема выпаивается из платы каждый раз когда нужно ее прошить а потом запаивается для проверки обратно, довольно нелепа. Потому кнопку мы подключим, но RESET отключать не будем.

Но тогда ведь МК просто будет перезагружаться при каждом нажатии кнопки? Разумеется, но при этом еще и будут переключаться программы. Как? Об этом чуть ниже.

А пока рисуем схему:

Рис. 2 Схема.

Схема проста до безобразия, между каждой парой выводов подключены встречно-параллельно светодиоды. Например, для того чтобы зажечь светодиод HL14 необходимо сконфигурировать выводы PB1 и PB0 как выходы (а все остальные как входы) и подать на вывод PB1 лог. 1 а на вывод PB0 лог. 0.

Данный проект – своего рода игровое приложение “электронная кость” на RGB светодиодах, особенностью которого является демонстрация технологии и метода подключения семи RGB светодиодов к микроконтроллеру Attiny13V компании Atmel, у которого всего может быть доступно до 6 линий ввода/вывода. Подключение и управление семью трехцветными светодиодами стало возможным благодаря использованию технологии мультиплексирования «методом Чарли».

При этой технике управления светодиодами используются все три состояния цифровых линий ввода/вывода микроконтроллера: 0, 1, Z (состояние с высоким импедансом), и управление осуществляется лишь одним светодиодом в каждый момент времени. Поэтому, при таком методе мультиплесирования, должна быть правильно подобрана частота обновления при управлении несколькими светодиодами.

Принципиальная схема устройства

Кликните для увеличения
 

В состав устройства входит микроконтроллер ATtiny13, 7 RGB светодиодов, несколько резисторов, миниатюрный переключатель.

Каждый RGB светодиод – это три светодиода в одном корпусе, в итоге мы получаем, что к микроконтроллеру подключен 21 светодиод. Для управления светодиодами используется четыре линии ввода/вывода микроконтроллера. Однако по теории, имея 4 свободных вывода микроконтроллера мы можем управлять 12 светодиодами {N×(N-1)}.

Фактически, для игрового приложения «электронная кость», решение такое, что все RGB светодиоды могут быть разделены на четыре группы. Три группы имеют по два RGB светодиода и одна группа имеет один RGB светодиод.

Светодиоды в каждой группе могут быть включены и выключены одновременно и подключаются к одним и тем же линиям ввода/вывода микроконтроллера. Другими словами, светодиоды в каждой группе рассматриваются как один светодиод.

В итоге, при таком методе, мы получаем 4 RGB светодиода, управление которыми и осуществляется программно микроконтроллером, при этом соблюдаются условия «метода Чарли» ( четыре RGB светодиода = 4 × 3 = 12).

Вывод микроконтроллера PB0 используется для подключения кнопки, при нажатии на которую генерируется случайное число от 1 до 6, а при отпускании генерируется случайный цвет (всего 6 цветов).

Вывод микроконтроллера PB5 настроен для использования в качестве вывода “Reset”, что необходимо учесть при программировании микроконтроллера.

Работа устройства

 Файлы:

Исходный файл проекта, make-файл, шестнадцатиричный код для загрузки в память программ (Flash ROM) микроконтроллера – скачать

Источник: http://www.rlocman.ru/shem/schematics.html?di=67219

//**********************[ПОДКЛЮЧАЕМЫЕ ФАЙЛЫ]*************************************#include // работа с AVR#include // работа с FLASH памятью//*************************[ОПРЕДЕЛЕНИЯ]*****************************************#define DDR_LED  DDRB // порт светодиодов//********************[ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ]************************************const uint8_t ddr_config[] PROGMEM = // конфигурация выходов для каждой пары светодиодов (10)((1

Источник: http://enabledevice.ru/gotovye-ustrojstva/svetodiodnaya-sosulka-na-mikrokontrollere/

Управление RGB светодиодом с помощью аппаратной ШИМ ATmega8

Как известно, RGB светодиод представляет собой три излучающих кристалла, красного, зеленого и синего цвета, на одной подложке.

Смешивая эти три цвета в разных пропорциях, можно получить всю цветовую гамму, воспринимаемую людским глазом. Для управления цветом потребуется включать кристаллы с разной яркостью, то есть управлять током через диод.

Проще всего, это сделать с помощью микроконтроллера, а точнее его аппаратной ШИМ, которой нам потребуется 3 канала.

Микроконтроллер ATmega8 как раз имеет требуемых 3 аппаратных ШИМ канала, так что будем проводить эксперименты с его участием. В качестве подопытного будем использовать RGB светодиод Сree MC-E.

У этого светодиода 4 кристалла: красного, зеленого, синего и как бонус, белого цвета. Белый кристалл задействовать не будем.

Схема включения ничем принципиальным не отличается от той, которую использовали при опытах с аппаратной ШИМ:

Транзисторы Q1-Q3 – ZXTN19020, резисторы R4,R5,R7 – 10 ом (я не проводил балансировку цветов, так как для этого нужен спектрограф, которого у меня нет, все ограничивающие резисторы поставил одного номинала). Резисторы R3,R6,R8 по 1 килоому.

Все остальное – обвес микроконтроллера, с которым должно быть все понятно. X1 – кварцевый резонатор на 4Мгц, конденсаторы С1,С2 – по 18-20 пФ. R1,C7 соответственно по 10 килоом и 0,1 мкФ.

D1– светодиод, показывает, что на схему подается питание, R2 – ограничивающий резистор на 200 ом.

Конденсаторы
C3 – 100мкФ, С5 – 50мкф, С4,С6 – блокировочные, по 0,1мкФ. L7805 – стабилизатор напряжения 5В, подойдет любой аналог: LM7805, КРЕН5А.

D2-D3-D4 – наш RGB светодиод, соответственно синий, зеленый и красный его кристаллы. Гореть одним цветом нашему светодиоду будет скучно. Эффектней будет плавное переливание цветов.

Например, красный цвет постепенно переходит в зеленый, зеленый в синий, а синий в красный, и так по кругу в вечном цикле. Для этого напишем программу:

  1. #include //Стандартная библиотека ввода/вывода

  2. #define R_channel OCR1AL //Определяем канал OCR1AL для Красного цвета

  3. #define G_channel OCR1BL //Определяем канал OCR1BL для Зеленого цвета

  4. #define B_channel OCR2 //Определяем канал OCR2 для Синего цвета

  5. #define RGB_pause 2000 //Пауза для задержки

  6. //Программа формирования задержки

  7. void pause (unsigned int a)

  8. {

  9. unsigned int i; //Переменная для задержки

  10. for (i=a;i>0;i–); //Цикл формирования задержки

  11. }

  12. //Программа инициализации ШИМ

  13. void init_pwm (void)

  14. {

  15. //Инициализация порта

  16. DDRB=0x0e; //OC1A,OC1B,OC2 – выхода

  17. TCCR1A=(1

Источник: https://avrlab.com/node/93

Сервотестер на ATtiny13 AVR

Источник: http://rc-aviation.ru/obzorm/698-samodelnaya-elektronika/888–attiny13-avr

RGB ЛАМПА НА МИКРОКОНТРОЛЛЕРЕ

Источник: http://elwo.ru/publ/svetodiody/rgb_lampa_na_mikrokontrollere/5-1-0-751

Сердце на ATtiny13

Около трёх месяцев назад я начал увлекаться радиоэлектроникой и затянуло меня в изучение микроконтроллеров.

Давалось мне это достаточно тяжело, граблей было найдено немало (до этого ни программированием не занимался, ни в радиоэлектронике ничего не соображал, разве что паяльник в руках умел держать). Когда всё начало немного получаться, встал вопрос о сборке своего первого устройства на микроконтроллере.

Было принято решение порадовать свою девушку и собрать светодиодное сердце (в интернете есть вариации на эту тему, которые меня к этому и побудили). И вот, спустя четыре версии, устройство готово.

Итак, начну с описания аппаратной составляющей устройства. Принципиальная схема устройства предельно проста и выглядит следующим образом:

При подаче питания с разъема USB, микроконтроллер запускается и начинает выполнять записанную в память программу алгоритма световых эффектов, зажигая и выключая светодиоды в определенной последовательности. 

На плате размером 60х50мм размещено десять красных 3528 светодиодов, соединенных попарно. Сердцем сердца (вот такой каламбур получился) выступает микроконтроллер ATtiny13. Так же на плате присутствует разъем USB от старой флешки, от которого устройство питается и четыре SMD 1206 перемычки. Для управления светодиодами используются пять выводов микроконтроллера.

Вывод Reset подтянут к питанию через 10 КОм резистор. Конденсаторы C1 и C2- стандартная обвязка по питанию микроконтроллера. В качестве корпуса выступает полиморфный пластик (пластик имеющий температуру плавления 60- 65 градусов по Цельсию) или shapelock.

Разогрел в горячей воде и вылепил форму, по мере остывания подогревал феном и продолжал формовать до получения нужного результата.

Извиняюсь за качество фото, фотографировал на телефон.

Программная составляющая устройства. Программа писалась в среде CVAVR. Управление свечением осуществляется пятиканальным программным ШИМ-ом.

В программе реализовано четыре разных эффекта свечения и один эффект на плавный розжиг светодиодов при включении (выполняется один раз, при подаче питания на устройство, остальные эффекты сменяют друг друга по кругу). Программа предельно проста и легко можно написать новые эффекты или переделать старые, исходник прилагается.

Для изменения яркости (светит без пластика довольно ярко и бьет по глазам) нужно лишь изменить значение переменной bri. На плате в спринте отмечены пары светодиодов буквами, соответствующими переменным, которые отвечают за их яркость.

В битах конфигурации МК убран лишь предделитель тактовой частоты на 8, всё остальное по умолчанию. BODLEVEL=11, SPIEN=0, CKSEL=10, SUT=10.

Обновление от 15.09.2013:

Добавлены конденсаторы по питанию, для сглаживания пульсаций и подавления ВЧ составляющей. Подтянул RESET к плюсу питания через резистор 10 кОм.
Для людей, считающих, что светодиоды подключены неверно:
Питание МК от USB: 5V.

По даташиту высокий уровень Attiny13 при питании 5V равен 4,2 V.
По даташиту падение напряжения на светодиоде при номинальном токе 20мА 1,7- 2,4V. В данном случае на один светодиод приходится 2,1 V.

Попробуйте убедить меня в необходимости токоограничивающих резисторов и я их добавлю.

ОбозначениеТипНоминалКоличествоПримечаниеIC1HL1-HL10C1С2R1

Создаем сервотестер на микроконтроллере  ATtiny13 – (далее МК).

Для этого нам понадобится:

1. Микроконтроллер ATtiny13

2. Программатор SPI (например такой или такой )

3. Пластинка текстолитовая для печатных плат и хлорное железо для ее травления.

4. Штырьковые разьемчики (2х-1шт, 3х-2шт, 5х-1шт).

5. Электрокомпоненты:      – 2 светодиода

– 2 резистора 200Ом

– 1 резистор 10КОм

– 1 конденсатор керамический 0,1mF

– 1 диод 1N4007 (нужен для защиты от переплюсовки)

– 1 кнопка

6. Паяльник 30W (если мощней можно перегреть МК при пайке)

Вступление:

У ATtiny13 есть порт B и 6 выводов (фактически 5 т.к. последний вывод повешен на лапку RESET и если мы его используем – то больше не сможем программировать МК).

Вспомним теорию – МК ATtiny13 имеет на борту один 8битный таймер (это 2 в степени 8 равно 256), то-есть он умеет считать от нуля до 256.

И есть возможность на его основе хардварно генерировать две ШИМ (Широко Импульсная Модуляция) на ножках PB0 и PB1 – то-есть частотный сигнал которым мы и будем управлять нашими сервомашинками.

  Осталось три свободных вывода, их и используем для кнопки и двух светодиодов.

Теперь про сервомашинки.

Сервомашинки управляются частотным сигналом. Стандартые параметры для машинок 900мкс-крайнее левое положение, 1500 (бывает 1520)мкс – среднее положение, 2100мкс – крайнее правое. Наша задача и сгенерировать этот сигнал с необходимой нам частотой.

Изготовление платы:

Плата делается по технологии “ЛУТ” – Лазерно-Утюжная-Технология 🙂 Опишу вкратце (в сети информации предостаточно). Берем фотобумагу для струйных принтеров и печатаем на лазерном принтере  разведенную схему.

На текстолитовую пластинку с медным слоем кладем наш отпечаток и раскаленным утюгом держим 1 минуту. Даем остыть и под кран – смываем бумагу. Тонер очень крепко прилипает к меди. Затем жесткой стирательной резинкой удаляем остатки бумаги и пленки.

Кладем в раствор воды и хлорного железа – через минут 40 все что без тонера вытравливается. Моем под краном. Растворителем смываем тонер. Все.

Еще можно на меди просто лаковым фломастером дорожки нарисовать и в раствор. А можно и вообще без платы на рассыпухе сделать – только некрасиво получится.

Ну и сверлим дырочки (я сверлю для контактов 0,9мм для компонентов 0,7мм)

Принципиальная схема:

Пояснения к схеме:

Диод D1 нужен для защиты от переплюсовки (можно и не ставить).

Резисторы R2 и R3 нужны для светодиодов (ну а как иначе, можно ставить до 5КОм просто тускней гореть будут).

Резистор R1 и конденсатор C1 нужны для защиты сброса МК  (можно тоже не ставить, но так надежней)

Кнопка в разомкнутом состоянии – 1, в замкнутом – 0.

Плата с расположением элементов:

Теперь о коде:

Код написан на СИ WINAVR. Написан максимально просто с подробными комментариями.

Алгоритм такой:

Вначале нам нужно настроить в микроконтроллере ШИМ (смотрим комментарии в коде делитель на 256).

Что-бы повернуть серву например в среднее положение (1500мкс=1,5мс) нам нужно в регистр OCR0A записать 6.54. А что же это за число? Вспомним теорию мы используем частоту 50Гц – это 50 колебаний в секунду. Значит одно колебание будет длинной 1000/50=20мс.

  Для нашей шим мы используем системный делитель частоты процессора. Хорошо подошел делитель 256. Итак 9600000Hz/256=37500Hz это частота на которой будет работать наш ШИМ, то-есть 37500 колебаний в секунду.

Соответственно длинна одного колебания(импульса) будет 1000/37500=0,02667мс, что равняется 26,67мкс. Но мы помним что у нас таймер считает до 256. Нужно 256 отнять 26,67=229,33мкс Это и есть длинна одного имульса.

Теперь нам просто нужно узнать сколько этих импульсов нам нужно подать чтобы повернуть серву на 1500мкс.  Делим 1500 на 229,33 и получаем 6,54 – это число и записываем в OCR0A=6.54;

Теперь что-бы повернуть серву на угол в диаппазоне 900-2100мкс нужно это число поделить на 229,33 и записать в OCR0A или OCR0В.

Скачать:

Прошивка:

Прошить МК можно например программой . ВНИМАНИЕ! В микроконтроллере есть служебные регистры – называются фьюзы. Если их неправильно выставить можно запортить МК. Что-бы этого избежать при первом запуске программы сразу выберите в меню “Read Fuse” и считайте из МК его фьюзы и запомните в программе (она сама предложит).

Код программы на СИ:

/************************************************ Сервотестер на ATtiny13 – с завода на 9,6 MHz Два ШИМ на 8-битном таймере Два светодиода Нажатие кнопки *************************************************/ #define F_CPU 9600000UL // Частота МК 9,6 MHz нужно для библиотеки задержек #include // Библиотека ввода-вывода “io.h” #include // Библиотека задержек “delay.h” int knopka; //переменная для управления кнопкой int regim = 2; //переменная для смены режимов //функция включения светодиода №1 void LED1_On (void) { PORTB |= _BV(PB3); // установить “1” на линии PB3 порта B (включаем светодиод №1) } //функция выключения светодиода №1 void LED1_Off (void) { PORTB &= ~_BV(PB3); // установить “0” на линии PB3 порта B (выключаем светодиод №1) } //функция включения светодиода №2 void LED2_On (void) { PORTB |= _BV(PB4); // установить “1” на линии PB4 порта B (включаем светодиод №2) } //функция выключения светодиода №2 void LED2_Off (void) { PORTB &= ~_BV(PB4); // установить “0” на линии PB4 порта B (выключаем светодиод №2) } int main(void) // начало основой программы { //Настраиваем ШИМ на микроконтроллере. Страницы 69-73 в даташите на ATtiny13 //COM0A1-Fast PWM Mode – Сброс ОС0А в момент совпадения, установка ОС0А при достижении счетчиком значения ТОР //COM0B1-Fast PWM Mode – Сброс ОС0B в момент совпадения, установка ОС0B при достижении счетчиком значения ТОР //WGM01 – Включаем Fast PWM Mode 3 //WGM00 – Включаем Fast PWM Mode 3 //CS02 – Устанавливаем делитель 256 TCCR0A|=(1

   Светильник является полным аналогом лампы настроения, от известных фирм. Питание лампы осуществляется от импульсного источника питания работающего на ключе TNY245, на основе AC-DC преобразователя. Драйвер 3-х ватного светодиода RGB собран на микроконтроллере Attiny13, он имеет 3 режима работы и автоматический режим.

Плавное изменение цвета основано на способности микроконтроллера генерировать ШИМ сигнал разной ширины, тем самым с помощью трех основных цветов можно воспроизводить миллионы цветовых комбинаций.

А последние, перед выключением, настройки, сохраняются в энергонезависимой памяти EEPROM и поэтому после включения вы будете видеть тот режим, который был последним при предыдущем включении.

Схема RGB лампы на микроконтроллере Attiny13

   Режимы работы лампы:

  1. плавное изменение цвета RGB
  2. постоянный цвет при остановленном режиме
  3. белый цвет при максимальной мощности

   Так как нет кнопки переключения режимов, чтобы его изменить, нужно произвести кратковременное  выключение устройства и режим смениться.

   Программа написана в компиляторе Bascom, файл прошивки и EEPROM, исходники и макеты печатных плат в формате Eagle.

   Fuse-биты: частота внутреннего генератора 4,8 МГц, делитель на 8 отключен, startup time 64 мс, brown-out detector 1,8 В.

   Схема контроля за питанием состоит и диода 1N4148 и резистора на 1 килоом. Резистор позволяет быстро обнаружить превышение мощности. И когда она обнаруживается, программа ждёт 1 секунду, после этого следует проверка, если всё правильно, то изменяется режим и происходит его сохранение в энергонезависимой памяти, если нет, тогда программа деактивируется.

   Так как был использован мощный светодиод, ток потребления каждого излучателя составляет около 700 мА,  и например в 3-м режиме расходуется 2,2 A.

   Не забудьте поставить подходящие токоограничивающие резисторы, и обратите внимание, что красные излучатели имеют одинаковый ток при низком напряжении. Транзисторы берутся NPN проводимости, биполярные с мощностью канала не менее 1 А.

   О том, каким должен быть импульсный блок питания, смотрите в приложении к описанию TNY245. Можно попробовать использовать 5 В трансформатор от ATX блока питания. Обязательно помните, что 3W RGB светодиод во время работы нуждается в охлаждении, поэтому необходимо установить радиатора и обязательно проверить температуру их нагрева – не должны быть горячими.

   Очень хотелось, чтобы лампа была мощной и пригодной для использования и при дневном освещении. Эта задача была выполнена благодаря 3-х Вт светодиодам, они дают необычайно яркую интенсивность света. Смешение цветов у таких светодиодов происходит плавно, так как кристаллы расположены близко  друг к другу. Убедится, в этом, можно посмотрев на фотографии.

   Схема, п/плата, монтажная плата, файл прошивки, исходники и другие необходимые для сборки вещи – в архиве для скачивания.

   Светодиоды

МК AVR 8-бит

ATtiny13

1
1206 SMD 0 Ом 4
3528 SMD LED RED 10
Разъем USB-A вилка 1
1206 smd 100 нФ 1
Tantal_D 100 мкФ 1
1206 SMD 10 кОм 1

Скачать список элементов (PDF)

Прикрепленные файлы:

Источник: http://malatok.at.ua/news/serdce_na_attiny13/2013-09-17-40

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}