Как собрать Arduino прямо на макетной плате

25 января 2017

После знакомства с Arduino вы могли заметить, что в некоторых аспектах это устройство не очень-то удобно. Лично у меня провода между Arduino и макетной платой постоянно отваливаются, да и места эта конструкция занимает многовато. К счастью, микроконтроллер ATmega328P, на базе которого работает Arduino Uno, можно легко извлечь из устройства. Нужно только воткнуть под него пинцет сначала с одной стороны, а затем с другой. Учитывая, что помимо ATmega328P в Arduino Uno не так уж много компонентов, интересно, удастся ли нам собрать свою Arduino прямо на макетке?

Fun fact! Аналогичную заметку про STM32 ищите здесь — Используем STM32 безо всяких отладочных плат.

Использование запрограммированного ATmega328P

Зальем в микроконтроллер программу Blink и извлечем его описанным выше способом. Только запомните, как стоял микроконтроллер в вашей Arduino на случай, если захотите потом вставить его обратно. На моей Arduino Uno микроконтроллер стоит головой вниз от USB разъема и кнопки Reset. Хотя интуитивно я бы вставлял его с точностью до наоборот.

В сети не сложно найти объяснение, какие пины ATmega328P каким входам и выходам Arduino соответствуют:

Соответствие пинов ATmega328P входам и выходам Arduino

Выглядит не сложно. Сайт же производителя говорит нам, что микроконтроллер рассчитан на работу при напряжении от 1.8 до 5.5 В. Похоже, теперь мы знаем все, что нужно.

Итак, пошаговая инструкция по сборке Arduino на макетной плате:

  1. Подключаем конденсатор на 100 мкФ в качестве сглаживающего фильтра. Если вы можете использовать от 7.5 до 9 В, вместо него лучше использовать стабилизатор напряжения LM7805. Как он подключается ранее рассказывалось в посте Интегральные схемы: чипы стандартной логики 74xx. Также можно добавить светодиод для индикации, что напряжение подано. В общем, обычная подготовка.
  2. Пин 1 — это Reset. Его подключаем через резистор на 10 кОм к плюсу, а через кнопку — к минусу. Если же кнопка Reset вам не нужна, можно подключить напрямую к плюсу.
  3. Пин 7 (VCC) подключаем к плюсу, пины 8 и 22 (GND) — к земле. Пины 20 (AVCC) и 21 (AREF) подключаем к плюсу.
  4. Между пинами 9 и 10 ставится кварцевый резонатор на 16 МГц. Подобно резистору, его все равно, как подключать. Затем сами пины подключаются к земле через конденсаторы на 22 пФ.
  5. Опционально: так как в микроконтроллер сейчас залита программа Blink, к пину 19 (в Arduino это цифровой пин 13) можно подключить светодиод, который через резистор на 220 Ом идет к земле.

Если все было сделано правильно, после включения цепи вы увидите, как микроконтроллер мигает светодиодом. Но это только пол дела. Сейчас, чтобы запрограммировать чип, нам придется вставлять его обратно в Arduino, запрограммировать, затем извлечь и вставить обратно в макетку. Спрашивается, а нельзя ли как-то поудобнее?

Программирование микроконтроллера без Arduino

Оказывается, что можно. Для этого нам понадобится преобразователь USB-UART на базе чипа FT232. Они бывают разные. Для нас главное, чтобы устройство имело выходы VCC, GND, TXD и RXD, остальные не потребуются. Лично я использовал самое простое устройство ценой менее 9$. Если у вас такого преобразователя нет и вы не хотите ждать его доставки, можно обойтись и без него. На мой взгляд, альтернативный способ сильно менее удобен. Ему далее будет посвящен отдельный параграф.

Примечание: Существуют аналогичные преобразователи на базе чипов CP2102, PL2303 и CH340.

Итак, питание для цепи можно подавать прямо от USB — надеюсь, что такое VCC и GND к этому моменту вы уже знаете. На моем FT232 есть перемычка, позволяющая выбирать напряжение — 3.3 В или 5 В. Проверьте, что у вас выбрано нужное вам напряжение. Затем пин 2 (RX) микроконтроллера подключаете к пину TX вашего FT232, а пин 3 (TX) — соответственно к пину RX преобразователя. Почти готово, но так просто залить новую программу не получится:

avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00

Чтобы все заработало, нужно нажатием соответствующей кнопки сделать микроконтроллеру Reset и в течение одной секунды нажать Ctr+U в Arduino IDE, выполнить make upload или как вы там вызываете avrdude. Связано это с тем, что сразу после перезапуска ATmega328P управление получает специальная программа-бутлоадер, которая ждет данных по UART. Если они поступают в течение одной секунды, то во flash-память микроконтроллера заливается новая прошивка. Если нет, то управление передается той прошивке, что уже есть.

Окончательный вид самопальной Arduino:

Самопальная Arduino на макетной плате

К сожалению, описанные выше шаги не будут работать, если вы просто купите ATmega328P без Arduino. Дело в том, что в нем почти наверняка не будет записано никакого бутлоадера. Его можно записать прямо в Arduino IDE, но для этого нужно специальное устройство, программатор. Что делать, если его нет?

Загрузка бутлоадера

Как ни странно, но можно воспользоваться Arduino. Отсоединяем FT232, а затем подсоединяем Arduino к микроконтроллеру таким образом:

ArduinoISP - использование Arduino как программатора

Здесь подключено питание, цифровой пин 10 идет на пин 1 (Reset) ATmega328P, цифровые пины 11, 12 и 13 идут на те же самые пины микроконтроллера, физически это пины 17, 18 и 19. В Arduino IDE жмем File → Examples → 11. ArduinoISP → ArduinoISP, жмем Upload. Только что вы превратили вашу Arduino в программатор. Затем выбираем Tools → Programmer → Arduino as ISP и, наконец, говорим Tools → Burn Bootloader.

Arduino IDE может показать вам такую ошибку:

avrdude: WARNING: invalid value for unused bits in fuse "efuse",
  should be set to 1 according to datasheet
This behaviour is deprecated and will result in an error in
  future version
You probably want to use 0xfd instead of 0x05 (double check
  with your datasheet first)

На самом деле, это всего лишь предупреждение, а не ошибка. Теперь можно отключить Arduino и попытаться загрузить на микроконтроллер программу Blink. Поздравляю, бутлоадер загружен!

Как обойтись без FT232

Выше я обещал рассказать, как можно обойтись без FT232. Оказывается, что на самой Arduino уже есть все необходимое, а именно — еще один микроконтроллер ATmega16U2, с прошивкой, делающей из него USB-AURT преобразователь.

Пример использования Arduino в качестве преобразователя USB-UART:

Arduino в качестве преобразователя USB-UART

Микроконтроллер из платы следует извлечь. Питание подключается как обычно. Выходы Reset, RX и TX подключаются к соответствующим пинам ATmega328P (номер 1, 2 и 3 соответственно). Заметьте, что здесь RX подключается к RX, а TX — к TX, а не наоборот, как при использовании FT232. Итак, подключаем к USB и используем, как обычную Arduino.

Заключение

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

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

А вы программируете Atmega328P прямо на макетной плате или все же предпочитаете использовать Arduino?

Дополнение: Если же вы хотите собрать не Arduino Uno, а Arduino Leonardo, это делается не намного сложнее. Даташит используемого в нем микроконтроллера ATmega32U4 можно найти, например, здесь [PDF], а соответствие между пинами микроконтроллера и пинами Arduino — здесь. Пины, помеченные в даташите, как UVcc и VBus, подключаются к плюсу, UGnd — к минусу, UCap — к минусу через конденсатор на 1 мкФ, а помеченные D- и D+ — к соответствующим пинам USB-разъема. Все остальное — по аналогии с ATmega328P.

Метки: , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.