Начинающим
Не являясь будучи программистом, радиолюбителю трудно использовать в своей практике микроконтроллеры, создавать для них платы и самостоятельно писать программы. И тут на помощь приходит всем уже известная и популярная платформа итальянских разработчиков «Ардуино» со всем разнообразием поддерживаемых ею отладочных плат и подключаемых различных модулей в виде датчиков, органов ввода-вывода и управления, и исполняемых устройств. Среда для разработки программ «Arduino IDE» так же является очень простой и удобной, а «Скетч» — так называется исходный текст программ, пишется на языке «Wiring-Processing». Имеется множество библиотек и примеров, и для начала можно совсем не знать язык программирования C/C++, на котором чаще всего пишутся программы для микроконтроллеров. Не обязательно вручную настраивать таймер-счётчик микроконтроллера для генерации ШИМ-сигнала или задавать режим аналого-цифрового преобразователя для считывания значений на аналоговых входах. Так же не надо напрямую работать с регистрами и запоминать, или всегда иметь под рукой все их названия. Для управления выводами микроконтроллера не нужно использовать битовые маски и совершать побитовые операции, так как в среде разработки каждый регистр порта ввода-вывода ассоциирован с определённым номером вывода отладочной платы. Большинство параметров уже задано по умолчанию и скрыто от пользователя, так что не придётся часами искать ошибку от неправильной установки какого-либо значения. При написании «скетча» можно копировать и соединять в одном проекте несколько примеров из разных библиотек, и изменяя номера выводов и значения задаваемых констант подстраивать всю программу под свои нужды. И что самое интересное, при всём этом написанную для одной платы программу можно использовать для другой, просто выбрав соответствующую плату в меню и заново скомпилировав проект.
Приобретение
На сайте уже есть статья с обзором отладочной платы «Arduino Pro Mini» и здесь мы рассмотрим самую распространённую из всех отладочных плат, поддерживаемых платформой Ардуино — это плата под названием «Arduino UNO». Плата была куплена на сайте Aliexpress и не является подлинной оригинальной итальянской платой, хотя это самый похожий и максимально приближённый образец, подобранный в интернет-магазине. Заказ делался в 2018 году и обошёлся в 12$ вместе с доставкой. Хотя этот вариант и стоит немного дороже остальных, но у него имеются преимущества по сравнению с дешёвыми подделками, о которых будет идти речь при сравнении разных плат:
Arduino UNO является самым подходящим вариантом для начала работы с платформой, так как она имеет средний размер, достаточное количество выводов микроконтроллера для большинства проектов и удобно организованные контакты портов ввода-вывода. И самое важное для быстрого старта работы с микроконтроллером — наличие встроенного программатора и интерфейса USB для прямого подключения к компьютеру. Arduino Uno — это аппаратное обеспечение со свободно распространяемыми файлами схем и чертежей. Каждый может изготовить подобную плату используя эти файлы с официального сайта проекта Ардуино. За невысокую цену в Китае можно найти как простые похожие изделия, так и почти подлинные платы на базе оригинальных микроконтроллеров. В конце будет произведено сравнение разных вариантов плат, а для начала рассмотрим характеристики отладочной платы Arduino UNO третьей ревизии.
Технические характеристики
Основные параметры платы Arduino UNO версии 3 приведены в таблице. Для более детального ознакомления с характеристиками платы следует посетить официальный сайт https://store.arduino.cc/usa/arduino-uno-rev3
Параметр | Значение |
---|---|
Рабочее напряжение | 5 Вольт |
Напряжение питания | 7 — 12 Вольт |
Установленный микроконтроллер | ATmega328P |
Количество цифровых выводов | 14 |
Число аналоговых входов | 6 |
Допустимый ток одного вывода | 20 мА |
Тактовая частота | 16 МГц |
Выводы питания:
- 5V – выход напряжения 5 В для питания внешних устройств;
- 3.3V – маломощный выход стабилизированного напряжения 3.3 В;
- GND – общий вывод;
- VIN – вывод для подачи внешнего напряжения питания для всей платы и подключённых модулей;
- IOREF – вывод, информирующий о значении напряжения высокого уровня портов ввода/вывода платы.
Дополнительные выводы:
- AREF. Опорное напряжение для аналого-цифрового преобразователя микроконтроллера. Используется совместно с функцией analogReference () при написании скетчей.
- Reset. Подача низкого уровня на вывод Reset приводит к перезагрузке микроконтроллера. Обычно используется для добавления кнопки сброса к дополнительно устанавливаемым и подключаемым модулям.
Принципиальная схема отладочной платы Arduino UNO Rev3:
Распаковка — комплектация
Во время заказа платы был так же куплен сетевой адаптер для питания и кабель USB для подключения к компьютеру. Они были помещены в обычный полиэтиленовый пакет, находящийся в основной упаковке:
Сама плата находилась в жёстком антистатическом пакете и была герметично запечатана в нём:
Ознакомление
Блок питания имеет сетевую вилку европейского типа и разъём 2,1 мм с положительным центральным контактом:
Адаптер преобразует сетевое напряжение переменного тока 100-240 В частотой 50/60 Гц в постоянное стабилизированное напряжение 9 В с допустимым током нагрузки 0,85 А:
Пожалуй это самое оптимальное напряжение питания. При подаваемом напряжении ниже 7 Вольт плата может работать нестабильно, а при напряжении более 12 Вольт будет увеличиваться нагрев интегрального стабилизатора. При необходимости, для питания платы можно использовать любой другой адаптер с близкими характеристиками.
В комплекте так же довольно качественный USB-кабель, который имеет длину 1,8 м и разъём типа «B» для подключения к плате:
Хотя плата и изготовлена в Китае, уровень производства довольно высокий, монтаж выполнен ровно и красиво без каких-либо видимых дефектов. На плате синего цвета установлен оригинальный микроконтроллер ATmega16U2 преобразователя USB-UART и основной микроконтроллер ATmega328P в DIP-корпусе, вставленный в панельку::
С передней стороны платы расположены разъём для подачи питания и разъём USB-B, возле которого в самом углу находится кнопка сброса:
Рядом находится шести-контактный ICSP-разъём внутрисхемного программирования микроконтроллера ATmega16U2 преобразователя интерфейса, три индикаторных светодиода обозначенные как «L», «TX», «RX», перемычка «RESET-ON», кварцевый резонатор на 16 МГц, само-восстанавливающийся предохранитель на 500 мА и интегральные стабилизаторы питания:
Плата Arduino Uno может питаться через USB-соединение или от внешнего источника питания. Источник питания выбирается автоматически. Внешнее (не USB) питание может подаваться либо от адаптера, либо от аккумулятора. Адаптер можно подключить, вставив штекер 2,1 мм в разъем питания платы. Выводы от батареи могут быть подключены к контактам GND и Vin разъема POWER. На контакт «5 В» выводится напряжение +5 В от установленного на плате интегрального стабилизатора.
Выводы платы с номерами от 0 до 13 являются цифровыми. Это означает, что с них можно считывать и подавать на них только два вида сигналов: HIGH и LOW, нуль или единицу. Некоторые цифровые выводы поддерживают ШИМ и на плате они обозначены знаком «~». Все цифровые выводы расположены сбоку в один ряд:
Следуя далее по периметру, с задней стороны платы находится индикаторный светодиод наличия питания и ещё один шести-контактный разъём внутрисхемного программирования, уже для основного микроконтроллера ATmega328P. С его помощью можно записать загрузчик в пустой микроконтроллер в обход установленного программатора:
Аналоговые входы Arduino Uno обозначены как A0-A5 и являются входами для встроенного аналого-цифрового преобразователя (АЦП) микроконтроллера, обеспечивающего 10-битную разрядность. По умолчанию измеряемое значение должно быть в пределах от 0 до 5 вольт, хотя возможно изменить верхний предел диапазона, используя вывод AREF и функцию analogReference (). Выводы с аналоговыми входами так же можно использовать как цифровые. Они расположены с другого боку от цифровых выводов рядом с выводами питания:
Некоторые выводы совмещают дополнительные функции и могут быть использованы различными модулями для связи с микроконтроллером:
- Последовательный порт: 0 (RX) и 1 (TX). Используется для приема (RX) и передачи (TX) последовательных данных. Эти контакты внутренне подключены к соответствующим контактам микросхемы ATmega16U2 преобразователя интерфейса USB-to-TTL.
- Внешние прерывания: 2 и 3. Эти выводы могут быть сконфигурированы для запуска прерывания по низкому уровню, нарастающему или спадающему фронту, или по изменению значения.
- ШИМ: 3, 5, 6, 9, 10 и 11. Обеспечивает 8-битную ШИМ на этих выводах.
- SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Эти выводы используются для связи по SPI протоколу.
- Светодиод: 13. На плате имеется встроенный светодиод, подключённый между общим проводом и цифровым выводом 13.
- TWI: вывод A4 или SDA и вывод A5 или SCL. Поддержка TWI связи по двухпроводному соединению.
Соответствие выводов отладочной платы Arduino UNO выводам микроконтроллера ATmega328P можно посмотреть на следующем чертеже:
Снизу плата закрашена белым цветом и оставлены только синие надписи и логотип «Arduino». На плате написано что она изготовлена в Италии и является оригинальной, хотя в конце будет произведено сравнение подделок и станет понятно что это не подлинная плата из Италии:
Подключение к компьютеру
Плата Uno версии R3 отличается от других плат тем, что не использует микросхему конвертера FTDI USB-to-serial. Вместо этого она оснащена микроконтроллером ATmega16U2, запрограммированным как преобразователь USB-последовательный порт. Arduino/Genuino Uno имеет ряд средств для связи с компьютером, другой платой Arduino или другими микроконтроллерами. ATmega328 обеспечивает последовательную связь UART TTL (5 В), которая доступна на цифровых выводах 0 (RX) и 1 (TX). ATmega16U2 на плате преобразовывает эту последовательную связь в USB соединение и выглядит как виртуальный COM-порт для программного обеспечения на компьютере. Прошивка ATmega16U2 использует стандартные драйверы USB COM, и дополнительный драйвер не требуется.
Плату можно запустить, подключив к ней адаптер питания, но при таком включении она будет работать автономно, без связи с компьютером, выполняя записанную в основной микроконтроллер программу:
После подключения USB-кабеля плата получает питание от компьютера, зажигается зелёный светодиод и запускаются микроконтроллеры:
В компьютере сразу определяется USB-устройство и опознаётся, что это Arduino UNO:
Создаётся точка восстановления системы и начинается установка стандартного драйвера для последовательного порта:
После успешной установки драйвера плата Arduino UNO появляется в списке портов диспетчера устройств. В данном случае был добавлен виртуальный последовательный порт под номером COM3:
Открыв свойства порта можно детально посмотреть характеристики установленного драйвера и соответствующего ему оборудования:
После того как драйвер установлен и плата опознана, можно запустить среду разработки и начать писать программы или использовать готовые примеры, которые имеются на большинство случаев. Среду разработки можно бесплатно скачать с официального сайта проекта Ардуино по ссылке https://www.arduino.cc/en/main/software где имеются версии для Windows, Mac OS X и Linux. Для Windows можно скачать установщик, аппликацию или ZIP-файл для портативной работы. При запуске показывается логотип Arduino и краткая информация:
Программное обеспечение Arduino IDE включает в себя монитор последовательного порта, который позволяет отправлять и принимать простые текстовые данные. Индикаторы RX и TX на плате будут мигать, когда данные передаются через USB-Serial чип и USB-соединение с компьютером, но не при последовательной связи на контактах 0 и 1. Для программирования платы Uno в Arduino Software IDE на вкладке «Tools» > «Board» нужно выбрать «Arduino/Genuino Uno». В данном случае использовалась версия программы 1.8.5:
Далее на вкладке «Tools» > «Port» следует выбрать порт, к которому физически подключена плата:
Можно проверить правильность выбора и соединений нажав на пункт «Tools» > «Get Board Info» при подключённой и работающей плате:
При правильном подключении и корректной установке будет показана информация о плате в виде названия, VID, PID и серийного номера:
Первая программа
Микроконтроллер ATmega328P на Arduino Uno поставляется с запрограммированным загрузчиком, который позволяет загружать в него новый код без использования внешнего аппаратного программатора. Плата Arduino Uno имеет возможность программного сброса. Вместо того, чтобы требовать физического нажатия кнопки сброса перед загрузкой скетча, плата Arduino/Genuino Uno разработана таким образом, чтобы можно было произвести сброс с помощью программного обеспечения, работающего на подключенном компьютере. Одна из аппаратных линий управления потоком (DTR) ATmega16U2 подключена к линии сброса ATmega328P через конденсатор на 100 нанофарад. Когда на этой линии появляется низкий уровень сигнала, происходит сброс чипа и его перезагрузка. Программное обеспечение Arduino IDE использует эту возможность, чтобы можно было загружать скетч, просто нажимая кнопку загрузки на панели инструментов интерфейса. Плата Uno содержит перемычку, которую можно обрезать, чтобы отключить программный сброс. Она помечена как «RESET-ON». Можно также обойти загрузчик и запрограммировать микроконтроллер через разъём ICSP (In-Circuit Serial Programming), установленный на плате, используя Arduino ISP или другой аналогичный внутрисхемный ISP-программатор.
Для примера будет показано как очень просто можно мигать установленным на плате светодиодом с заданным в тексте программы полупериодом в миллисекундах. Вначале текста объявляется переменная для хранения состояния светодиода. Сама программа Ардуино как правило состоит из двух основных и обязательных частей — процедур:
bool ledState; // Объявление переменной состояния светодиода // Процедура настройки запускается один раз после подачи питания или сброса: void setup() { // Настройка цифрового вывода LED_BUILTIN как выход: pinMode(LED_BUILTIN, OUTPUT); } // Бесконечный цикл loop повторяющийся снова и снова: void loop() { digitalWrite(LED_BUILTIN, ledState); // переключить встроенный светодиод delay(1000); // задержка программы на одну секунду ledState = !ledState; // изменить состояние на противоположное }
Первая процедура называется setup() и в ней происходит настройка и инициализация микроконтроллера. Вторая процедура loop() основной цикл, в котором циклически происходят все действия во время работы микроконтроллера. Обе процедуры могут быть пустыми, но они обязательно должны присутствовать, так как при их вызове происходят невидимые, скрытые от пользователя-программиста действия, необходимые для работы на платформе Ардуино. В данном случае для мигания светодиодом в процедуре setup() назначается вывод для подключения светодиода, как цифровой выход, а в процедуре loop() происходит циклическая установка на этом выходе низкого и высокого уровня с задержкой между переключениями в 1000 миллисекунд, что в итоге даёт период мигания в две секунды:
Перед загрузкой программы прямо из среды разработки, следует подключить отладочную плату к компьютеру с помощью кабеля USB:
После нажатия в левом верхнем углу кнопки со стрелкой и названием «Upload» происходит компиляция и загрузка написанного скетча, с последующим информированием об используемом для успешной работы программы, объёме оперативной и программной памяти микроконтроллера:
При успешном завершение всех операций микроконтроллер сразу же начинает выполнять программу и установленный на плате светодиод мигает с периодом в две секунды:
Тот же самый эффект наблюдается при питании платы от сетевого адаптера, без подключения кабеля к USB-порту. Светодиод мигает, а программа, загруженная в микроконтроллер будет выполнятся автономно, без связи с компьютером и возможности считывать или отправлять данные по последовательному порту:
Программы так же можно писать на чистом языке программирования «C» без использования предопределённых функций и процедур Ардуино, но рассмотренные ранее обязательные процедуры настройки и бесконечного цикла должны присутствовать во всех написанных скетчах. Рассмотренная выше простая программа мигания светодиодом будет выглядеть следующим образом:
#define LED_BUILTIN_DDR DDRB // регистр для настройки вывода #define LED_BUILTIN_PORT PORTB // порт с подключённым светодиодом #define LED_BUILTIN_BIT PB5 // конкретный вывод порта // Процедура настройки запускается один раз после подачи питания или сброса: void setup() { // Настройка цифрового вывода LED_BUILTIN как выход: LED_BUILTIN_DDR |= (1<<LED_BUILTIN_BIT); // установка бита в регистре } // Бесконечный цикл loop повторяющийся снова и снова: void loop() { LED_BUILTIN_PORT ^= (1<<LED_BUILTIN_BIT); // инвертирование состояния бита delay(1000); // задержка программы на одну секунду }
При компиляции такого варианта исполняемый код получается меньшего размера, да и сама программа будет выполнятся быстрее при прямом обращении к регистрам порта, но при этом теряется удобство написания и универсальность исходного текста для разных вариантов плат Ардуино:
Article2
Замена/Установка нового микроконтроллера
Платы Arduino, кроме использования в конечных разработках, являются в первую очередь отладочными платами для удобного процесса отладки и доработки программ, с уже подключёнными датчиками и модулями. Arduino UNO выделяется тем, что имеет DIP-панельку для установки микроконтроллера, который после отладки в случае необходимости можно перенести на готовое устройство, а на отладочную плату установить новый микроконтроллер и дальше работать уже с ним. Но при установке нового микроконтроллера, он не будет работать и взаимодействовать со средой Arduino по USB-подключению. Для того, что бы можно было загружать скетчи по USB, в микроконтроллере должна быть записана программа-загрузчик bootloader, которая может программировать микроконтроллер по UART-интерфейсу. В среде разработки имеется возможность записать bootloader в чистый микроконтроллер, но при обычном подключении платы через USB-кабель это не сработает и будет выдана ошибка:
Для того, что бы записать загрузчик и установить необходимые надстроечные FUSE-биты можно использовать любой ICSP-программатор внутрисхемного программирования. Подойдёт даже самодельный пассивный COM-ISP программатор, схема и возможность добавления в среду Arduino IDE которого описаны в ранней статье «Arduino Pro Mini и UniProf». Программатор подключается к плате UNO через шести-контактный ICSP-разъём, находящийся возле светодиода индикатора питания. При этом если на программаторе предусмотрено наличие питания для программируемого микроконтроллера, то нет надобности подключать USB-кабель или дополнительное питание и микроконтроллер будет питаться от программатора:
В среде разработки на вкладке «Tools» > «Programmer» нужно выбрать используемый программатор и на этой же вкладке «Tools» > «Port» указать порт, к которому он подключён:
После завершения этих действий можно записать bootloader. При этом всё так же должна быть выбрана плата «Arduino/Genuino Uno» а на вкладке «Tools» нужно нажать на пункт «Burn Bootloader»:
После этого начнётся процесс записи программы-загрузчика в память микроконтроллера и будут установлены необходимые для корректное работы FUSE-биты. В строке состояния можно видеть текущую задачу, а по завершении будет показано уведомление об успешной записи bootloader-а:
Запустив программу UniProf и прочитав значения установочных ячеек, можно видеть запрограммированные FUSE и LOCK-биты:
После этого новый микроконтроллер можно использовать в составе отладочной платы Arduino UNO и программировать его через USB-интерфейс, одним нажатием, прямо из среды Arduino IDE.
Заключение-сравнение
Для подведения итога и лучшего понимания стоит ли приобретать отладочную плату в Китае было произведено сравнение оригинальной, приобретённой и дешёвой подделки. Между рассматриваемой в данной статье и оригинальной платой существенных различий нет. С верхней стороны видно, что расположение и обозначение радиоэлементов совпадает, немного отличается маркировка и цвет самой платы, а самое главное отличие это разъёмы GPIO и качество монтажа:
На подлинной итальянской плате GPIO-разъёмы с каждой стороны представляет из себя единое целое без разрывов, и маркировка выводов кроме платы продублирована и на самих разъёмах:
С нижней стороны разница в расцветке и маркировке платы более заметна и ярко выражена. На купленной плате заметны так же следы пайки и остатки флюса:
В Китае кроме схожих с оригинальными и полностью совместимыми с платформой Arduino, по очень низкой цене встречаются разнообразные клоны и подделки. Основное их отличие от оригинальной и рассматриваемой здесь платы является отсутствие второго микроконтроллера преобразователя интерфейса, и его роль выполняет микросхема CH340, что иногда требует установку в операционную систему дополнительных драйверов. Второе главное отличие это отсутствие DIP-панельки для основного микроконтроллера и его использование в корпусе поверхностного монтажа. Это сводит на нет основное достоинство большой по размерам платы Arduino UNO с возможностью изъятия и замены микроконтроллера:
Самым близким родственником платы Arduino UNO по сходству и функционалу является плата Arduino Nano. Она так же имеет стабилизатор напряжения питания и может программироваться по USB. Основные отличия заключаются в размерах самих плат, в типе корпуса установленного микроконтроллера, в типе USB-разъёма и разъёмов GPIO. Плата Ардуино Нано имеет гораздо меньшие габариты и может пригодиться там, где важен конечный размер устройства. В связи с меньшими размерами разъём для подключения к компьютеру установлен USB Mini-B. Разъёмы GPIO так же имеют тип «папа» и установлены в виде ряда штырьков в отличие от разъёмов типа «мама» на плате UNO. Так же из за меньшего размера на плате Nano установлен микроконтроллер поверхностного монтажа с двумя дополнительными аналоговыми входами, но отсутствует возможность его быстрой замены путём вытаскивания из панельки. На плате Nano нет в наличии стабилизатора напряжения на 3,3 Вольт:
Из всего этого можно сделать вывод, что отладочная плата Arduino UNO хорошо подходит для новичков в микроконтроллерах и начинающих «Ардуинщиков». Она имеет приемлемые размеры для удобного использования и не настолько мала, что бы не разобрать что к чему. Смело можно покупать плату в Китае и она будет работоспособной и полностью совместимой с платформой Arduino. Лучше сразу покупать полные аналоги подлинной платы с основным микроконтроллером в DIP-корпусе и с преобразователем интерфейса на контроллере ATmega16U2. Более продвинутые и опытные радиолюбители могут сами собрать Ардуино-подобную отладочную плату по схеме с официального сайта проекта www.arduino.cc
Смотрите так же связанные с Ардуино статьи:
- Отладочная плата с микроконтроллером ATmega328
- Arduino Pro Mini и UniProf
- Считыватель бесконтактных карт радио-меток RFID RC522
- Автономный светодиодный прожектор на Arduino