Как бы странно или забавно это не звучало, но определить, как давно человек занимается радиоэлектроникой можно по его отношению к Arduino.
Больше всего данной платформой пользуется детвора из кружков робототехники, школьники и студенты. Им не столь важна красота и законченность конструкции, сколь нужен быстрый практический результат.
Чтобы гудело, сверкало, мигало и переливалось, пищало и ехало.
И Arduino позволяет такой результат получить.
На эту целевую аудиторию, в общем-то, и рассчитывали сами разработчики платформы.
Другая категория ‒ солидные и профессиональные радиолюбители-электронщики. Осваивали микроконтроллеры ещё в 80-х и 90-х годах прошлого века.
На Arduino зачастую смотрят свысока, немного пренебрежительно.
И вместо "детской забавы" предпочитают работать непосредственно с микроконтроллерами.
В приоритетах ‒ продуманность схемотехнических решений, красота разводки печатных плат, функциональность и практичность готовых конструкций.
Ещё одно субъективное наблюдение: Arduino предпочитают больше программисты, для быстрой отладки своих алгоритмов.
Им неинтересно или некогда возиться с паяльниками, отдельными радиодеталями, химикатами, травлением плат и окончательной сборкой.
А для настоящих "железячников" на первом месте прежде всего собираемая схема, а программная начинка ‒ всего лишь дополнение к ней.
Но так ли велика разница между двумя этими подходами, так ли непримиримы эти взгляды?
Или это всего лишь только две стороны одной медали?
А давайте вместе попробуем показать, что, по большому счету, различий, между использованием плат Arduino или отдельных микроконтроллеров, из которых они состоят, не так уж и много.
И что гораздо удобнее использовать оба варианта, например плату Arduino на этапе разработки и отладки схемотехнического решения и алгоритмов, а микросхему запрограммированного контроллера в уже готовой конструкции.
Как и прошлые статьи, данная статья для всех, кто изучает микроконтроллеры и учится их программировать. Для всех, кому это интересно. Каких-либо открытий и инноваций здесь нет, за исключением собственного полученного практического опыта.
В качестве практического примера используем тестовый стенд музыкального звонка из прошлой статьи [Часть 1, Часть 2].
Попробуем заменить в этой конструкции плату Arduino Nano на микросхему ATmega328p-PU.
Для большего удобства используем микроконтроллер в DIP-корпусе, его и на беспаечную макетную плату установить легко, и на печатной плате в готовой конструкции применить потом несложно.
Распиновка контактов микроконтроллера, найденная на просторах Интернета.
1. Схема конструкции
По сравнению со схемой музыкального звонка на Arduino в схему электрическую принципиальную внесены некоторые незначительные изменения.
- изменилась нумерация выводов микроконтроллера из-за использования микросхемы в DIP-корпусе
- для более стабильной работы и с целью устранения дребезга контактов при нажатии кнопок параллельно им подключены керамические конденсаторы
- аналогичный конденсатор подключен в цепи инициализации работы микроконтроллера, к выводу Reset
- добавлен внешний кварцевый резонатор и пара конденсаторов в цепи его обвязки. Для перевода микроконтроллера на частоту работы в 16 мГц.
Обычно микроконтроллеры поставляются с завода с настроенными Fuse-битами в конфигурации с частотой работы 8 мГц. Arduino Nano работает на частоте 16 мГц. Для использования вместо Arduino микроконтроллера нам придется пересчитать параметры всех мелодий, или, что гораздо проще, запустить микроконтроллер с частотой 16 мГц. Для этого нужно будет определенным образом перепрограммировать и его Fuse-биты.
2. Тестовый стенд
Наглядная монтажная схема соединения деталей и компонентов, сделанная в программе Fritzing также будет немного отличаться.
[Скачать монтажную схему в формате PDF]
Собранный по новой схеме тестовый стенд теперь выглядит так.
Большинство его деталей те же, что и в прошлой конструкции. Но понадобилось использовать несколько соединительных скобок другой длины.
3. Внешний программатор
В отличии от платы Arduino Nano у микросхемы ATmega328p нет встроенных программно-аппаратных средств для обмена данными c компьютером по USB-интерфейсу. Поэтому для загрузки прошивки придется использовать дополнительный программатор. Существует огромное количество разновидностей подобных устройств для программирования микроконтроллеров AVR. Я пользуюсь программатором российского производителя "Мастер Кит" BM9010 ‒ AVR910. Купил его несколько лет назад в ЧИП и ДИП.
Описание данного устройства можно найти на сайте разработчика.
Также на сайте доступны инструкция по работе с программатором и описание процесса установки драйверов.
Сам пакет с драйверами находится здесь.
После установки драйверов при подключении программатора к порту USB компьютера в диспетчере устройств Windows он определяется как дополнительный COM-порт с некоторым номером. Запоминаем его номер ‒ COM4.
В свойствах данного порта необходимо установить скорость обмена данными. В данном случае выставлена скорость передачи 57600 бит в секунду. Тоже запоминаем, это понадобится впоследствии.
В оригинальной схеме подключения программатора предполагается питать конструкцию от дополнительного источника.
Можно подавать питание на конструкцию от того же самого порта USB к которому подключается программатор.
Для этого свободный изначально вывод 2 10-ти контактного разъёма программатора нужно соединить дополнительным проводом с выводом VCC +5V USB-разъёма программатора. При таком способе нужно с особой тщательностью проверять правильность подключения программатора к конструкции. В противном случае есть риск вывода из строя не только микроконтроллера и программатора, но и цепей USB-разъёма компьютера.
Есть и ещё одна особенность при работе с этим программатором. В инструкции к BM9010 ‒ AVR910 написано, что работа программатора совместно с Windows 7 не предусмотрена. [А также с Windows 8 и Windows 10]. Причиной является появившаяся в данных операционных системах необходимость проверки цифровых подписей при подключении драйверов. Чтобы решить данную проблему приходится проверку цифровых подписей в Windows отключать.
4. Тестовый режим работы Windows ‒ режим разработчика.
Для обеспечения работы программатора совместно с вышеуказанными операционными системами необходимо временно отключать проверку цифровых подписей.
Делается это переводом Windows в тестовый режим работы, так называемый "режим разработчика".
Для этого я использую небольшую программную утилиту Driver Signature Enforcement Overrider ‒ dseo13b.
Скачать её можно с сайта разработчика.
При запуске программа выдаст три экрана. На первом из них будет кратко рассказано о проблеме цифровой подписи драйверов, на втором предупредят, что программа поставляется "как есть", и может использоваться вами на ваш страх и риск с полным отказом разработчиков от возможных последствий применения. Соглашаемся и перейдя к третьему экрану выбираем пункт Enable Test Mode, жмём кнопку Next, а после сообщения о переводе Windows в тестовый режим и необходимости перезагрузки выбираем пункт Exit и снова жмём Next.
Перезагружаем Windows и в правом нижнем углу рабочего стола над часами видим вот такую надпись.
Теперь программатор будет работать и в Windows 7, можно его подключать.
Отключается тестовый режим Windows аналогично, только выбираем в утилите dseo13b пункт Disable Test Mode.
5. Подключение программатора
Спустя годы типовой шлейф с разъёмом для подключения программатора к микроконтроллеру перестал работать, поэтому я заменил его самодельным из разноцветных монтажных проводов. К беспаечной макетной плате его удобно подключать с помощью игольчатых папа-разъёмов. На другой стороне припаяна ответная часть 10-ти контактного разъема.
Схема подключения программатора выглядит так. В скобках даны номера контактов 10-ти контактного разъёма программатора.
[Скачать схему подключения в формате PDF]
При работе с программатором нужно учитывать, что не всякая конструкция позволяет вести программирование прямо в рабочей схеме, без отсоединения микроконтроллера. Иногда случаются ситуации, когда при попытке программирования выдаются сообщения о невозможности перевода микроконтроллера в режим программирования.
В этом случае причина может быть как в замыкании контактов разъёма или обрыве проводов шлейфа, так и во влиянии отдельных деталей нашей конструкции на процесс программирования. Например, мне очень долго не удавалось понять, что именно я делаю не так глядя на подобное сообщение об ошибке. А оказалось, что на сигнал программатора MOSI влияет конденсатор для подавления дребезга контактов кнопки запуска мелодии. На схеме он отмечен красным крестиком, на время программирования его нужно было отключать. Но лучше, конечно, по возможности программировать микроконтроллер отдельно от схемы.
6. Программная составляющая
Исходный код прошивки музыкального звонка с подробными комментариями можно скачать отсюда.
Данный код без каких либо переделок будет работать и на Arduino и на отдельном микроконтроллере ATmega328P.
Практически это та же самая программа, что использовалась для схемы музыкального звонка на Arduino Nano.
В неё были внесены незначительные изменения для повышения стабильности работы звонка и для устранения дребезга контактов при нажатии кнопок.
А также добавлены три дополнительных мелодии, взятые с сайта Коды мелодий для Nokia Composer.
[Символы диеза # здесь заменены на слово "Диез", так как Дзен воспринимает решётки как теги].
Кино ‒ Кончится лето
8b1 8e2 4g2 4g2 4g2 4g2 4g2 8g2 8Диезf2 8e2 4b1 8d2 4Диезf2 4Диезf2 4Диезf2 4Диезf2 4Диезf2 8Диезf2 8Диезf2 8a2 4g2 8b1 4d2 4Диезf2 4Диезf2 4Диезf2 4Диезf2 8Диезf2 8Диезf2 8a2 4g2 8b1 4e2 4e2 4e2 4e2 4e2 8g2 8Диезf2 8e2 8b1
Кино ‒ Красно-жёлтые дни
8Диезf1 8b1 8Диезf1 8b1 8Диезf1 8d2 8Диезf1 8Диезc2 8Диезf1 4b1 2‒ 8a1 8d2 8a1 8d2 8a1 8Диезf2 8a1 8e2 8a1 4d2 2‒ 8d2 8g2 8d2 8g2 8d2 8b2 8d2 8a2 8d2 4g2 2‒ 8a1 8d2 8a1 4d2 8‒ 8d2 8d2 2d2 2‒
Кино ‒ Восьмиклассница
4Диезg1 4Диезg1 8‒ 8Диезa1 8Диезg1 8g1 4f1 8‒ 8‒ 8‒ 8‒ 8Диезd1 8f1 8g1 8‒ 8g1 8g1 8‒ 8g1 8f1 8g1 4Диезd1 8‒ 8‒ 4c1 8‒ 8‒ 4Диезg1 4Диезg1 8‒ 8Диезa1 8Диезg1 8g1 4f1 8‒ 8‒ 8‒ 8‒ 8Диезd1 8f1 8g1 8‒ 8g1 4g1
О подробностях и особенностях программирования простых мелодий можно прочитать в предыдущих статьях по этой теме [Часть 1 и Часть 2].
При конвертации и прослушивании чуть подкорректировал последовательность мелодий, добавив короткие паузы между соседними одинаковыми нотами, чтобы они не сливались.
7. Файл прошивки
Получение файла прошивки в Bascom-AVR никаких проблем не вызывает. Для этого достаточно просто загрузить исходный код [файл с расширением .bas] в среду программирования и выполнить компиляцию нашей программы, выбрав пункты меню Program ‒ Compile F7.
Если на вашем устройстве текст программ на скриншотах читается не слишком отчетливо, можно открыть увеличенную картинку, просто щёлкнув на ней мышью. Или открывать такие картинки в соседней вкладке браузера.
После непродолжительного ожидания завершения процесса компиляции
в каталоге, откуда загружали исходный код программы появятся несколько дополнительных файлов.
Среди них будет файл с расширением .hex , это и есть нужный нам файл прошивки.
Именно его мы и будем загружать в микроконтроллер.
Скачать готовый .hex-файл прошивки также можно отсюда.
8. Загрузка файла прошивки в микроконтроллер
Надо сказать, что в самой среде программирования Bascom-AVR уже есть возможности для работы с отдельными программаторами.
Именно этот функционал мы и задействовали, когда программировали звонок на Arduino.
И в списке доступных программаторов там даже есть AVR910.
Но то ли мой программатор не совсем совместим с указанным, то ли какие-то настройки делаю не так, но мне не удалось прошить микроконтроллер используя данный программатор непосредственно из Bascom-AVR. Вроде бы процесс как-то и шёл, но с выдачей ошибок и нулевым результатом.
Поэтому было выбрано другое решение ‒ использовать для прошивки дополнительную программу.
Одной из таких программ является среда разработки решений для микроконтроллеров CodeVisionAVR.
Evaluation-версию данной программы можно свободно скачать с сайта разработчика.
Так же, как и демо-версия Bascom-AVR, Evaluation-версия CodeVisionAVR бесплатна и имеет ограничение на размер исполняемого кода в 4 кБайт.
На данный момент я использую версию 3.40 данной программы.
Среди всего богатства возможностей её среды разработки есть, в том числе, и встроенный программатор. Он вызывается из главного меню выбором пунктов Tools - Chip Programmer Shift+F4.
Перед его использованием нужно произвести предварительную настройку.
Для этого запустив режим Chip Programmer выбираем в меню открывшегося окна режим Settings.
Открывается ещё одно окно Programmer Settings, в нём нужно выбрать из раскрывающегося списка наименование микроконтроллера [AVR910], задать COM-порт c нужным номером [COM4], скорость обмена с портом [57600]. Нумерация порта и скорость обмена должны совпадать с параметрами драйвера в диспетчере устройств Windows, рассмотренными на шаге 3.
В списке доступных микроконтроллеров окна Chip Programmer нужно выбрать наш микроконтроллер ATmega328P.
Для проверки правильности подключения и настроек обмена можно нажать на кнопку с жёлтым значком Reset Chip. При этом на плате программатора на мгновение должны зажигаться светодиоды.
Загрузить .hex-файл прошивки в буфер Chip Programmer можно с помощью выбора режима меню File ‒ Load FLASH.
Перед загрузкой прошивки в микроконтроллер нужно стереть в нём данные из прошлой прошивки, если они были.
Это делается с помощью выбора режимов меню Program ‒ Erase Chip.
Сама прошивка из буфера Chip Programmer в микроконтроллер загружается выбором режимов меню Program ‒ FLASH.
Далее некоторое время любуемся индикатором прошивки и индикатором проверки результатов прошивки [если в правом нижнем углу окна Chip Programmer была установлена галочка Verify].
Но отключать программатор после этого ещё рано. Необходимо правильно запрограммировать ещё и Fuse-биты.
9. Fuse-биты, великие и страшные
На самом деле никакого величия в них нет, и страшного тоже. Это всего лишь некоторые дополнительные настройки режима работы микроконтроллера.
Когда-то давно они задавались пережигаемыми перемычками. А в наше время Fuse-биты задаются с помощью программирования определенных ячеек памяти и могут быть перепрограммированы неоднократно. Но отношение к Fuse-битам у многих настороженное и этому есть свои причины, связанные с их особенностями.
Причина первая, сложившаяся исторически:
- если Fuse-бит не установлен ‒ он имеет значение 1
- если Fuse-бит установлен ‒ он имеет значение 0
Так повелось от тех самых одноразовых пережигаемых перемычек.
Причина вторая, вносящая путаницу: разные программы для программирования микроконтроллеров отображают Fuse-биты по разному, некоторые показывают как есть, а некоторые инверсно. Уточнять это необходимо внимательно читая описание конкретной программы.
Причина третья, усугубляющая: Если отнестись к процессу легкомысленно и запрограммировать Fuse-биты неправильно есть риск потерять доступ к повторному перепрограммированию микроконтроллера. Например, как в нашем случае, перепрограммировав Fuse-биты определяющие тактовую частоту работы микроконтроллера с восьми до 16 мГц в дальнейшем мы не можем его использовать [и программировать], не подключив дополнительный кварцевый резонатор или не подав тактовые импульсы с внешнего генератора. Бывают и более тяжелые ситуации.
Очень подробно про установку и назначение каждого Fuse-бита можно почитать, например здесь, здесь или здесь.
Мы же на практике поступим следующим образом.
Считаем текущие заводские Fuse-биты из микроконтроллера, выбрав пункты меню Read ‒ Fuses.
В открывшемся окне на запрос 'Copy the read values to the Fuse Bits setting?' ‒ 'Скопировать считанные значения в настройки Fuse-бит?' ответим Yes‒Да. При этом считанные параметры сохранятся в правой половине окна Chip Programmer в настройках Fuse-бит.
Затем изменим всего два значения Fuse-бит:
- установим значение бита CKSEL1 в 1, выбрав из списка параметр как показано на картинке. Так, чтобы группа битов CKSEL3:0 стала иметь значения 1111. Таким образом укажем, что будет использоваться внешний кварц с частотой работы 16 мГц
- установим группу битов SUT1:0 в значение 11, как показано на картинке. Чтобы дать время микроконтроллеру запуститься с некоторой задержкой после подачи напряжения питания и завершения переходных процессов с этим связанных.
Остальные Fuse-биты менять не нужно, пусть остаются как есть.
Для переноса их назад в микроконтроллер установим галочку Program Fuses над всей группой и выполним пункт меню Program ‒ Fuses.
Пару миганий светодиодов на плате программатора и Fuse-биты уже в микроконтроллере.
Для проверки можно снова считать их из микроконтроллера командами меню Read ‒ Fuses.
В итоге должно получиться вот так.
Отключаем программатор от компьютера и тестового стенда, не забываем снова установить на плату снятый ранее конденсатор подавления дребезга контактов кнопки.
Потом переходим к следующему шагу.
10. Выбор источника питания
На выбор источника питания нужно обратить особое внимание.
Питать конструкцию от USB-порта компьютера или ноутбука не самое лучшее решение.
Поначалу можно, конечно, работать будет.
Но из-за наводок и пульсаций устройство может работать нестабильно.
Проявляться это может в виде спонтанного обрыва мелодии после проигрывания нескольких первых нот, невозможности запуска или неправильном-нечётком срабатывании кнопок.
Нестабильная работа также может быть связана и с неправильным кодом прошивки, нарушением контактов макетной платы и дребезгом контактов при нажатии кнопок. Но если при замене источника питания проблемы чудесным образом исчезают ‒ дело в питании, смотрите в первую очередь в этом направлении.
Не все сетевые источники нам подойдут. Если источник импульсный ‒ зависит от частоты преобразования и уровне пульсаций на выходе.
Лучше, наверное, использовать автономное питание.
Так как я предполагаю в будущем использовать эту конструкцию автономно, для питания схемы я выбрал литий-ионный аккумулятор от сотового телефона.
Для его подзарядки от любого USB-источника использую модуль зарядного устройства на микросхеме TP4056.
А так как по техническому описанию для микроконтроллера ATmega328p при работе на частоте 16 мГц требуется напряжение питания от 4.5 до 5.5 вольт, то также использую модуль повышающего преобразователя напряжения.
Ток потребления конструкции в состоянии покоя 17 мА, при проигрывании мелодии на среднем уровне громкости примерно 80 мА, при максимальной громкости около 180 мА.
Для энергоёмкости данного аккумулятора в 2800 mAh одного заряда аккумулятора должно хватить примерно на неделю в режиме ожидания или 35 часов непрерывной работы при среднем уровне громкости.
Если же нужна более длительная автономность - у микроконтроллера есть возможность перевода в спящий режим для резкого снижения потребляемого тока.
Только для этого нужно будет внести изменения в программу прошивки.
А готовый источник автономного питания выглядит так.
11. Поехали!
Осталось запустить звонок и проверить, что получилось в результате.
Устанавливаем регулятор громкости в среднее положение и подаем на конструкцию питание от нашего источника.
Если в ответ слышим приветственный гудок ‒ это хороший признак, значит установленная в микроконтроллере прошивка начала работать.
Жмём на кнопки запуска-остановки мелодии, перебираем их кнопкой выбора.
Если всё работает исправно ‒ облегченно вздыхаем.
Или радостно прыгаем.
Или просто наслаждаемся, слушая...
Качество видео, как и записанный звук, определяемые съёмочной техникой ‒ здесь не очень хорошие.
В реальности "шарманка" и звучит гораздо приятнее и выглядит немного красочнее.
И у вас есть все возможности это оценить, собрав конструкцию самостоятельно.
Попробуйте, это просто! Почти.
28 мая 2020 года.
С уважением, Ваш @mp42b.
Предыдущие статьи по данной теме:
1. Про температурные датчики MTH02, их функциональные аналоги и Arduino
2. Arduino, Bascom-AVR и трёхцветный светодиод Piranha. Помигаем? ‒ Тестовый стенд
3. Бегут и переливаются: Arduino, Bascom-AVR и светодиоды WS2812B
4. "Шарманку" программируете? ‒ Arduino, Bascom-AVR и восемь простых мелодий. Часть 1
5. "Шарманку" программируете? ‒ Arduino, Bascom-AVR и восемь простых мелодий. Часть 2