Добавить в корзинуПозвонить
Найти в Дзене

Arduino, Bascom-AVR и трёхцветный светодиод Piranha. Помигаем? ‒ Тестовый стенд

А давайте устроим яркую красочную иллюминацию? Совсем не такую, как праздничный салют, чтобы огнями и всполохами в полнеба, разноцветными звёздами рассыпаясь в облаках и раскатисто громыхая. А домашнюю, уютную, расположившуюся на уголке рабочего стола, спокойно и безмолвно переливающуюся оттенками разнообразных радужных цветов. Чтобы цветные солнечные зайчики некоторое время ещё оставались в глазах, но недолго. Просто так, без повода. Или по случаю наступления весны. С использованием доступных подручных средств. В общем, сегодня будем мигать светодиодом. Предполагаю, что у некоторых из уважаемых читателей этого блога по данному поводу могут возникнуть вопросы. На некоторые из них постараюсь ответить по ходу повествования, сберегая тем самым ваше время. Для незатронутых в рассказе моментов ‒ комментарии всегда открыты, спрашивайте, пожалуйста, там. ‒ Для кого вообще написана эта статья? ‒ Для электронщиков всех возрастов, только начинающих осваивать микроконтроллеры. Но, быть может, и м

А давайте устроим яркую красочную иллюминацию?

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

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

Чтобы цветные солнечные зайчики некоторое время ещё оставались в глазах, но недолго.

Просто так, без повода. Или по случаю наступления весны.

С использованием доступных подручных средств.

В общем, сегодня будем мигать светодиодом.

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

На некоторые из них постараюсь ответить по ходу повествования, сберегая тем самым ваше время.

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

‒ Для кого вообще написана эта статья?
‒ Для электронщиков всех возрастов, только начинающих осваивать микроконтроллеры. Но, быть может, и маститым гуру современной цифровой электроники будет приятно вспомнить времена, когда и они были новичками и чувства, возникающие когда что-то начинало получаться.

‒ А есть ли в данной статье что-то новое и уникальное?
‒ Скорее всего нет. Не считая разве что собственного опыта и навыков, полученных при практической реализации идеи. Хотя кому как. А вообще информации на подобную тематику в Интернете много, так пусть будет и ещё одна эта статья.

Начнем, пожалуй.

И поможет нам в этом Arduino.

Я буду использовать плату Arduino Nano версии 3.0 с установленным микроконтроллером ATMega328P.

С техническим описанием микроконтроллера можно ознакомиться по этой ссылке.

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

Тем же, для кого краткость ‒ сестра таланта один рисунок распиновки платы Arduino Nano способен сказать многое.

Сам этот рисунок я нашёл на прекрасном и лаконичном сайте.

Распиновка платы Arduino Nano Rev3.2 Источник: http://arduino.zl3p.com/infa/pins_nano
Распиновка платы Arduino Nano Rev3.2 Источник: http://arduino.zl3p.com/infa/pins_nano

Плата была куплена на AliExpress несколько лет назад за полторы сотни рублей.

В целях экономии пары десятков рублей разъёмы на неё напаивались вручную.

Сейчас такие платы, в том числе и с установленными разъёмами, продаются ненамного дороже, а может даже и дешевле.

Аналогичный микроконтроллер стоит и на платах Arduino Uno, так что программный код, рассмотренный в статье, с учётом распиновки плат применим и для них. Для иных разновидностей Arduino c другими микроконтроллерами возможно потребуется изменить и программы, приводимые здесь в качестве примера, в зависимости от архитектуры того или иного микроконтроллера.

-3
‒ Arduino это для детей и школьников. Сделать с его использованием более-менее сложное устройство невозможно. А значит и изучать его не имеет смысла.
‒ Да, и сама плата и программная среда и концепция Arduino специально разрабатывались для максимального облегчения при обучении работе с микроконтроллерами. С целью максимальной доступности по цене подбирались и комплектующие. По сути это просто микроконтроллер, установленный на плате с разъёмами [чтобы не паять], к которому добавлена микросхема для загрузки программного кода с компьютера [чтобы не использовать дополнительный программатор]. С помощью разъёмов к плате подключаются дополнительные модули. А сама платформа способна на всё, на что способны современные микроконтроллеры. Фактически платформа Arduino хорошо применима в качестве тестового стенда, на котором может быть отлажена работа вашего микроконтроллерного устройства. Итоговая сложность конструкции, которую можно собрать, словно из детских кубиков, зависит только от вас, как и сложность кода, который вы сможете написать.

‒ В восьмидесятых годах прошлого века, чтобы помигать светодиодом достаточно было пары транзисторов для схемы мультивибратора, или половинки микросхемы K155ЛА3. Сейчас, на худой конец, можно использовать микросхему таймера NE555. Так зачем всё так усложнять?
‒ С мигания светодиодом для микроконтроллера задачи только начинаются. Микроконтроллеры способны и на гораздо большее. Просто на определённом этапе развития радиоэлектроники сложилась ситуация, когда строить отдельно или менять схему на дискретных элементах под быстро изменяющиеся задачи стало слишком накладно, а использовать микропроцессоры для таких простых задач слишком дорого. Эту нишу и заняли микроконтроллеры. Ведь для изменения функциональности устройства гораздо проще переписать несколько команд прошивки, чем переделывать уже готовую работающую схему. В Советском Союзе в 80-х и 90-х, кстати, тоже были свои микроконтроллеры, например серия K1816 ‒ аналог импортных MCS-48.

Также в запасах со шкафа обнаружились несколько RGB-светодиодов в корпусе Piranha.

Трёхцветные, красно-зелёно-синие, на общем кристалле. Повышенной яркости свечения.

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

При необходимости он вполне может быть заменён на три простых светодиода, соответствующих цветов.

-4
‒ Использовать ресурсы такого мощного микроконтроллера для мигания простым светодиодом нерационально. Это стрельба из пушки по воробьям.
‒ Не спорю. Да, на основе микроконтроллеров можно строить и гораздо более сложные и полезные устройства. Хотя начинать знакомство с ними лучше вот с таких простых задач. Это как для программистов при изучении нового языка программирования первым упражнением становится вывод "Hello, world!" на экран. Такая вот, уже сложившаяся добрая традиция с миганием светодиодом есть и при изучении микроконтроллеров.

‒ И всё-таки можно обойтись и более простыми способами, без использования микроконтроллеров. Взять уже готовые простые мигающие многоцветные светодиоды, например.
‒ Конечно можно. В нашем случае данный светодиод используется только в целях обучения. Можно было бы обойтись и без микроконтроллера, но если вам потребуется заменить светодиод например на WS2812B, тут уж без микроконтроллера никак. И, наверное, лучше начинать изучение с простых примеров, постепенно переходя к более сложным.

Также потребуется беспаечная макетная плата, вроде такой.

Или, как в моём случае, парочка более мелких, вот таких.

Друг с другом их обычно можно скрепить с помощью выступающих по бокам пластиковых зацепов.

Для лучшей фиксации плат снизу можно наклеить ещё один общий слой толстого скотча.

Ещё понадобятся три токоограничительных резистора для светодиода.

Хотя сам светодиод работает при токе в 20 мА, а максимальный ток на выходе портов микроконтроллера не должен превышать 40 мА, я использовал резисторы сопротивлением 1.5 кОм. При напряжении логической 1 на выходе порта в 4.2 вольт ток, протекающий через один канал светодиода будет около 3 мА. Достаточно ярко, чтобы уверенно определить цвет свечения и не слишком ярко, чтобы не слепить глаза.

Также потребуется USB-кабель для соединения платы Arduino c компьютером.

Ну и несколько разноцветных соединительных проводков для беспаечных макетных плат до кучи. С иглообразными папа-разъёмами.

-5

Так как квадратное расположение выводов светодиода не позволяет правильно расположить его на макетной плате, пришлось припаять к его выводам отдельные провода с разъёмами для подключения. Для изоляции выводов [да и просто для красоты] использовал термоусадку.

-6

Собранный тестовый стенд выглядит так.

-7

Вот его наглядная схема соединений, сделанная с помощью программы Fritzing.

-8

Или, если удобнее, то вот схема электрическая принципиальная от Fritzing.

-9

Также нам понадобится компьютер с установленными драйверами USB-порта для подключения платы Arduino.

Так как я использую китайскую версию Arduino, то устанавливал драйвер для микросхемы CH340.

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

Если вы используете оригинальную плату Arduino или на вашей плате стоит иная микросхема USB-порта, то и драйвер вам понадобится иной.

А возможно драйвер и не понадобится, так как ваша Windows определит и подключит его автоматически.

В любом случае при правильно установленном драйвере при подключении платы Arduino в диспетчере устройств Windows появится дополнительный COM-порт.

Номер его может быть отличным от показанного.

-10

А писать программы для мигания светодиодом мы будем в среде Bascom-AVR.

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

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

‒ Почему именно Bascom-AVR? Почему бы не использовать ту же программную среду Arduino-IDE, тем более, что она бесплатна? Или хотя бы широко распространённые пакеты для работы с микроконтроллерами Atmel, например CodeVisionAVR или Atmel Studio?
‒ Причины две. Первая ‒ чисто личные предпочтения, как мне кажется, синтаксис языка Bascom-AVR более прост и нагляден для изучения, чем синтаксис Си-подобных языков сред Arduino-IDE или CodeVisionAVR.
И хотя сами разработчики Bascom-AVR [по данным источника] утверждают, что язык не является "диалектом" Basic, мне он напоминает именно старый, добрый и простой Basic и мои студенческие годы, когда именно на Basic писались первые лабораторные и курсовые.
Вторая причина ‒ относительная компактность кода, полученного в результате компиляции. А также связанное с этим повышение быстродействия работы микроконтроллера.

[И пусть вас не пугает слово Компиляция. Компиляция, в данном случае, это процесс перевода команд с языка программирования, понятного человеку, на язык машинных кодов, понятных микропроцессору или микроконтроллеру. Соответственно программу для автоматизации такого процесса называют компилятором.]

Так вот, например, если сравнивать простейшую программу мигания [встроенным на плату Arduino] светодиодом, которая написана на Bascom-AVR

-11

с аналогичной программой, выполненной в виде скетча в Arduino-IDE,

-12

то первая из них после компиляции займет в памяти микроконтроллера 240 байт, а вторая 1030 байт.

При совершенно одинаковой итоговой функциональности.

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

Если тексты программ на вашем экране видны не очень разборчиво, можно открыть увеличенное изображение просто щёлкнув по нему мышью. Или открыть картинку в отдельной вкладке браузера.

Первый пример программы по миганию установленным на плате Arduino светодиодом можно скачать здесь.

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

Для Arduino-IDE аналогичный код-скетч есть в демонстрационных примерах установленной среды, называется Blink. Находится в каталоге .../Arduino/examples/01.Basics/Blink

Как компилировать программы в Bascom-AVR с последующей загрузкой их на плату Arduino я подробно рассказывал здесь. Да и в Интернете аналогичной информации много. Поэтому останавливаться на этом моменте сейчас не буду.

Второй пример программы по миганию тремя цветами светодиода Piranha на Bascom-AVR. Исходный текст скачать можно здесь.

-13

Из кода видно, что данная функциональность получена простым масштабированием первого примера.

После переноса кода прошивки в Arduino результат выглядит так.

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

Внесём в код элемент случайности.

Программа при этом усложнится ненамного. Исходный её текст можно скачать отсюда.

-14

Теперь наша иллюминация выглядит так.

Можно ли улучшить нашу программу ещё? Конечно, совершенству нет предела.

Например можно попробовать управлять яркостью каждого из цветов.

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

Способ есть.

Он давно известен и широко используется.

И для него не потребуется вносить в схему никаких электронных изменений и дополнительных дискретных компонентов [Чтобы, например, управлять током светодиодов].

Называется он ШИМ - широтно-импульсная модуляция. В англоязычных источниках его называют PWM - pulse-width modulation.

Звучит мудрёно, но на самом деле суть его проста.

Если подавать на светодиод не постоянное напряжение, а импульсы, то, начиная с определённой их частоты [25 герц, 50 или даже 100, но можно и выше], за счёт инерционности человеческого зрения глазу будет казаться, что светодиод светит постоянно, не мигая, без вспышек.

Если при такой частоте в импульсах начать менять длительность единичек [ширину импульса по отношению к периоду, или, как ещё говорят, его скважность] то мощность, подводимая к светодиоду в единицу времени будет меняться, и светиться для нашего глаза он станет ярче или тусклее.

Способны работать в режиме ШИМ и микроконтроллеры ATmega. В микроконтроллере ATmega328P, например, для этого можно использовать зарезервированные выводы чипа - 1, 9, 10, 13, 14, 15 - всего шесть каналов.

Им соответствуют номера выводов разъёма платы Arduino Nano: D3, D5, D6, D9, D10, D11.

Соответственно это порты микроконтроллера: PD3, PD5, PD6, PB1, PB2, PB3.

В документации к микроконтроллеру рассматриваются различные режимы управления ШИМ, мы остановимся на самом простом, аппаратном ШИМ, или Fast PWM.

Для управления каналами ШИМ используются таймеры: Timer0, Timer1, Timer2.

Каждый таймер может управлять двумя каналами ШИМ [и портами], они закреплены за конкретным таймером.

-15

Чтобы регулировать длительность импульса достаточно поместить в определённую переменную в Bascom-AVR необходимое значение.

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

Так, например, выглядят сигналы, снятые USB-осциллографом с выхода порта PB1 микроконтроллера нашего тестового стенда при различных значениях переменной Pwm1A.

-16
-17
-18

На самом деле всё немного сложнее, более подробно об этом можно прочитать, например здесь. Эта же статья и послужила основой для нашей истории.

А вообще сайт http://avrproject.ru/ AVR Project Проекты на микроконтроллерах AVR будет вам интересен, если вы только начинаете или уже работаете с микроконтроллерами фирмы Atmel. На сайте можно найти как примеры готовых конструкций, так и описание простых примеров кода на Bascom-AVR при подключении к микроконтроллеру каких-либо модулей. В общем, заглядывайте, вам понравится.

Ну, а если хочется узнать про все особенности при работе с ШИМ подробное техническое описание микроконтроллера вам в помощь.

Перед использованием ШИМ необходимо произвести предварительную настройку, задав определённую конфигурацию таймеров

Делается это с помощью команды примерно такого вида:

Config Timer1 = Pwm, Pwm = 8, Compare A Pwm = Clear Down, Compare B Pwm = DISCONNECT, Prescale = 8

Здесь мы говорим:

  • что будем использовать Timer1 в режиме ШИМ
  • что разрядность ШИМ будет 8-ми битной, соответственно число градаций ширины импульса 256 значений

Так как Timer1 в ATmega328P 16-ти битный, то допустимо задавать и большую разрядность ШИМ, например 9, 10, 11.

При этом число градаций соответственно будет 512, 1024, 2048.

Timer0 или Timer2 у нас 8-ми битные, поэтому в команде конфигурации разрядность для них не указываем, максимально может быть только 256 градаций.

  • что канал A работает по высокому уровню Clear Down, а канал B отключён и не используется DISCONNECT

Для канала A при этом, чем больше значение в переменной Pwm1A, тем уже импульс.

Если для канала А задать режим Clear Up, то чем больше будет значение в переменной Pwm1A, тем импульс будет шире.

  • Prescale = 8 предварительное деление частоты переполнения таймера

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

Вот текст этой программы.

-19

Светодиод плавно разгорается и затухает.

Для разнообразия можно добавить элемент случайности в установку скорости изменения яркости.

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

-20

Результат работы такой версии программы.

А теперь масштабируем код на все три цвета светодиода. Исходный текст данной программы можно скачать здесь.

-21

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

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

‒ А кроме тестового стенда есть ли окончательная конструкция? Где это вообще можно использовать?
‒ Окончательной конструкции и реализации идеи в железе нет. И хоть сама схема проста и наглядна, использовалась она только с целью обучения. При необходимости вы можете задействовать все шесть ШИМ-каналов микроконтроллера, добавить нужных вам цветовых эффектов и обработку событий по кнопке для переключения этих эффектов. На основе такой схемы могут получиться неплохие многоканальные светодиодные огни на новогоднюю ёлку. Примерно такие, как из Поднебесной, которыми вовсю и задёшево торгуют коробейники по всем электричкам незадолго до наступления праздников.

Вот такая вот праздничная иллюминация.

-22

1 марта 2020 года.

С уважением, Ваш @mp42b.

-23