Знакомство с Arduino

Быстрое знакомство с микроконтроллером ATmega в обертке Arduino. Техническая информация Arduino Uno.

Если покопать Интернет на тему управления устройствами с помощью компьютера, то очень быстро находится масса ссылок на Arduino, хотя, если посмотреть подробнее, это не совсем прибор для сопряжения компьютеров с электродвигателями, но вполне может стать и им, если стоит такая задача. На его основе относительно просто сделать то, что вам нужно, т.к. для него существует масса готовых модулей, в т.ч. для управления электродвигателями. Область его применения ограничена только фантазией. Хотя сам по себе продукт построен на единственной микросхеме (микроконтроллере), которая появилась задолго до него (1996 и 2005 годы соответственно).
Микроконтроллер (МК) - однокристальный компьютер, имеющий процессор, память (в т.ч. энергонезависимую) и интерфейсы для ввода и вывода.
Arduino - очень популярный продукт на базе 8-битных МК ATmega типа AVR фирмы Atmel. В принципе, Arduino - это печатная плата (точнее, несколько разных модификаций) с общеизвестными стандартными габаритами и расположением выводов микроконтроллера, а некоторые модели так же имеют элементы контроля напряжения питания и USB интерфейс, используемый одновременно и для питания и для связи с контроллером через последовательное соединение (USB-serial). Т.е. по сути Arduino внешне является просто оберткой для МК ATmega, предоставляя стандартный формфактор, облегчающий физическое подключение дополнительных модулей, сделанных по тому же стандарту (Arduino shields). Кроме этого удобства физического подключения, очень облегчает работу с Arduino (в отличии от работы к МК напрямую) наличие готового открытого ПО для программирования контроллера - среды для разработки со встроенным компилятором и загрузчиком кода в МК, а так же набора библиотек, облегчающих написание некоторых операций. Специальный загрузчик, заранее записанный в память МК, обеспечивает загрузку и выполнение загруженного кода (т.н. скетчей, как называют программы в терминах Arduino), так что пользователю не нужно задумываться, как загружается и стартует его код. Достаточно написать скетч в среде разработки и нажать кнопку загрузки - код загрузится в память МК и запустится сразу, а так же будет стартовать автоматически при перезагрузке МК.
Использовать МК ATmega без Arduino конечно можно, а для электронщика, даже любителя, достаточно просто, но для начинающего или вовсе не электронщика, это будет связано с целым рядом сложностей, которые Arduino сводит к минимуму. Хотя, свои минусы Arduino тоже добавляет, но их немного и для большинства применений они не имеют значения. Минусами (для Arduino UNO/Mega) я бы назвал: относительно высокое энергопотребление (основную часть потребляет не микроконтроллер, а элементы регулировки питания) и автоматическую перезагрузку МК при подключении терминала через USB-serial интерфейс (решается различными способами, программными и аппаратными).
Первым я приобрел Arduino Uno - пожалуй, самую популярную модель Arduino, снабженную USB портом и входом для внешнего питания, на базе МК ATmega328. Для этой модели (и еще для Arduino Mega 2560) существует большое количество готовых для подключения (без паяльника) модулей и с ней удобно экспериментировать, подключая и отключая эти модули.

Внешний вид Arduino Uno R3



Чтобы увидеть, насколько Arduino является «оберткой» МК ATmega, можно изучить схему выводов ATmega328 в исполнении 28DIP и соотнести их описание с выводами Arduino.



Почти все выводы МК напрямую соединены с выводами Arduino. При чем некоторые выводы одновременно и доступны для подключения и задействованы во внутренней схеме, например D0 и D1 одновременно являются RX и TX последовательного интерфейса, подключенного к USB-serial контроллеру, реализованному на отдельном МК ATmega16U (этот МК обслуживает только USB интерфейс и не имеет отношения к функционированию «основного» МК).

У Arduino Uno имеется USB интерфейс, который используются как для питания (5В), так и для связи с компьютером, при этом на компьютере он распознается как асинхронный последовательный (COM) порт. Со стороны МК связь с компьютером так же выглядит как обмен данными через последовательный порт.
Так же имеется вход для внешнего питания 7-12В. Хотя у меня плата работала и с напряжением 6В (предельные значения 6-20В), все же лучше использовать источник питания в рекомендуемом диапазоне 7-12В. Регулятор напряжения всегда будет выводить напряжение на 5В - рабочее напряжение Arduino Uno. Arduino автоматически переключает питание между USB портом и внешним источником питания, делая выбор в пользу внешнего, если он дает напряжение более 6,6В.
В принципе, сам МК ATmega328 может работать и на пониженном напряжении (3.3В), но только на пониженной частоте (8МГц), а на Arduino Uno частота задается внешним источником частоты в 16МГц. Интересно, что внутри самого МК есть внутренний источник частоты 8МГц, который на Arduino Uno не задействован.

Подробнее о выводах. Для начала, о наиболее бесполезных :)

ISCP для USB интерфейса предназначен для программирования контроллера USB интерфейса и примеры его использования мне неизвестны.

ISCP для «основного» МК используется для работы с программатором, через который можно совершать операции, недоступные через обычный последовательный интерфейс - запись загрузчика и изменение фьюзов (fuses), изменяющих поведение МК.

Выводы МК делятся (в каком-то роде условно) на цифровые (D0-D13) и аналоговые (A0-A5), хотя при написании программ используется «сквозная» нумерация выводов, т.е. вывод 13 = D13, а 14 = A0, 15 = A1 и т.д.
Цифровые выводы могут использоваться и как входы и как выходы (режим входа или выхода задается в программе), аналоговые используются как входы, с разрешением АЦП 10 бит (0-1023) и пределом измерений 5В относительно земли или вывода AREF.

Выводы D0, D2 используются для передачи данных через асинхронный последовательный порт и подключены к USB-serial контроллеру. Внимание - эти выводы нельзя подключать напрямую к порту RS323! Эти выводы используют последовательный интерфейс ТТЛ, который несовместим с RS232 и требует преобразования.

Выводы D2, D3 могут использоваться для вызова внешних прерываний.

Выводы D3, D5, D6, D9, D10, и D11 связаны с внутренними счетчиками-таймерами МК и могут использоваться для вывода ШИМ-сигнала (Широтно-импульсная модуляция, PWM) и в качестве счетчиков внешних импульсов.

Выводы D10-D13 могут использоваться для работы с внешними устройствами по протоколу SPI, при чем D10 (SS) используется в случае, если МК является ведомым (slave).

Вывод D13 подключен к светодиоду «L» на плате, что никак не влияет на его использование, но может быть полезным для индикации чего-либо.

Два вывода I2C в верхнем (или «длинном») ряду - дублируют A4 и A5. Они могут использоваться для работы с внешними устройствами по протоколу I2C, что является дополнительной функцией A4, A5.

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

Выводы GND, 5V, 3V3 - земля и регулируемое напряжение 5В, 3,3В

Вывод IOREF - выдает рабочее напряжение, т.е. 5В для Arduino Uno.


Таким образом, возможности ввода-вывода достаточно разнообразные. Через аналоговые входы можно измерять напряжение сигнала (можно даже сделать осциллограф, но частота измерений будет ограничена скоростью процессора), для цифровых входов-выходов можно как считывать, так и выставлять состояние, в т.ч. генерировать ШИМ сигнал (обычно используется для управления двигателями или генерирования звука), а через целый ряд интерфейсов можно общаться с внешними устройствами: однопроводная шина на базе любого цифрового вывода, асинхронный последовательный порт, I2C, SPI.
При чем I2C и SPI позволяют одновременно подключать множество устройств на одну шину.

Большинство сенсоров для Arduino подключаются с помощью аналоговых входов, однопроводной шины или I2C.
Через SPI обычно работают устройства, требующие большой скорости передачи данных (Ethernet shield, WiFi shield).

Очень полезно для экспериментов иметь Sensor shield - плату с удобным дублированием всех выводов вместе с землей и питанием для подключения внешних устройств. Так же очень удобна макетная плата для быстрого подключения устройств и пассивных компонентов без пайки.

Нельзя превышать допустимые величины силы тока!
Ток на любом отдельном выводе не должен превышать 40 мА.
Ток на любой группе выводов (D0-D4, D5-D13, A0-A5) не должен превышать 100 мА.
Ток на всем МК не должен превышать 200 мА.