Arduino: Сами соберем плату


Ник Вейч

          Устали нечаянно палить платы Arduino? Ник Вейч решает собрать свою собственную и обнаруживает, что это проще, чем он думал.

          На этом уроке мы уйдем немного в сторону от обычных статей, в которых мы собирали схемы из компонентов, и соберем собственную плату Arduino. Эта идея пришла мне в голову, когда я вывел из строя загрузчики на нескольких схемах и понадобилось перепрограммировать их, превратив Arduino в программатор.
          Вообще-то собрать схему заново проще, чем перепрограммировать микроконтроллеры, но вам стоит получить хорошие практические навыки, сделав это самим.

Зачем собирать самим?

          Типичный ответ - потому что это дешевле. Это справедливо, если у вас много запасных компонентов и свободного времени; но, правду говоря, готовые платы Arduino не так дороги. Итак, зачем?

          Помните: свобода свободного ПО не в том, что оно бесплатно, а в том, что его можно изменить. Есть масса причин, по которым вы можете захотеть собрать собственную плату Arduino - может, вам нужны встроенные часы, или дополнительная память EEPR0M, или какая-то другая схема с несколькими транзисторами или реле на плате.

          По сути, все, что можно сделать с платами-расширениями Arduino [Arduino shields], можно сделать и на самом Arduino. Если немного похитрить, можно сделать схему Arduino-совместимой до степени совместимости с другими расширениями.

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

          Если вам нужна только запасная Arduino, вас вполне осчастливит сборка компонентов на макете - так с ними определенно проще экспериментировать.

          Первое, о чем нужно подумать - источник питания. Если от него не будет запитываться слишком много устройств, можно избежать USB (в зависимости от того, что будет подключаться, доступный ток может составлять всего несколько сотен мА - этого не хватит для удивительной системы автоматического освещения, которую вы планируете); кроме того, можно не беспокоиться о подключениях по USB.

          Схему, безусловно, можно запитать напрямую от батареек. Микросхемы ATmega168/328 имеют допуск по входному напряжению от 2,7 до 6 В. Последовательно соединив четыре элемента АА, вы получите напряжение от 4,8 до 6 В (заряжаемые аккумуляторы обычно имеют напряжение 1,2 В, а не 1,5 В), которое прекрасно подходит для большинства ситуаций, но кое-чего следует опасаться:

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

  • Недостаточное питание микросхемы способно привести к неожиданным последствиям. Она может все еще работать с напряжением 3 В, но не с той же самой скоростью, что может вызывать разнообразные проблемы.

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

  • Хотя микросхемы ATmega/Arduino способны нормально работать с такими напряжениями, могут отказать другие компоненты. Многие устройства, особенно интегральные схемы, ожидают стабильного известного напряжения.


Источника питания на основе L7805 вполне достаточно
для вашей схемы, и он не займет слишком много места.

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

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

          Для сглаживания и буферизации входного сигнала им также потребуются внешние конденсаторы - их параметры будут приведены в инструкции производителя, но не стоит привязываться к значениям: для наших целей для работы с L7805 прекрасно подойдут конденсаторы емкостью 100 мкФ, и сгодятся любые конденсаторы от 22 до 470 мкФ.

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

          Регулятор снизит входное напряжение на пару вольт, поэтому лучше всего воспользоваться блоком питания от бытовой сети на 7,5 В, хотя прекрасно подойдут и другие с напряжением до 12 В. Впрочем, лишние вольты переходят в тепло, поэтому учтите - преобразование 12 В в 5 В может потребовать теплоотвода.

     Что нам надо?
  • Arduino или программатор ISP, такой как USBTiny.
  • Запасной процессор ATmega168 или 328р.
  • Кварцевый генератор с частотой 16 МГц.
  • Регулятор напряжения 7805.
  • Конденсаторы необходимой емкости и дополнительные светодиоды.

Микросхемы и компоненты

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

          Иногда вам встретятся микросхемы со внутренним генератором, которому не нужны добавочные конденсаторы. Основная причина - они дешевле и работают не хуже. Они и вправду работают не хуже, но, согласно разным источникам, сильной экономии не получится, даже если покупать их сотнями. Зато они занимают меньше места на плате, если это имеет для вас значение. В любом случае, между выводами 9 и 10 ATmega168/328 нужно подключить осциллятор или кварцевый генератор и конденсаторы.

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

          Микроконтроллер сбрасывается, когда сигнал на этой линии переходит в «ноль», т.е. соединяется с землей.


Макет с микроконтроллером ATmega и дополнительными компонентами,
необходимыми для превращения его в Arduino.

          Даже если мы не навесим здесь кнопку, нужно добавить повышающий резистор, чтобы значение на выводе не «плавало» и не приводило к случайным сбросам.

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

          Хотите верьте, хотите нет, но теперь достаточно лишь заставить ATmega работать, и наш Arduino почти готов. Чтобы он стал более узнаваем и, что более важно, допускал проверку, добавим несколько светодиодов.

          В стандартном Arduino на цифровом выводе 13 есть светодиод, который очень часто используется в схемах-примерах, в том числе в простейшей - «Мигание [Blink]»; с ее помощью также легко определить, работает Arduino или нет.

          Цифровой вывод 13 с корпуса Arduino уходит на вывод 19 самой микросхемы, поэтому в обычном случае мы могли бы подключить туда светодиод и токоограничивающий резистор около 270 Ом. Однако у немногих выводов микросхемы ATmega есть только одно назначение. У вывода 19 их тоже два - он выступает как последовательная линия синхросигнала при «программировании в системе [In System programming - ISp]». Этим мы наверняка воспользуемся, поэтому нужно убедиться, что наш светодиод не помешает нам. При повышении сопротивления токоограничивающего резистора до 1...47 кОм большинство светодиодов все еще должны гореть, к тому же отвод тока будет не настолько велик, чтобы повлиять на сигналы для программирования схемы.

Программирование ATmega168/328

          Теперь у нас есть нечто вроде Arduino, и осталось разобраться с тем, как мы будем его программировать. Тут есть три варианта. У настоящего Arduino есть последовательный USB-интерфейс. Это очень удобно, но трудно реализуется на макете или на печатной плате, если вы вздумаете ее изготовить, так как интерфейсные микросхемы очень сложно паять вручную.


На макете нельзя воссоздать разъем ISP, но гораздо проще
расположить нужные контакты в ряд, чтобы затем напрямую
соединить их с 6-контактным разъемом кабеля.

          Можете воспользоваться переходной платой от таких производителей, как Adafruit (www.adafruit.com) со схемой последовательного интерфейса и USB-разъемом на небольшой плате, которую удобно подключить на макет или к стандартному разъему.

          Второй вариант - воспользоваться программатором, предназначенным для работыс интерфейсом ISP. Существует несколько моделей, но, пожалуй, лучшая из них - USBTiny (опять же, разработанная Adafruit и широко распространенная). Этот программатор прост, недорог, его легко подключить к компьютеру, и он поддерживает различные устройства Atmel, а не только отдельные микросхемы, используемые в Arduino.

          Третий вариант - программировать Arduino с помощью самого Arduino. Это может показаться странным, пока вы не поймете, что все эти программаторы «определенного назначения» по сути представляют собой тот же Arduino, разве что используют более простые микроконтроллеры. (См. врезку «Программатор Arduino».)

          В первом варианте можно воспользоваться ПО для Arduino как обычно; во втором и третьем варианте придется войти в мир командной строки и AVRdude.

          На самом деле AVRdude используется самой средой разработки Arduino. Каждый раз при нажатии кнопки Upload (Загрузить) в редакторе Arduino происходят следующие действия:

  • Файл «примера» преобразуется в стандартный код на С с включением библиотеки 'Wiring' и необходимых заголовков функций.
  • Затем этот файл компилируется avr-gcc, компилятором Gnu для микропроцессора AVR.
  • Скомпилированный файл линкуется, и создается стандартный файл ELF.
  • Файл ELF преобразуется в формат 'Intel Hex'. Файл в шестнадцатеричном формате оправляется в микросхему через AVRdude.


Специальный программатор вроде USBTiny - прекрасное вложение средств, если вы займетесь этим серьезно.

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

Подробный режим

          Если при нажатии кнопки Verify (Проверить) в IDE удерживать клавишу Shift, программа переключится в подробный режим, и на нижней панели будут появляться сообщения о происходящем.

          Среди них будет информация о расположении временного шестнадцатеричного файла, скомпилированного из вашей программы - потому что в процессе проверки на самом деле выполняются все этапы сборки, кроме последнего: загрузки прошивки в схему. Файл будет сохранен в каталоге для временных файлов, обычно где-то в /tmp - более подробную информацию см. во врезке «Шаг за шагом».

          Получив шестнадцатеричный файл, можно загрузить его в схему с помощью AVRdude. Если у вас есть переходная плата для USB или вы хотите, чтобы схема была Arduino-совместимой, также неплохо установить загрузчик. Оно всяко не повредит - немного места загрузчик отнимет, но позволит легко обменять микросхему с настоящим Arduino.

          Прежде всего убедимся, что AVRdude работает и видит программатор и микросхему. Для этого нужно передать ему два параметра. Первый - название микросхемы, которую мы хотим запрограммировать. Программа поддерживает большой набор микроконтроллеров, но для Arduino вы скорее всего будете использовать m168 и m328p. Программатор - та программа, с помощью которой информация записывается в микросхему - например, пример, usbtiny, arduino или любая другая, которая у вас есть (информацию о поддерживаемых устройствах см. на сайте AVR-dude - http://savannah.nongnu.org/projects/avrdude).
$ avrdude -p m168 -с usbtiny

          На экране должно появиться сообщение на несколько строк, что устройство готово. Если возникнет ошибка «устройство не найдено», скорее всего дело в правах доступа (попробуйте снова запустить команду от имени root). Ошибка «инициализация завершена неудачно» означает, что программатор работает нормально, но не может найти микросхему, которую нужно запрограммировать - проверьте подключение и расположение кабелей.

          Загрузчики для различных микросхем, используемых в Arduino, хранятся в вашей системе вместе с ПО Arduino. В зависимости от используемого дистрибутива, они будут находиться в каталоге вроде /usr/share/arduino/hardware/arduino/bootloaders. Их имена соответствуют назначению, но, на мой взгляд, слишком длинны; вы можете сделать копии с именами покороче.

          Программатор Arduino

          Ha сайте Arduino есть прекрасное руководство по использования Arduino в качестве программатора, со ссылками на соответствующие схемы.
          Запрограммировать один Arduino с помощью другого довольно просто, если загрузить его нужным ПО - а скоммутировать проводники еще проще, так как у стандартного Arduino есть разъем ISP.
          На сайте Arduino (http://arduino.cc/en/Tutorial/ArduinolSP) есть прекрасные пошаговые инструкции по программированию плат Arduino или Arduino на макете таким образом.

Энергонезависимые регистры

          Когда все заработает, можно загрузить загрузчики и приложение. Первым делом зададим значения «предохранителей» (о них особо не беспокойтесь - это набор энергонезависимых регистров, управляющих специальными возможностями микросхем ATmega, в том числе защитой загрузчика):
$ avrdude -p m168 -с usbtiny -e -u -U Iock:w:0x3f:m -U
efuse:w:0x00:m -U hfuse:w:0xDD:m -U lfuse:w:0xFF:m

          Параметр стирает информацию в микросхеме, а параметр -u позволяет задать значения «предохранителей». За параметром -U следуют наборы значений в формате: область памяти, индикатор операции - чтение/запись или проверка, загружаемое значение или файл и формат файла. Это немного нагляднее, когда мы загружаем один файл, например, наше приложение:
$ avrdude -p m168 -с usbtiny -v -U 1lash:w:Blink.cpp.hex:i

          Также нужно загрузить загрузчик и установить блокировку его перезаписи при обновлении приложения в будущем:
$ avrdude -p m168 -с usbtiny -Vv -U flash:w:at168.hex -U
Iock:w:0x0f:m

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


Именно с помощью ПО AVRriude Arduino IDE программирует микросхемы.

     Идем дальше

          Когда схема для собственного Arduino готова, есть несколько вариантов. Очевидно, если вам нужно несколько схем, собирать их на макете - не лучший выход. Лучше собрать схему на какой-то твердой основе, а еще лучше - сделать печатную плату. В Linux есть множество прекрасных программ для создания печатных плат, а готовую плату можно либо вытравить самому (www.instructables.com/id/Sponqe-Ferric-Chloride-Method-Etch-Cir-cuit-Bo), либо воспользоваться специальным сервисом.

          Схемы самих печатных плат Arduino доступны в формате Eagle. Система проектирования CAD Eagle очень популярна среди радиолюбителей, но не бесплатна. В «бесплатной» версии ограничен размер изготавливаемых плат; впрочем, для схем Arduino его должно быть достаточно. Eagle, пожалуй, самый простой вариант - потому что с ним всегда можно изменить файлы Arduino, удалив ненужное или что-то добавив. В этом формате также доступно и множество клонов Arduino.


Файлы печатных плат Arduino доступны в формате CAD Eagle.


LFX 156, апрель 2012.