Arduino avr: Про Arduino IDE, загрузчики (bootloader), программаторы (avrdude.exe), фьюзы, HEX-файлы. В одном флаконе. Не претендуя на оригинальность.

Про Arduino IDE, загрузчики (bootloader), программаторы (avrdude.exe), фьюзы, HEX-файлы. В одном флаконе. Не претендуя на оригинальность.

РадиоКот >Статьи >

Про Arduino IDE, загрузчики (bootloader), программаторы (avrdude.exe), фьюзы, HEX-файлы. В одном флаконе. Не претендуя на оригинальность.

Про Arduino IDE, загрузчики (bootloader), программаторы (avrdude.exe), фьюзы, HEX-файлы. В одном флаконе. Не претендуя на оригинальность.

Для предметности разговора начну с картинки

Нет худа без добра (с).
Пока использовал заводские платы «Arduino UNO» и «Arduino MiniPRO», я не задумывался о том, как работает система в целом. Я просто писал код, нажимал кнопку «Вгрузить» и всё заливалось в микроконтроллер, далее МК, установленный на плате (ATmega328). В этом и заключается прелесть экосистемы «Arduino».
Сподвигла написать данный опус проблема. Никак мне удавалось залить исходную программу, далее СКЕТЧ, из Arduino IDE в нестандартный для неё МК «ATmega8L» с кварцем 8МГц стандартным способом, т.е. через USB-порт (на самом деле через преобразователь USB- UART). Это кратко. Теперь начну рассказывать, какую важную информацию я «наковырял» и как решил свою проблему.

Немного общей теории.
Для того, что бы залить (прошить, загрузить, UPLOAD) скетч в ATmega8L из Arduino IDE через USB-порт, нужен преобразователь, который преобразует информацию, передаваемую по USB-интерфейсу(каналу, дороге, линиям) в сигналы последовательного канала UART. Т.е. должны получиться определенные уровни сигналов – интерфейс (RS232, RS485) и определенные длительности сигналов (протокол).
Что бы принять информацию, поступающую в ATmega8L по UART (физически через выводы Rx, Tx) в МК должна быть ПРЕДВАРИТЕЛЬНО загружена программа, которая настраивает определенные выводы МК как Rx и Tx, и умеет обрабатывать полученную через них информацию. Эта программа называется ЗАГРУЗЧИК или по англицки BOOTLOADER.

(Отступление. ЗАГРУЗЧИКи бывают для разных интерфейсов и, соответственно, протоколов. Программа-программатор, заливающая информацию, должна соответствовать имеющемуся ЗАГРУЗЧИКу. И наоборот — прошитый ЗАГРУЗЧИК должен соответствовать управляющей программе-программатору. Грубо говоря — это «папа» и «мама» одного разъема. Очень часто для МК фирмы ATMEL «папой» является программа avrdude.exe).

Итак, посредством USBasp-платы и avrdude.exe я залил ЗАГРУЗЧИК в ATmega8L. Залитый ЗАГРУЗЧИК должен учитывать определенные физические характеристики МК. В моем случае это то, что МК работает с внешним кварцем на частоте 8МГц (в рамках данной статьи этой характеристики достаточно). Заливка ЗАГРУЗЧИКа происходит просто и жестко – как указал разработчик МК. Не залить HEX-файл (FIRMWARE) ЗАГРУЗЧИКа при минимальном количестве извилин, прямых руках, исправных деталях и правильном соединении просто невозможно.

А почему же тогда возникает проблема залить скетч? Ответ есть выше. Предварительно прошитый ЗАГРУЗЧИК должен соответствовать настройкам «программы-заливатору» (от слова «программатор») и, конечно же, преобразователю интерфейса (плате-программатору). Если идиот подключит два проводка от Rx и Tx ATmega8 к двум выводам разъема USB, то ничего не прошьется. Поэтому на платах-преобразователях останавливаться не буду. Единственно напомню, что ISP-программаторы — это программаторы «железа», которые работают на самом низком уровне и позволяют настраивать МК почти как угодно в пределах возможного.

Вот и нарисовался главный вопрос: Как определить, что имеющийся в МК ЗАГРУЗЧИК соответствует программе-программатору (в рамках данной статьи – Arduino IDE)? Если кратко – то никак!!! И не поможет вам ни осциллограф, ни анализатор. С помощью анализатора можно увидеть длительности каких-то сигналов и максимум, что можно определить – используемую ЗАГРУЗЧИКом скорость, если он будет что-нибудь выдавать по линии Tx. Но даже если скорость будет согласованная, а считанная информация читабельна, это не скажет нам ровным счетом ничего. Единственный способ подружить ЗАГРУЗЧИК в МК и «программу-заливатор» – это читать и следовать информации разработчика ЗАГРУЗЧИКа.

И вот здесь мы подходим к главному плюсу и недостатку одновременно Arduino IDE – дружелюбному интерфейсу для начинающего пользователя. Читай: скрытие всех системных настроек программы от пользователя.
Продолжаю. Итак, мы прочитали информацию от разработчика ЗАГРУЗЧИКа как прошивать его ЗАГРУЗЧИК и как потом загружать HEX-файлы в МК. НО СТОП! В Arduino IDE нет понятия «ЗАГРУЗЧИК», «HEX-файл». Здесь я вынужден прервать рассказ, вернуться к первой картинке и рассказать «с высоты птичьего полета» как устроена Arduino IDE.

1) Грубо говоря, программная платформа «Arduino IDE» предоставляет нам только убогий (для профи) и замечательный для экосистемы «Arduino» интерфейс для написания скетчев и легкой настройки (плата, порт, программатор). При нажатии кнопки «Проверить»(скетч) в дело вступает «наемный профессионал» — компилятор avr-gcc.exe, который преобразует нашу гениальную программу в вид, принимаемый программой-программатором – HEX-файл. Если скетч преобразовался (скомпилировался) и получился HEX-файл, то можно приступить ко второму шагу(смотри картинку1).

2) Запустить программу-программатор с определенными параметрами, что бы HEX-файл «скормить», например, через преобразователь USB-UART, ЗАГРУЗЧИКу МК. Из данной схемы видно, что если автор ЗАГРУЗЧИКа использует в качестве программы-программатора, например, классическую «дудку» (avrdude.exe), то нам вовсе необязательно мучится с настройками платформы «Arduino IDE», спрятанными в фиг знает каких файлах и фиг знает в каком формате. Мы можем просто написать свой bat(cmd, скрипт)-файл и запускать его как для компиляции проекта (avr-gcc.exe), так и для заливки HEX-файла в МК (avrdude.exe). А дальше процесс происходит практически на уровне железа.
3) Драйверы операционной системы преобразуют информацию так, что бы она была понятной подключенным USB-устройствам. В представленной схеме я показал два варианта:
4) 1-й вариант с USB-UART -преобразователем и МК с обязательным (5.1) ЗАГРУЗЧИКом. 2-й вариант с аппаратным USBasp-программатором и (5.2)МК (ЗАГРУЗЧИК не нужен, хотя может иметься).

Какие можно сделать выводы, глядя на представленную картинку?
1. НЕ НАДО устраивать танцы с бубном, если не происходит в Arduino IDE компиляция проекта. Заходим на сайт разработчика компилятора для требуемого МК (ATmega, ESP8266 и т.п.) и читаем, какая среда требуется для компиляции проекта, и с какими опциями надо запустить компиляцию. Часто это будет быстрее и проще, чем пытаться подружить Arduino IDE с нужным МК. Да, для этого надо обладать определенным уровнем знаний не на уровне электрика.

2. Тоже самое можно сказать и о случае, если не происходит заливка HEX-файла в МК через ЗАГРУЗЧИК. Вводим в командной строке рекомендуемую для данного ЗАГРУЗЧИКа команду и получаем результат. Если результат отрицательный, то почти сразу знаем куда «копать». Либо проблема с драйверами ОС, либо дохлая ножка Rx, либо косяк разработчика и на худой конец – проблема в ДНК пользователя.
Вроде всё, о чем я рассказал, есть в интернете, но часто для начинающего ардуинщика непонятно, нужна ли ему некая информация и как ею воспользоваться. Это как на первом курсе универа нас пичкают производными, интегралами, матрицами и у студента растет естественное чувство «А нафига нам это надо?». А потом какой-нибудь практик возьмет и покажет, как использовать для решения реальных задач эту «вышку». И наступает «дзен». Вдруг резко всё, что валялось в голове в виде ненужного хлама, раскладывается по полочкам и ты понимаешь, что стал ИНЖЕНЕРОМ.

К сожалению это не всё, что надо бы знать начинающему ардуинщику. Кое-что расскажу о ЗАГРУЗЧИКЕ (bootloader) подробней.
Что же надо знать о ЗАГРУЗЧИКе, что бы осознанно им пользоваться?
1)Размер загрузчика.
2)Область памяти, в которую он загружается.
3)Фьюзы, которые должны быть использованы с загрузчиком.
4)Скорость для UART.
5)Частоту МК, под которую рассчитан ЗАГРУЗЧИК.
6)Ну и конечно же, под какой МК рассчитан ЗАГРУЗЧИК.
7)Внешнее проявление работающего ЗАГРУЗЧИКа.
8)Критерий для запуска ЗАГРУЗЧИКА.

1) Загрузчик имеет некий размер. Есть МК, у которых мало памяти, и разместить ЗАГРУЗЧИК просто нет места. Или место есть, но не останется места для программы пользователя. Загрузчик – это все таки только программа-посредник для нашего удобства.

2) В МК ATmega Загрузчик может заливаться (условно говоря) в одну из 4х верхних областей Flash-памяти.
3) Соответственно фьюзами задаем область памяти МК, в которой находится ЗАГРУЗЧИК, что бы МК знал, с какого адреса запускать программу в МК после «Reset» или другого события.
4) В экосистеме «Arduino» используется ЗАГРУЗЧИК по UART. А для этого протокола важна скорость. Если Загрузчик настроен на одну скорость обмена информацией, а программа-программатор(avrdude.exe) на другую, то загрузки HEX-файла в память МК не произойдет.
5) МК может работать с разными тактовыми частотами. Чем ниже частота – тем меньше потребляемая мощность. Если залить ЗАГРУЗЧИК, не рассчитанный на используемую МК тактовую частоту, то как минимум будет проблема в несогласованной скорости UART. Т.е. скетч вряд ли загрузится в МК, а если ЗАГРУЗЧИК без контроля ошибок, то может загрузиться черт знает что.
6) Типов МК очень много. ЗАГРУЗЧИК для МК AVR не подходит для МК PIC. Проблемы могут возникнуть даже для одинаковых МК, но в разных корпусах.
7) Очень не мешает знать, как ведет себя загрузчик в МК без пользовательской программы. Вот получили вы посылку из Китая с Arduino ProMini и как узнать есть в ней загрузчик или нет? А если есть описание, то можно прочитать, что при подаче питания или сбросе должен 5 раз мигнуть желтый светодиод. Не мигает? Значит нет загрузчика или у вас проблемы с платой.
8) Вообще-то ЗАГРУЗЧИК может активизироваться (начать свою работу, прервав работу основной программы) не только по сигналу сброса, но любым другим способом, который реализовал разработчик, например, замыканием выв. 5 МК на землю.

А теперь переведем полученную информацию в практическую плоскость.

1) Как узнать размер ЗАГРУЗЧИКА, находящегося в МК?
Если речь о загрузчике, залитом в плату ардуино (читай в МК ATmega8/168/328), то можно прочитать с помощью программы-программатора, например, AVRDUDESS и платы-программатора USBasp, Flash-память и фьюзы BOOTSZ0 и BOOTSZ1. Открыв сохраненный HEX-файл текстовым редактором, можно увидеть в младших адресах код пользовательской программы, потом незанятую память (FF) и в самых верхних адресах памяти (см строку 225) код загрузчика с адреса 1C00 и до признака конца 01FF. Таким образом можно узнать длину загрузчика в байтах, а потом перевести в длину в словах.

 

2)Как узнать размер ЗАГРУЗЧИКА, который мы хотим разместить в МК?
Открываем в текстовом редакторе HEX-файл, в котором хранится интересующий нас загрузчик. Видим приблизительно такую куртинку

Здесь пояснения как понимать полученные цифры

3)Что будет, если залить загрузчик и неправильно выставить фьюзы BOOTSZ0 и BOOTSZ1?

Надо иметь ввиду, что не любой загрузчик способен перезаписать сам себя. Почему так? Этот вопрос выходит за рамки данной статьи. Более того, вопрос поставлен не «как перезаписать загрузчик в МК средствами платформы Arduino IDE?», а о первичной записи в новый МК загрузчика и установке конкретных фьюзов BOOTSZ0 и BOOTSZ1, предполагая, что остальные фьюзы установлены гарантированно правильно.
Итак, первый раз загрузчик всегда прошивается аппаратным программатором (ISP), поэтому выставим ли сначала фьюзы BOOTSZ0 и BOOTSZ1, а потом зальем ЗАГРУЗЧИК или наоборот, значения не имеет, так как ISP-программатор будет загружать данные по адресам, указанным в HEX-файле. Но вот потом, после Reset, ATmega8 начнет выполнение программы с адреса 000, если фьюз BOOTRST=1, независимо от BOOTSZ0 и BOOTSZ1


Из таблицы видно, что если Загрузчик разместим не с нужного адреса или неправильно установим фьюзы, то Загрузчик не запустится должным образом. Под должным образом я подразумеваю запуск нештатным способом за счет других ошибок, которые «исправляют» начальные ошибки. Например, залили в ATmega8 ЗАГРУЗЧИК длиной 510 слов с адреса E02, т.е. как фьюзы BOOTSZ1 и BOOTSZ0 не выставляй, а при сбросе ЗАГРУЗЧИК не запустится (не получит управление МК). Или прошили ЗАГРУЗЧИК размером в 1000 слов с адреса C00, но фьюзы BOOTSZ1 и BOOTSZ0 выставили в 0 и 1. Тогда при сбросе счетчик команд будет установлен в E00 и какой-то участок кода ЗАГРУЗЧИКа запустится, но такой запуск может привести к непредсказуемым результатам.

4)Что будет, если ЗАГРУЗЧИК от ATmega8 залить в ATmega328?
С одной стороны ATmega8 и ATmega328 выводно совместимы, с другой – у них разный объем памяти, а ЗАГРУЗЧИК всегда размещается в конце памяти (в старших адресах). Поэтому, если мы перекомпилируем исходник загрузчика для ATmega8 под ATmega328, то нельзя говорить о том, что мы пытаемся залить ЗАГРУЗЧИК от ATmega8 в ATmega328. Другое дело, если мы попытаемся HEX-файл с ЗАГРУЗЧИКом от ATmega8 залить в ATmega328. Здесь ответ однозначный – данные зальются вовсе не в конец памяти ATmega328, где должен располагаться ЗАГРУЗЧИК, а в область пользовательской программы и никогда штатным образом ЗАГРУЗЧИК не получит управление (не запустится).

И о результате осознания и конечном итоге.
Теперь я знаю, что ЗАГРУЗЧИК optiboot_flash_atmega8_UART0_57600_8000000L.hex из проекта MiniCore, который я хочу залить в свою ATmega8L зальется с адреса 1E00, т.е. займет сектор памяти 1FFF-1E00=1FF (512байт или 256 слов). Соответственно я должен установить (в ноль) три фьюза следующим образом: BOOTRST=0, BOOTSZ1=0 и BOOTSZ0=1 (см таблицу выше)

Залил с помощью программы AVRDUDESS и USBasp-программатора
Как я говорил выше, ЗАГРУЗЧИК и Программа-программатор – это мама и папа одного разъема. И коль я прошил ЗАГРУЗЧИК (маму), то теперь надо настроить «папу»-ArduinoIDE, которой я должен «рассказать» 1) скорость UART, 2)марку МК, 3)Частоту тактирования процессора МК (требуется для правильной компиляции, а не для загрузки), 4)Место, где лежит HEX-файл прошитого ЗАГРУЗЧИКА. Зачем? Не знаю.
Отредактируем файл boards.txt. В разных версиях ArduinoIDE он имеет разный формат!!!
1)Название платы для меню в ArduinoIDE задаётся в строке с «.name=», например: 328.name=ATmega328 или atmegang.name=Arduino NG or older

2)За выбор названия МК для меню отвечает строка вида «.menu.cpu.atmega8=», например: atmegang.menu.cpu.atmega8=ATmega8 или 8.build.mcu=atmega8
К сожалению, все параметры для всех версий ArduinoIDE описать невозможно. Поэтому я показал соответствующие разделы файла boards.txt двух версий. Думаю по образцу и подобию Вы сможете доработать свою версию ArduinoIDE под свои ЗАГРУЗЧИКИ.

Проверим теорию на практике, для чего:
1)Зальем посредством USBasp в ATmega8 (на беспаечной плате) с кварцем 16МГц штатный загрузчик из состава ArduinoIDE «ATmegaBOOT-prod-firmware-2009-11-07.hex» (размер файла 2,8кБ), загрузка с адреса 1C00. Разъемы от плат-программаторов USBasp и USB-UART от беспаечной платы отключать не буду, что бы не перепутать при подключении. Проще отсоединить/присоединить к программаторам, которые надо обязательно отсоединять. Устанавливаю фьюзы L=FF, H=C0. Отключаю USBasp, смотрю на светодиод, подаю питание. Несколько раз быстро мигнул и более не светится. Значит загрузчик работает. Теперь зальем скетч BLINK штатным способом. Подключаюсь USB-UART и светодиод начинает вести себя совсем по другому- раз в 8 сек светится. Запускаю ArduinoIDE 1.6.6.0, устанавливаю Arduino NG…, ATmega8, порт, программатор AVRISP mkII. AVRDUDE 6.0.1 выдает кучу всякой информации (у меня так настроено), скорость 19200. Скетч прошивается и сразу начинает выполняться. Т.е. провода, фьюзы, настройки выполнены правильно.
2)По такой же методике выполним заливку загрузчика optiboot_flash_atmega8_UART0_115200_16000000L.hex, переименовав в «01.hex» и положив в каталог optiboot (размер файла 1,34кБ), загрузка с адреса 1E00. Поэтому фьюзы L=FF, H=C2. После заливки загрузчика светодиод начинает мигать несколько раз в секунду. Без программаторов (только питание) не светится, т.е. загрузчик не выдает своего присутствия. Добавляю секцию в файл boards.txt
##############################################################
#поместите HEX-файл в каталог optiboot

a8_16MHz_E.name=atmega8 (16 MHz_ExtOsc_115k)
a8_16MHz_E.upload.tool=avrdude
a8_16MHz_E.upload.protocol=arduino
a8_16MHz_E.menu.cpu.atmega8.upload.maximum_size=7680
a8_16MHz_E.menu.cpu.atmega8.upload.maximum_data_size=512
a8_16MHz_E.upload.speed=115200
a8_16MHz_E.bootloader.unlock_bits=0x3F
a8_16MHz_E.bootloader.lock_bits=0x0F
a8_16MHz_E.menu.cpu.atmega8.bootloader.low_fuses=0xff
a8_16MHz_E.menu.cpu.atmega8.bootloader.high_fuses=0xc2
a8_16MHz_E.bootloader.tool=avrdude
a8_16MHz_E.bootloader.path=optiboot
a8_16MHz_E.bootloader.file=01.hex
a8_16MHz_E.build.mcu=atmega8
a8_16MHz_E.build.f_cpu=16000000L
a8_16MHz_E.build.core=arduino
a8_16MHz_E.build.variant=standard
a8_16MHz_E.build.board=AVR_NG

Прошиваю штатным способом. Светодиод при наличии USB-UART не светится. При отключении преобразователя и подаче питания начинает мигать, т.е. скетч запустился.

3)Когда попытался повторить вышеописанное для загрузчика optiboot_flash_atmega8_UART0_115200_8000000L.hex потерпел неудачу. Штатным способом скетч не заливался. После долгих танцев с бубном, на основании которых и появился данный трактат, пришел к выводу, что косяк разработчика, так как те же действия для optiboot_flash_atmega8_UART0_38400_8000000L.hex привели к загрузке скетча штатным способом. Кроме того, посмотрев файл boards.txt, нашел в нем ошибки, например:
###################
#### ATmega8/A ####
###################

8.name=ATmega8
8.upload.tool=avrdude
8.upload.protocol=arduino
8.upload.maximum_size=7680
8.upload.maximum_data_size=1024!!!!!!!!!!!!!!!! Ошибка
8.menu.clock.16MHz_external.bootloader.high_fuses=0xc4!!!!!!!!!!!!ошибка
И нет для 8МГц скорости 115200, а нерабочий HEX-файл есть. Вот и верь разработчикам.

Извините, что не могу привести отличия форматов файла boards.txt в разных версиях ArduinoIDE, так как этим вопросом не занимался. Попробовал сделать под имеющуюся версию по образцу и подобию – получилось. Глубже не «копал».

Спасибо за внимание. Буду рад, если кому-то мои исследования оказались полезными.

P.S. В последних версиях в конфигурацию (boards.txt) начали прописывать vid и pid. Видимо жаба душит итальянцев. Берегите старые версии ArduinoIDE. А то будет как с хромом – негде скачать старую версию.

P.S.2 При прошивке скетча в МК в сообщениях об ошибках ArduinoIDE, а правильнее сказать AVRDUDE, может упоминаться протокол STK500. В штатном режиме работы мы выбираем программатор AVRISP mkII. А в меню еще есть AVR ISP, Arduino ISP, Arduino as ISP. В русскоговорящем интернете я не встречал объяснения «на пальцах» зачем такое обилие типов программаторов в ArduinoIDE и главное, чем они отличаются и когда какой использовать. Поэтому чувствую себя как лох в хорошем ресторане, перед которым положили 5 ложек и 5 вилок…. И все смотрят только на меня. Кое-что я нашел на сайте microsin, но у автора есть проблема с обозначением объекта. Это как безобъектный праздник «день независимости». Независимости кого, от чего? Каждый волен понимать как хочет. И многие этим пользуются. Но в технике нужна однозначность. Попробую объяснить «на пальцах» как понял я. Если не прав, то прошу поправить.
Итак, AVRISP mkII это плата-программатор от AVR для своих микроконтроллеров серий ATtinyXX, ATmegaXX и других с последовательным (не UART ) интерфейсом ISP (4 сигнальных провода MOSI, MISO, SCK, GND) (режим последовательного программирования на основе интерфейса SPI). Интересно, зачем нужны эти два интерфейса ISP и SPI в одном программаторе? Так как обмен данными между AVRISP mkII и компьютером PC происходит через интерфейс USB, а плата-программатор AVRISP mkII построена на основе AVR-USB162, AVR-USB162MU, AVR-USB32U4 и других, то требуется прошивка для используемого МК. Firmware для программатора AVRISP mkII, распространяется свободно. Понятно, что количество типов МК растет и хотелось бы, что бы плата-программатор AVRISP mkII умел с ними работать. Соответственно надо дорабатывать прошивку AVRISP mkII. Но AVRISP mkII должен общаться не только с программируемым (целевым) МК, но и компьютером. Так вот этот набор «слов для общения» называют протоколом. И эти протоколы тоже развиваются (STK500, STK600. AVRISP mkII во многом совпадает с протоколом STK600). До сих пор вроде понятно, если вспомнить, что на плате Arduino UNO использовался преобразователь-программатор на основе ATmega8U2. Но всякое понимание улетучивается, когда вспоминаем, что платы Arduino продаются с прошитым в основной МК загрузчиком. И нет никакого ISP (MOSI, MISO, SCK, GND). Всё общение происходит по интерфейсу UART, и даже нет необходимости эмулировать сигналы ISP. Тогда при чем AVRISP mkII?
А вот если мы обратим свой взор на стартеркит STK500 (что это такое?), то увидим, что обмен между STK500 и PC происходит через интерфейс RS232 (PC COM-порт)(тот же UART, только уровни сигналов +/- 12в, а не 0-5в). При этом STK500 использует следующие настройки порта: 115.2kbps, 8 data bits, 1 stop bit, no parity. Интерфейс на выходе программатора STK500 – ISP и PP. STK500 и AVRISP поддерживают тактовые частоты ISP от 4 кГц до 1.8 МГц.
Про UART и загрузчик – ни слова. Так почему AVRISP mkII?

Файлы:
ATmega8 Addressing the Flash
распределение памяти в атмега8
ATmega8 фьюзы Заводские и как должно стать
ATmega8 зависимость частоты от напряжения питания
AVRDUDESS фьюзы
Последовательное программирование
преобразователь usb-uart
Штатный загрузчик от Ардуино
03.hex
01.hex
04.hex
FLASH память-RWW-NRWW
USBasp-atmega8A-pin
Эта статья в ворд-формате
Работа с представленными загрузчиками
проверенная Blink РАБОЧАЯ секция
проверенная Blink РАБОЧАЯ секция3
проверенная Blink РАБОЧАЯ секция1
сообщения при удачной заливке скетча новым загрузчиком на 16МГц
сообщения при удачной заливке скетча штатным загрузчиком

Все вопросы в Форум.


Как вам эта статья?

Заработало ли это устройство у вас?


Эти статьи вам тоже могут пригодиться:

Ардуино в качестве программаторов AVR контроллеров

С последней версией Arduino IDE перестал работать USBASP, с помощь которого прошивал массу контролеров.

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

Для Arduino на ATmega168/328 схема будет выглядеть так — между собой соединяем D11, D12, D13, а D10 контроллера программатора соединяем с RESET программируемого контроллера. Устанавливаем кварц для прошивки контроллеров, работающих от внешнего резонатора.

Для удобства работы собираю программатор на макетке. Для микросхем в корпусе DIP28 использую панель DIP с нулевым усилием.

Также на плате устанавливаю разъем под Arduino Pro Mini, на которых делаю все последние Arduino-проекты

Получаю такую платку

Устанавливаю на плату микроконтроллеры

Можно приступать к прошивке/

 

Для этого в Ардуину нужно записать скетч ISP-программатора

Затем выбираем тип программатора

И все. Программатор собран и настроен.

Немного о применении

  1. Загрузка скетча с 0-го адреса без загрузчика. Экономит память микроконтроллера и время загрузки. Особенно интересно в микросхемах с малой памятью — Atmega8 и различных Attiny.
  2. Установка загрузчика на «голую» Atmega328, чтобы в дальнейшем заливать в нее скетчи через RX/TX, как в обычную Ардуину.
  3. Замена загрузчика, например, на OPTIBOOT, нормально поддерживающий режимы сна и сторожевой таймер.
  4. Установка фьз-битов. Полезно при создании «батареечных проектов», когда отключается BOD — контроль входного напряжения и микроконтроллеру устанавливается режим работы с пониженной частотой, опять же для уменьшения напряжения питания до 2.8-3.3В и энергопотребления.
  5. Восстановление «мертвых» микроконтроллеров после неудачных экспериментов

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

со своего сайта.

Конструктор Bootloader`а для Arduino

Микроконтроллеры Atmega обычно программируются через интерфейс ISP (SPI),но для этого необходимо,хоть и недорогой,но всетаки программатор. Данный способ для подключения использует 5 проводов (SCK, MISO, MOSI, reset, GND).

Но используя специальный загрузчик, зашитый в нижнюю область памяти микроконтроллера  можно прошивать через последовательный порт используя выводы (RX, TX ,reset, GND) — Так прошиваются платы Arduino, на которых установлена микросхема переходник USB-RS232. Загрузчик активируется командой сброса на выводе reset микроконтроллера и ждет очень небольшой промежуток времени, если передача по последовтельному порту не началась, то управление переходит на нулевой адрес микроконтроллера, где находится основная программа.

В младших моделях м/к загрузчик занимает всего 512 байт. В Arduino Duemilanove он был 2048 байт.

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

Данный конструктор автоматически создает загрузчик для микроконтроллера , указывает фьюзы для прошивки, а так же генерирует пример блока для вставки в файл board.txt в среде Arduino IDE. Загрузчик можно создать для работы на конкретный кварц или внутренний задающий генератор(например на 8 мгц или 1 мгц). Занижение рабочей частоты ведет к понижению энергопотребления, к сожалению это уменьшает максимальную скорость загрузки.

В конструкторе используется загрузчик optiboot.

Поддерживаемые м/к: Atmega328P, Atmega168 Atmega88Atmega8Atmega16 ,Atmega32.Возможно добавление и других м/к.

Настройка Arduino IDE.

Если Вы хотите добавить среду Arduino нестандартный микроконтроллер (Atmega16 или Atmega32)  или использовать не стандартный кварц (не на 16 мгц)., то необходимо в файл boards.txt ,который находится в папке arduino\hardware\arduino/ добавить дополнительную секцию, которую создаст конструктор.

Для Atmega16 и Atmega32 необходима установка своего ядра — это описано в статье Добавляем поддержку не родных м/к в среду Arduino

Конфигурация загрузчика

Для конфигурации загрузчика необходимо для начала выбрать Ваш микроконтроллер и указать задающий генератор:

Внешний кварц — Используя внешний кварц,подключаемый к выводам XTAL м/к. Так же необходима установка конденсаторов на 22pF ,подключенных на GND.

Внутренний генератор — внутренний генератор м/к ,который,в зависимости от модели м/к может работать на 1,2,4,8 мгц.При этом освобождаются выводы XTAL м/к для своих целей.

Watchdog — Внутренний неточный генератор на 256 кгц для системы Watchdog.Доступен не на всех м/к.

Загрузчик может использовать программный  последовательный порт,который может назначен на другие выводы м/к (В стадии тестирования). Обратите внимание, что при некоторых частотах программный UART включается принудительно.

На низких частотах, например с использованием Watchdog, возможны с проблемы с загрузкой прошивки, если у вас нет хорошего программатора( который умеет понижать частоту), то использовать низкую частоту не рекомендую !! Понижение частоты возможно на программаторе USBasp с avrdude с ключем -B

 

Установка загрузчика 

После того, как Вы выберете необходимые опции и нажмете создать HEX  конструктор выдаст команды для прошивки через утилиту avrdude ,а так же ссылки на статьи , как прошить загрузчик через плату Arduino или USBasp.

Кстати,данными командами можно и не пользоватся,если вы уже добавили блок в board.txt и скопировали загрузчик в папку \hardware\arduino\bootloaders\optiboot\ а затем выбрав в меню Сервис — записать загрузчик.

 

Внимание !! Конструктор работает в тестовом режиме и необходима проверка фьюзов в калькуляторе !! При обнаружении ошибок просьба связаться с администрацией сайта , воспользовшись форумом или темой на arduino.ru

Конструктор загрузчика:

Добавляем поддержку не родных м/к в среду Arduino IDE

Добавляем поддержку не родных м/к в среду Arduino IDE

Иногда можно использовать в своих проектах умного дома более простые или слабые микроконтроллеры,где ресурсов может быть достаточно для простых операций -Такие микроконтроллеры дешевле.Кроме программирования таких микроконтроллеров в более сложной среде разработки в WinAVR или CodeVisionAVR можно использовать среду Arduino IDE,добавив их поддержку.Иногда могут пригодится микроконтроллеры с бОльшим количеством портов,например Atmega16 и Atmega32 — их так же можно программировать в Arduino.

 

Обратите внимание,что обычно микроконтроллер с завода настроен на внутренний генератор и чаще всего прошивка загрузчика переключает микроконтроллер на внеший кварц — так что Вы должны позабодиться о подключении кварца к выводам микроконтроллера(выводы XTAL) по стандартной схеме.Исключение — серия attiny и некоторые другие м/к..

Серия микроконтроллеров ATtiny

Поддерживаемые микроконтроллеры:

 attiny13,attiny2313, attiny45, attiny44,attiny85, attiny84, attiny25, attiny24, attiny4313

Цоколевка микроконтроллеров

Для программирования ATtiny 13/25/45/85 подключим его к нашему программатору согласно даташиту:

 

Примечание: У ATtiny13  нет шины i2c и имеет всего 1кб под программу.У ATtiny 25/45/85 имеется последовательный порт на выводах PB4 -RX ,PB3 — TX ,но м/к не поддерживают загрузку через его,только обмен данными.

У ATtiny 2313 и 4313 другая цоколевка,но подключается так же:

Настройка Arduino IDE для микроконтроллеров ATtiny

Для этого необходимо дописать нужные микроконтроллеры в файл boards.txt  и распаковать  архив arduino-tiny в папку  папка_arduino/hardware/arduino/ 

Последнюю версию arduino-tiny можно найти тут.

Например ,чтобы добавить в список поддерживаемых контроллеров ATtiny85 необходимо добавить следущий текст в boards.txt:

###########################################################################
attiny85.name=Optiboot ATtiny85 @ 8 MHz (internal osc)
attiny85.upload.protocol=arduino
attiny85.upload.speed=9600
#bootloader takes up last 10 pages, so there is a limit on the max size.
attiny85.upload.maximum_size=7616
attiny85.bootloader.low_fuses=0xE2
attiny85.bootloader.high_fuses=0xD7
attiny85.bootloader.extended_fuses=0xFE
attiny85.bootloader.path=optiboot
attiny85.bootloader.file=optiboot_attiny85.hex
attiny85.build.mcu=attiny85
attiny85.build.f_cpu=8000000L
attiny85.build.core=tiny
attiny85.build.variant=tinyX5
 # вариант c частотой внутренного генератора 8 мгц.
###########################################################################

Остальные примеры поддерживаемых микроконтроллеров можно посмотреть в файле Prospective Boards.txt архива arduino-tiny .

Для ATtiny13 необходимо другое ядро ,для этого распакуем архив в папку hardware\arduino\cores\core13\

 и добавляем в список boards.txt:

#############################################

attiny13.name=ATtiny13 (internal 9.6 MHz clock)
attiny13.bootloader.low_fuses=0x7a
attiny13.bootloader.high_fuses=0xff
attiny13.upload.maximum_size=1024
attiny13.build.mcu=attiny13
attiny13.build.f_cpu=9600000L
attiny13.build.core=core13
attiny13.build.variant=tiny8

###############################################

Сейчас мы можем программировать добавленные микроконтроллеры через плату Arduno или USBasp.

Другие микроконтроллеры ATmega

ATmega8 без загрузчика

Чтобы добавить м/к ATmega8 без загрузчика добавляем в boards.txt следущий текст:

###########################################################################
atmega8A.name=ATmega8A
atmega8A.bootloader.low_fuses=0xFF
atmega8A.bootloader.high_fuses=0xCF
atmega8A.bootloader.unlock_bits=0x3F
atmega8A.bootloader.lock_bits=0x0F
atmega8A.upload.maximum_size=8192
atmega8A.build.mcu=atmega8
atmega8A.build.f_cpu=16000000L
atmega8A.build.core=arduino:arduino
atmega8A.build.variant=standard

# вариант без загрузчика и частотой м/к 16 мгц.
###########################################################################

 ATmega8 имеется в списке поддерживаемых как Arduino NG or older с загрузчиком,который отнимает 1 кб ,при таком загрузчике микроконтроллер можно прошивать стандартно,установив его например в Arduino UNO.Сконфигурировать свой загрузчик на другую частоту вы можете в Конструкторе Bootloader`а.

ATmega32 ,ATmega16,ATmega1284,ATmega644,ATmega324

Для добавления данных микроконтроллеров необходимо распаковать из архива avr-netino папку hardware\avrnetio и поместить её в папку Arduiono_ide\hardware\ .Другие папки с примерами и библиотеками можно так же распаковать в соотвествующие папки при необходимости.

Расмотрим пример на  микроконтроллере ATmega32:

Микроконтроллер ATmega32 имеет 40 ножек из них 32 — это порты ввода вывода.

Расшифруем основные из них:

D — это цифровые выводы в нумерации arduino.

AI — аналоговые входы.

PWM — выводы с возможностью ШИМ.

 

Если Вы правельно скопировали папку avrnetio ,то после запуска Arduino IDE Вы увидите добавленные микроконтроллеры в общем списке.Вы можете исправить или удалить некоторые ненужные микроконтроллеры в файле hardware\avrnetio\board.txt 

Если сейчас подключить микроконтроллер к  Arduno или USBasp ,то можно уже заливать скетчи из среды Arduino IDE .

Обратите внимание,что новый м/к запрограммирован работать от внутреннего генератора и при прошивке загрузчика (через меню сервис-> записать загрузчик) поменяются фьюзы на режим от внешнего кварца.Загрузчик прошивать не обязательно,если Вы не хотите Заливать скетчи через последовательный порт.Перед прошивкой загрузчика можно поправить фьюзы в файле board.txt в строках bootloader.low_fuses и bootloader.high_fuses используя калькулятор фьзов.

Хотя avr-netino и поставляется с загрузчиками,но загрузка через последовательный порт на ATmega32 у меня не заработала.Для загрузки через его необходимо подсунуть «правельный» загрузчик в папку /hardware/avrnetio/bootloaders/optiboot/ из архива boots.zip ,заменив в файле board.txt имя файла загрузчика в строке bootloader.file соотвествующего микроконтроллера.Сконфигурировать свой загрузчик на другую частоту вы можете в Конструкторе Bootloader`а

Электронная нагрузка под управлением Arduino


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

Необходимые компоненты:

1 х Arduino NANO (или UNO, или Pro Mini)
1 х ЖК-дисплей 16×2 c i2c модулем
1 х Модуль 16-битного АЦП ADS1115
1 х Модуль 12-битного ЦАП MCP4725
2 х кнопки на замыкание без фиксации, тактовые или любые подходящие
1 х Поворотный энкодер
1 х Транзистор IRF3205
1 х Блок питания 9-12 В от старого сканера, модема и т.д.
1 х Резистор 1 Ом / 5 Вт
4 х Клеммы винтовые
1 х Разъем+штекер 2,1 х 5,5 мм
1 х Выключатель (включатель?)
Провода сечением 0,8-1,0 мм2 для силовых цепей
Любой тонкий провод для подключения кнопок, энкодера и т.д.


Помимо этого потребуется фанера для корпуса, радиатор с активным охлаждением, например кулер от процессора ПК.

Схема

Теперь о схеме. Это важно, и вам может понадобиться адаптировать её к вашим потребностям.
• Прежде всего, 12В от блока питания идут в разрыв через тумблер включения, а затем к выводу Arduino Vin и к вентилятору. Arduino имеет встроенный стабилизатор напряжения на 5В, это напряжение и будет на выводах Vcc или +5V (подписывают по-разному). По этому напряжение 12 вольт нужно подключать именно к Vin, на вход этого стабилизатора. Все модули же буду цепляться как обычно к выводам Vcc и GND. Выводы SDA и SCL (А5 и А4) от Arduino подключаются ко всем модулям, подключаемых по шине i2c (ЦАП, АЦП и LCD дисплей).
• Подключите энкодер к Vcc, GND и три его управляющих контакта к цифровым выводам Arduino D8, D9 и D10. Подключите кнопки к контактам D11 и D12. Также подключите зуммер к D3.
• О делителе напряжения. В делителе использованы резисторы 10K и 100K, однако их реальное значение может отличаться от номинала, поэтому Вам, возможно, придется подправить множитель в коде.
• Для определения тока используется шунт 1 Ом. Опять же, этот резистор вряд ли будет ровно 1 Ом, поэтому множитель также потребуется подобрать. При использовании высокоточных прецизионных резисторов такой проблемы не возникнет. Подключите выход ЦАП к затвору полевого транзистора. Load +, Load-, S + и S- — это винтовые клеммы, монтируемые на переднюю панель.
Если вы хотите, чтобы нагрузка работала на ток больше 2,1 А, Вам потребуется увеличить напряжения на затворе транзистора. ЦАП не может выдать больше пяти вольт, так что в таком случае используйте другую схему с использованием операционного усилителя, которую Вы можете видеть ниже.

Подготовьте транзистор

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

Монтаж печатной платы

На макетной плате распаяйте ардуино и модули. Для соединения адресных шин, питания 5V, модулей, энкодера и кнопок можно использовать маломощные провода. В силовой части от клемм к транзистору и шунту (крайняя правая часть схемы) необходимо использовать провода с большим сечением. Кроме того, подключите контакты ADC0 и ADC1 модуля ADS1115 к резистору 1 Ом. Провода эти должны быть как можно короче, чем длиннее эти соединения — тем большая погрешность измерения будет при включенной нагрузке.

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

Корпус

Корпус изготовлен из тонкой фанеры. На задней панели вырезается отверстие для вентилятора охлаждения радиатора. Сбоку делается отверстие для забора воздуха. Сам корпус автор обклеил самоклеящейся пленкой. Для лучшего внешнего вида отверстия закрываются декоративными панелями, напечатанными на 3D принтере. Скачать модели для печати вы сможете архивом в конце статьи.

Затем автор приклеивает 4 деревянных крепления к нижней крышке и вклеивает в них гайки М3. Передняя панель изготавливается так же, как и остальной корпус. Для ЖК-дисплея печатается специальная панель. Далее автор решает, где разместить каждый элемент, делает отверстия и устанавливает все кнопки, ЖК-дисплей, энкодер и разъемы. Передняя панель прикручивается к корпусу, и все её элементы подключаются к плате. Плату автор закрепил при помощи клея, однако лучше делать это при помощи специальных стоек.

Вентилятор устанавливается на своё место на задней панели. Для USB-разъема Arduino сбоку проделывается отверстие, чтобы была возможность обновить прошивку при необходимости с помощью USB-кабеля. Разъем основного питания 12 В расположен на задней панели. Вот и все, закройте корпус, закрутите винтами, и можно переходить к коду.

Архивом в конце статьи Вы можете скачать код. Вам так же понадобятся библиотеки для ЖК-дисплея, модулей ADS1115 и MCP4725, эти библиотеки в том же архиве. Вам также понадобится библиотека BusIO, установите ее менеджером библиотек Arduino IDE. Скомпилируйте код и загрузите его в плату, а затем протестируйте контроллер.

Настройки

Это важная часть. Видите ли, считывая данные с ADS1115, мы получаем их в битовом значении. Чтобы перейти от битовых значений (от 0 до 65000), мы используем множитель. По умолчанию это «0,185 мВ» или «0,000185 В». В коде для измерения тока мы производим дифференциальное измерение напряжения на нагрузке «1 Ом». Поскольку нагрузка составляет 1 Ом, это даст равное текущее значение, поскольку «I = V / R» и R равно 1. НО !!! Вряд ли получится найти резистор ровно на 1 Ом, поэтому в случае автора он изменил множитель на 0,0001827. Возможно, Вам придется настроить эту переменную на другие значения, пока Вы не получите хорошие показания, поэтому во время настройки одновременно измеряйте значение тока с помощью внешнего мультиметра и отрегулируйте эту переменную до отображения верных результатов.

То же самое касается и делителя напряжения. Видите ли, ADS1115 может измерять только до 5 В. Если входное напряжение будет выше — он будет поврежден. По этой причине используется делитель из резисторов 10K и 100K, что даёт значение 0.0909090. Итак, теперь множитель составляет 0,000185 / 0,0909090 = 0,002035. Снова же, так как сложно найти резисторы точно на 10K и 100K, множитель для измерения напряжения подправлен до 0,0020645. Просто сделайте то же самое, сравните напряжение на экране ЖК с показаниями внешнего мультиметра и отрегулируйте это значение до получения хороших результатов.

const float multiplier = 0.0001827;    //Multiplier used for "current" read between ADC0 and ADC1 of the ADS1115
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const float multiplier_A2 = 0.0020645;  //Multiplier for voltage read from the 10K/100K divider

Скачать библиотеки и код одним архивом Вы можете тут: eload_kod.rar [58.74 Kb] (скачиваний: 86)
Скачать файлы для печати на 3D принтере тут: stl.zip [232.08 Kb] (скачиваний: 35)

Ну а на этом всё, и всем удачи в творчестве!


Источник (Source) Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

Мультитестер на Arduino своими руками

За универсальным тестером будущее. Всего лишь при подсоединении щупов, универсальный пробник определяет сопротивление, ёмкость, ЭПС, диодную проводимость, распиновку и коэффициенты усиления транзисторов, прозванивает лампочки и светодиоды, сообщает на дисплее о повреждении электронного элемента. Работает подобный тестер автоматически, без переключения селектора или кнопок.

Для работы мультитестера нужен микроконтроллер минимум с 8 кБ флеш-памяти, такой как ATmega8, ATmega168, ATmega328.

Электрическая схема мультитестера на Arduino

Характеристики тестера электроэлементов на Arduino:

  1. Сопротивление: 0…50 МОм, точность до 0.01 Ом (на ATmega8 точность 0.1 Ом).
  2. Ёмкость: 25 пФ…100 мФ, точность 0,1 пФ.
  3. ЭПС (эквивалентное последовательное сопротивление) определяется для емкостей 90нФ…100 мФ.
  4. Биполярные транзисторы: нахождение базы, коллектора, эммитера (BCE) при проводимости NPN, PNP.
  5. Полевые транзисторы: N-канальные, P-канальные.
  6. Диоды, диодные сборки: кремниевые, германиевые, Шотки, определение анода катода.
  7. Стабилитроны: обратное напряжение пробоя менее 4,5 В.
  8. Тиристоры, семисторы: только маломощные.

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

Список комплектующих

  1. Плата Arduino nano V 3.0, можно Pro mini.
  2. LCD дисплей графический Wh2602A на контроллере HD44780. Используйте только дисплей, поддерживающий кириллицу (сообщения на русском языке на экране). Прошивки на английском языке для примененной схемы подключения и задействованных функций не существует.
  3. Стабилизатор (на схеме IC1) — прецизионный LM336-Z2.5, MCP1702-5002, можно обычный 7805L.
  4. Кнопка с фиксацией SW1.
  5. Кнопка без фиксации SW2.
  6. Резистор переменный R7 — 10 кОм, 0.5 Вт.
  7. Резисторы R1, R3, R5 — 680 Ом, 0.25 Вт.
  8. Резисторы R2, R4, R6 — 470 кОм, 0.125 Вт.
  9. Резистор R8 — 100 Ом, 0.25 Вт.
  10. Резистор R9 — 22 кОм, 0.125 Вт.
  11. Резистор R10 — 10 кОм, 0.125 Вт.
  12. Резистор R11 — 3.3 кОм, 0.125 Вт.

Подключение питания

Для точности измерений тестера рекомендуется, но не обязательно, запитать его от прецизионного стабилизатора напряжения 5.00 В, например от MCP1702-5002.

При невыполнении этого условия, в случае использования менее точного стабилизатора типа 7805, настоятельно советуем подключить источник опорного напряжения (ИОН).

Стабилизированный ИОН на 2.5 В надо подсоединять к выводу А4 микроконтроллера. На приведенной электрической схеме это подключение не показано. Благодаря подключенному ИОН, мультиметр будет более точно измерять напряжение на батарейках VBAT, наибольший положительный потенциал на полупроводниках VСС.

В программе самодиагностики микроконтроллера ATmega заложено определение отсутствия ИОН. Эта функция самодиагностики активна только при подключении ножки А4 к напряжению 5 В через резистор 47 кОм.

Можно таки случайно закоротить ножки микросхемы А4 и А5. После этого начнутся проблемы с точностью измерения VBAT и VСС. Поэтому удаляйте несанкционированные мостики между выводами, смывайте сгоревший флюс с платы.

 

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

 

При организации питания прибора от сетевого адаптера 220/9–12 В, следует позаботиться об экранировании микроконтроллера, устранить пульсации на входе с помощью конденсатора. Нельзя близко располагать, как в одной плоскости, так и сверху снизу, входные цепи питания к плате Arduino.

 

Сборка измерительной схемы

 

Правильнее будет собрать пробную схему мультитестера на беспаечной макетной плате для проверки совместимости найденного дисплея с микропроцессором Arduino, а также других комплектующих.

Встроенный светодиод на выходе D13 обязательно выпаять! Этот выход будет использоваться как источник образцового напряжения при прозвонке диодов, транзисторов, тиристоров, и нагрузка, садящая на нем напряжение, не нужна.

Подключение к аналоговым выходам Arduino:

  • A0 — «минусовой» черный щуп.
  • A1 — «плюсовой» красный щуп.
  • A2 — «прозвоночный» желтый щуп.

 

Подключение к цифровым выходам Arduino:

  • D0 — получение RX на Arduino nano или mini.
  • D1 — передача TX на Arduino nano или mini.

 

Прошивка микроконтроллера

 

Загрузить прошивку в Arduino можно как с помощью программатора USB, так и применив другой Arduino nano для перепрограммирования. Мы же воспользуемся программатором USBasp и приложением SinaProg, о чем расскажем подробно.

 

  • Скачиваем и устанавливаем на ПК приложение SinaProg 2.1.
  • В поле Programmer находим свой программатор USBasp и нажимаем кнопку Search для поиска подключенного контроллера. 
  • После определения контроллера, скачиваем Aрхив с прошивкой для мультитестера на Arduino и распаковываем. 
  • В архиве две прошивки: TransistorTester.eep для работы памяти EEPROM микроконтроллера, TransistorTester.hex непосредственно для микроконтроллера. Сначала загружаем TransistorTester.eep в память EEPROM микроконтроллера.

Иконка выбора пути к прошивке

  • Загружаем аналогично TransistorTester.hex в микроконтроллер и запускаем Program.

Об успешном завершении прошивки дается сообщение в описании процесса установки

 

  • Загружаем TransistorTester.hex в микроконтроллер, аналогично как делали ранее.

  • После удачно осуществленной прошивки, отключаем программатор.

 

Дабы не было проблем с полным отсутствием отображения на дисплее, заливать в память EEPROM следует файл с расширением HEX, а не BIN.

 

Начинать работу с тестером надо после сброса на кнопке SW2 Reset.

 

Есть куча приборов, куда можно поместить собираемый универсальный пробник: старые мультиметры, токовые клещи, большие калькуляторы, даже ночные часы.

Как пример свой мультитестер на Arduino можно засунуть в корпус испорченного модема.

Автор: Виталий Петрович. Украина


 

Avr — библиотеки Arduino

Переключить навигацию Список библиотек Arduino
  • Категории
    • Связь
    • Обработка данных
    • Хранение данных
    • Контроль устройств
    • Дисплей
    • Другое
    • Датчики
    • Сигнальный вход / выход
    • Сроки
    • Без категории
  • Типы
    • Внесено
    • Официальный
    • Партнер
    • Рекомендуем
    • На пенсии
  • Архитектура
    • apollo3
    • arc32
    • arduino_esp8266
    • рука
    • атмелавр
    • атмельсам
    • в среднем
    • esp
    • esp32
    • esp8266
    • эспрессиф
    • эспрессиф32
    • эспрессе 8266
    • fp51
    • gd32v
    • intel_arc32
    • к210
    • Linux_x86_64
    • м.кр.
    • мегаавр
    • мк64fx512
    • нбиот
    • nordicnrf51
    • nordicnrf52
    • нрф5
    • nrf51822
    • nrf52
    • nrf52832
    • nrf52_adafruit
    • рис32
    • олени
    • рфдуино
    • сэм
    • samd
    • samd1
    • samd21
    • samd_beta
    • samdlc
    • seeed_stm32f4

  • настройка ()
  • петля ()
  • если
  • если…else
  • для
  • корпус переключателя
  • пока
  • делать … пока
  • перерыв
  • продолжить
  • возврат
  • перейти
  • ; ()
  • {} ()
  • // ()
  • / * * / ()
  • #define
  • #include
  • = ()
  • + ()
  • — ()
  • * ()
  • / ()
  • % ()
  • == ()
  • ! = ()
  • <()
  • > ()
  • <= ()
  • > = ()
  • && ()
  • || ()
  • ! ()
  • *
  • и
  • и ()
  • | ()
  • ^ (исключающее ИЛИ)
  • ~ ()
  • << ()
  • >> ()
  • ++ ()
  • — ()
  • + = ()
  • — = ()
  • * = ()
  • / = ()
  • & = ()
  • | = ()

  • HIGH | НИЗКИЙ
  • INPUT | ВЫХОД | INPUT_PULLUP
  • правда | ложный
  • недействительно
  • логическое
  • знаков
  • символ без знака
  • байт
  • внутр.
  • целое без знака
  • слово
  • длинный
  • беззнаковое длинное
  • короткий
  • поплавок
  • двойной
  • строка —
  • Строка —
  • знаков ()
  • байт ()
  • внутр ()
  • слово ()
  • длинный ()
  • поплавок ()
  • статический
  • летучий
  • конст.
  • sizeof ()

  • EEPROM
  • SD
  • SPI
  • Программное обеспечение Последовательный
  • Проволока
  • Последовательный
  • Поток
Леонардо
  • Клавиатура
  • Мышь

/

  • pinMode ()
  • digitalWrite ()
  • digitalRead ()

/

  • аналог Ссылка ()
  • аналог Читать ()
  • аналог Write () — ШИМ

Срок погашения

  • analogReadResolution ()
  • аналогWriteResolution ()

/

  • тон ()
  • noTone ()
  • shiftOut ()
  • shiftIn ()
  • импульс In ()
  • миллис ()
  • микросхемы ()
  • задержка ()
  • delayMicroseconds ()
  • мин ()
  • макс. ()
  • абс ()
  • ограничение ()
  • карта ()
  • pow ()
  • кв. ()
  • кв. ()
  • грех ()
  • cos ()
  • загар ()
  • randomSeed ()
  • случайный ()
  • младший байт ()
  • старшего байта ()
  • bitRead ()
  • bitWrite ()
  • bitSet ()
  • bitClear ()
  • бит ()
  • attachInterrupt ()
  • detachInterrupt ()
  • прерываний ()
  • нет прерываний ()

-? .

Arduino — Gentoo Wiki

Arduino — это платформа разработки с открытым исходным кодом. В этой статье описывается процесс настройки системы Gentoo для подключения к Arduino, установка цепочки инструментов кросс-разработки и установка IDE Arduino.

Помимо официальных и клонированных плат Arduino на базе микропроцессоров Atmel AVR, среда может поддерживать другие микропроцессоры Atmel AVR, включая, помимо прочего: микропроцессоры ATtiny13, SoC nRF52 и микропроцессоры STM32.

Подготовьте ядро ​​к USB-подключению

Платы

Arduino подключаются к компьютеру через USB. С помощью этого соединения можно отправлять скомпилированные двоичные файлы «эскизы» в микропроцессор Arduino и получать отладочные сообщения с платы во время выполнения. Каждая модель платы имеет свой интерфейсный USB-чип; Если вы не уверены в используемом интерфейсе USB, обратитесь к документации на плату.

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

Для поддержки устройств Arduino необходимо включить соответствующий драйвер ядра; он может быть встроен в ядро ​​или как модуль.

Ардуино NG (FTDI)

KERNEL FTDI interface

 Драйверы устройств --->
    [*] Поддержка USB --->
      <*> Поддержка последовательного преобразователя USB --->
        <*> Однопортовый последовательный драйвер USB FTDI 

Arduino MEGA, Atmega8U2, Atmega16U2, Atmega32U4 (CDC ACM)

KERNEL CDC ACM

 Драйверы устройств --->
    [*] Поддержка USB --->
      <*> Поддержка USB-модема (CDC ACM) 

Ардуино NANO (Ch440)

Эта серия плат включает ряд микросхем последовательного преобразователя, однако наиболее часто используется Ch440.

KERNEL Ch440 последовательный преобразователь

 Драйверы устройств --->
    [*] Поддержка USB --->
      <*> Поддержка последовательного преобразователя USB --->
        <*> USB Winchiphead Ch441 Однопортовый последовательный драйвер 

Подтвердить подключение

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

Для Arduino NG:

root # dmesg

 usb 5-4: преобразователь последовательного USB-устройства FTDI теперь подключен к ttyUSB0 

Для Arduino MEGA:

корень # dmesg

 cdc_acm 5-4: 1.0: ttyACM0: USB-устройство ACM 

Разрешить доступ пользователям без полномочий root

Любой пользователь без полномочий root, который желает подключиться к устройству, должен быть добавлен в группу dialout , поскольку файл устройства (например, / dev / ttyACM0) принадлежит этой группе.

Чтобы добавить Ларри в группу, выполните следующую команду:

root # gpasswd -a larry dialout

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

Подготовьте цепочку инструментов

Поскольку микропроцессоры Atmel AVR требуют другого скомпилированного вывода с платформы разработки (чаще всего x86-64), необходимо установить набор инструментов кросс-разработки.

Рекомендуется: Установите набор инструментов с помощью crossdev

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

Установка crossdev

Установите sys-devel / crossdev:

root # emerge --ask sys-devel / crossdev

Важно
Если при установке crossdev возникнут проблемы, попробуйте демаскировать более свежую (нестабильную) версию.

Создать локальный репозиторий

Перед построением локальной инструментальной цепочки необходимо создать локальный репозиторий с именем crossdev .

Примечание
Репозиторий crossdev будет автоматически выбран инструментом crossdev для сборки пакетов для всех платформ, нацеленных на crossdev — создание этого репозитория гарантирует, что все созданные пакеты crossdev останутся полностью отделенными от собственных пакеты в системе разработки.

Примечание
Эти команды представляют собой сжатую форму инструкций, доступных в статье о настраиваемом репозитории ebuild для получения более подробной информации.

root # mkdir -p / var / db / repos / portage-crossdev / {профили, метаданные}

root # echo 'crossdev'> / var / db / repos / portage-crossdev / profiles / repo_name

root # echo 'masters = gentoo'> / var / db / repos / portage-crossdev / metadata / layout.conf

root # chown -R portage: portage / var / db / repos / portage-crossdev

Если основной репозиторий ebuild (gentoo) синхронизируется с помощью Git или другого метода, при котором файлы манифеста не содержат контрольных сумм ebuild, Portage необходимо проинформировать об этом, чтобы предотвратить ошибки «замаскировано: повреждением»:

root # echo 'thin-manifest = true' >> /var/db/repos/portage-crossdev/metadata/layout.conf

Укажите Portage и crossdev использовать этот репозиторий:

ФАЙЛ / etc / portage / repos.conf / crossdev.conf

 

Программирование микроконтроллеров AVR и Arduino с использованием Arduino ISP

Всем микроконтроллерам (MCU) требуется какой-то механизм для их программирования, даже если они программируются только один раз. Обычно программный код пишется на главном компьютере, затем он компилируется или транслируется, а объектный (машиночитаемый) код загружается в MCU («цель») с ПК («хост») с помощью кабеля ( обычно USB или RS232), который (с некоторым программным обеспечением) часто называют «программистом».«После программирования MCU функционирует так, как закодировано.

Одним из очень популярных производителей плат для разработки микроконтроллеров является компания Arduino из Италии. Многие платы Arduino содержат микроконтроллеры AVR, для которых также требуются программисты для сохранения программ, созданных на главном компьютере, в память целевого MCU, например, микроконтроллер AVR. Внешние программаторы часто используются для микроконтроллеров AVR и могут быть дорогостоящими.

Большинство целевых микроконтроллеров приходится программировать несколько раз во время разработки проекта, поэтому невозможно удалить микроконтроллер из схемы для его программирования.Многие микроконтроллеры, включая процессоры AVR, можно программировать с помощью встроенного программатора (ISP), поэтому их не нужно снимать с печатной платы. [i]

По умолчанию платы Arduino имеют резидентный код MCU, называемый загрузчиком. Загрузчики — это первые программы, которые населяют MCU, когда вы их включаете. Загрузчики инструктируют MCU, что загружать или делать дальше. Arduino упрощает использование связи между хостом ПК и микроконтроллером (целевой) платы с интегрированной средой разработки (IDE).IDE является резидентной и включает инструменты, которые разработчики могут использовать для программирования, компиляции и отладки целевого MCU.

Загрузчик также поддерживает связь между Arduino IDE и платой Arduino через USB. Загрузчик отвечает за запись кода на чипе, поступающего из Arduino IDE.

Платы разработки

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

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

Платы

Arduino имеют небольшое количество универсальных вводов-выводов и могут использоваться для множества различных целей. Например, платы Arduino могут выступать в качестве инструмента программиста для других микроконтроллеров AVR с использованием Arduino ISP и являются одним из самых простых и дешевых методов программирования микроконтроллеров AVR. Встроенный программатор Arduino — это встроенная функция, предлагаемая в бесплатной среде разработки Arduino.Интернет-провайдер позволяет программировать платы Arduino и другие микроконтроллеры AVR, используя другую плату Arduino, предназначенную для этой цели. [Ii]

Однако программирование недавно разработанной платы Arduino с использованием полностью функциональной платы Arduino (в качестве программиста — Arduino) имеет несколько условий. Во-первых, «программист-Arduino» (Arduino, который вы настроили как программист) должен быть , настроен как ISP. Эскиз (код) по умолчанию доступен в примере кода в меню «Файл» среды Arduino IDE.[iii] Скетч Arduino ISP передает необходимые инструкции программатору-Arduino для настройки в режиме программирования.

Рисунок 1: Вариант эскиза Arduino ISP. (Источник: скриншот автора) Рисунок 2: Скетч Arduino ISP. (Источник: снимок экрана автора)

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

Рисунок 3: Подключение светодиодов Arduino. (Источник: скриншот автора)

Контакт 7 = Программирование (включается во время программирования)

Контакт 8 = Ошибка (включается в случае ошибки программирования)

Pin 9 = Heartbeat (остается включенным после включения программатора)

После настройки программатора-Arduino устанавливается соединение между программатором-Arduino и целью Arduino.Конфигурация контактов должна быть выполнена точно так, как указано в эскизе Arduino ISP.

Интернет-провайдер Arduino обменивается данными с помощью протокола последовательного периферийного интерфейса (SPI) для программирования микроконтроллеров AVR. Связь SPI использует 4 логических сигнала: MOSI, MISO, SCLK и SS. Помимо I 2 C, SPI является одним из наиболее часто используемых способов связи для MCU. SPI следует архитектуре ведущий-ведомый, что означает, что ведущее устройство может обмениваться данными с несколькими ведомыми устройствами, используя одни и те же контакты данных, а целевое ведомое устройство выбирается с помощью линии выбора ведомого.Если есть карты памяти, выбор ведомого используется для выбора конкретной микросхемы среди множества микросхем. Однако, когда вы используете Arduino в качестве инструмента программирования, сигнал выбора ведомого используется только для сброса микроконтроллера. Сброс микроконтроллера переводит его в состояние приема команд от программатора Arduino. [iv]

На программаторе-Arduino контакты 10, 11, 12 и 13 используются в качестве контактов данных. Конфигурации следующие:

Контакт 10 = СБРОС

Контакт 11 = MOSI

Контакт 12 = MISO

Штифт 13 = SCK

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

Внутрисхемное последовательное программирование (ICSP) — это возможность программирования микроконтроллера без отключения от схемы. Заголовок ICSP физически доступен на плате Arduino в виде 6 контактов. Соедините контакты 11, 12 и 13 целевой Arduino с контактами 11, 12 и 13 вашего программатора Arduino. Обратите внимание, что вывод 10 вашего программатора Arduino должен подключаться к выводу сброса вашей целевой Arduino.В качестве альтернативы, выводы заголовка ICSP могут использоваться для связи SPI. (См. Рисунок 4).

Рисунок 4: Заголовок Arduino ICSP. (Источник: снимок экрана автора)

После подключения всего вышеперечисленного вам необходимо определить, что вы используете режим программатора с вашего хост-компьютера. Перейдите в меню «Инструменты» и выберите «Arduino as ISP» в параметрах «Программист». (См. Рисунок 5).

Рисунок 5: Настройка программиста Arduino в качестве ISP (Источник: снимок экрана автора)

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

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

Рисунок 6: Вариант записи загрузчика (Источник: снимок экрана автора)

Если микроконтроллер или плата Arduino могут взаимодействовать с программой Arduino IDE, это дает различные преимущества, например, возможность проверять результаты во время выполнения с помощью последовательного монитора Arduino IDE. (Serial Monitor открывается в отдельном окне, действуя как независимый терминал, который принимает и отправляет последовательные данные.)

Если загрузчик не загружен в микроконтроллер, он не сможет использовать функции Arduino и не сможет взаимодействовать с Arduino IDE. vi Загрузчик использует часть памяти. В некоторых случаях использование IDE Arduino не требуется, и поэтому не нужно программировать загрузчик. Если загрузчик не запрограммирован, можно освободить больше памяти для основного эскиза программы. Например, в Arduino UNO общий объем памяти 32 КБ, а 0.Под загрузчик отведено 5 КБ памяти. vii Если загрузчик не установлен, общий объем памяти, доступный для основного эскиза программы, больше.

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

i https://ieeexplore.ieee.org/document/8005274

ii https://www.arduino.cc/en/Guide/ArduinoISP

iii https://www.arduino.cc/en/Tutorial/ArduinoISP

iv https://www.arduino.cc/en/Reference/SPI

в https://www.arduino.cc/en/Hacking/MiniBootloader

vi https://www.arduino.cc/en/Tutorial/ArduinoISP

vii https://en.wikipedia.org/wiki/Arduino_Uno#Technical_specifications

Arduino или Atmega Programlama | mcufreak

Atmega MCU’ları programlamak için seri programlayıcılar kullanılabileceği gibi arduinolar da kullanılabilir.Это мега-версия Arduino Atmega88, встроенная в программу. Çizimde görüldüğü üzere atmega88’in SCK,

MISO, MOSI, RESET, GND, VCC и AVCC pinlerini kullanarak seri programlama yapılabilmektedir. Seri programlama yapılabilmesi için atmeganın RSTDSBL sigortası 0 olarak, SPIEN sigortası da 1 olarak ayarlanmış olmalıdır. Fabrika çıkışı değerler seri programlama için uygundur fakat bu sigorta bitleri daha sonradan değiştirilmişse entegreyi programlamak için paralel programlayıcı kullanılmalıdır.Bunun için hazırladığımız proje burada.

Programlamaya başlamak için öncelikle bir kod yazmamız ve bu kodu derleyerek HEX dosyasına dönüştürmemiz gerekiyor. Bu projede derleyici olarak Atmel Studio 7 kullanıldı.

imdi arduinoyu bir seri programlayıcı olarak programlamamız gerekiyor. Arduino IDE’sini kullanarak bu işi gerçekleştireceğiz. Arduino IDE’sine girdikten sonra dosya> örnekler> ArduinoISP yolunu izleyip kodu açıyoruz ve arduinomuza yüklüyoruz.Бу ноктадан сонра aşağıdaki devreyi kurmamız gerekiyor;

Devreyi kurup arduino’yu bilgisayara bağladıktan sonra 9. Pine bağlı olan led kalp atımı şeklinde yanıp sönmeye başlamalı. Bu kısımda arduino IDE’sinden arduinonun kaçıncı porta bağlı olduğunu öğrenmeniz gerekiyor.

Daha sonra buradan WinAVR programını indirip tercihen C: \ winavr konumuna atıyoruz. MCU’ya yüklemek istediğiniz hex dosyasını da aynı dizine atmanız daha sonra komut istemcisinden yapılacak işlemleri kolaylaştırır.

imdi komut istemcisini (cmd) yönetici haklarıyla çalıştırıyoruz ve « cd C: \ winavr» komutu ile WinAVR’nin bulunduğu dizine geliyoruz. « avrdude -p m88 -c avrisp -b 19200 -P com8 » yazıp enter’a basarak programlayıcının çalışıp çalışmadığını kontrol ediyoruz. komuttaki «com8» yerine arduinonun bilgisayarınıza bağlı olduğu portu yazmanız gerekiyor. 19200 yerine de arduinonun bitrate’ini yazmanız gerekiyor. 9600 veya 19200’ü deneyebilirsiniz ya da aygıt yöneticisinden bu değeri kontrol edebilirsiniz.

Avrdude programı programlayıcımızı tanıdıktan sonra HEX dosyamızı arduino’ya yüklemek için şu komutu kullanıyoruz;

«avrdude -p m88 -c avrisp -b 19200 -P com8 -U flash: w: proje.hex»

Bu komut için -p m88 MCU modelini belirtir. Başka bir MCU’yu programlıyorsanız kod numarasını «avrdude -p ?» yazarak bulabilirsiniz. «Proje.hex» dosyası ise MCU’ya atmak istediğimiz hex dosyası. Buraya kendi dosyanızın ismini yazmalısınız.

Сын оларак предохранитель bitlerini yazmak için;

«avrdude -p m88 -c avrisp -b 19200 -P com8 -U lfuse: w: 0x62: m»

«avrdude -p m88 -c avrisp -b 19200 -P com8 -U hfuse: w: 0xDF: m»

«avrdude -p m88 -c avrisp -b 19200 -P com8 -U efuse: w: 0x01: m»

komutlarını kullanıyoruz.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Theme: Overlay by Kaira Extra Text
Cape Town, South Africa