Даже если система собрана правильно и скопипащен написан хороший код, вероятность что все заработает как надо, примерно 50/50.
Причин тому может быть три:
- Беспаечные макетные платы
- Электродвигатели
- Модули GSM-связи
И если в первом случае достаточно взять в руки паяльник (что делаю с самого начала), то электромагнитные помехи — проблема, которую не всегда можно решить экранированием и фильтрами питания.
Под катом — наиболее простой и "беспроводной", как вы поняли из фото способ поменять фюьзы Ардуино, перейдя на внутренний RC-генератор и отключив контроль питания.
И если решение с генератором я "подсмотрел" у моделистов, использующих мощные движки, то ко второму пришел сам, еще до знакомства с Arduino.
Поскольку первой конструкцией был индикатор полива, потребляющий в активной фазе 0.5мА (ибо 1МГц и 2.4В питания).
Почему платы ProMini? они не содержат ничего лишнего (кроме светодиодов ;-)
Почему сделал стабильное решение на постоянной основе, переделав под программатор одну плату?
Если что-то приходится делать более трех раз, то я пытаюсь это автоматизировать/упростить!
А согласитесь, каждый раз перетыкивать проводочки — несерьезно.
Забегая вперед, скажу, что тестировал результаты на своих СМС-весах.
И если раньше стоило модулю связи зарегистрироваться в стандарте GSM-900, то при расстоянии между оным и Ардуинкой меньше метра, контроллер начинал бутаться.
Теперь-же все ОК, на разных локациях, где данный эффект наблюдался.
Все что нам нужно — гребенка разъемов PBS, тонкий скальпель и лупа:
Скальпелем перерезаем дорожку ресета (в синем круге), и ни в коем случае не паяем разъемы на указанные желтым овалом места.
Да, еще любым отрезком витой пары соединяем пин D10 с подрезанным ресетом.
По сути, у нас получится вот такая (честно скопипащенная из интернета) схема:
Только гораздо компактнее, без проводов и конденсатора, ибо работает.
Теперь подключаем наш будущий программатор к USB-TTL, в ArduinoIDE задаем тип платы и порт, прошиваем из примеров скетч ArduinoISP (не забыв раскомментарить строку #define USE_OLD_STYLE_WIRING)
В папке \arduino-ваша_версия\hardware\arduino\awr правим файл BOARDS, вместо блока Arduino Pro or Pro Mini ставим следующее:
## Arduino Pro or Pro Mini (3.3V, 8 MHz INTERNAL) w/ ATmega328P
## ---------------------------------------------------
pro.menu.cpu.8MHzatmega328=ATmega328P (3.3V, 8 MHz INTERNAL)
pro.menu.cpu.8MHzatmega328.upload.maximum_size=30720
pro.menu.cpu.8MHzatmega328.upload.maximum_data_size=2048
pro.menu.cpu.8MHzatmega328.upload.speed=57600
pro.menu.cpu.8MHzatmega328.bootloader.low_fuses=0xE2
pro.menu.cpu.8MHzatmega328.bootloader.high_fuses=0xDA
pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0xFF
pro.menu.cpu.8MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex
pro.menu.cpu.8MHzatmega328.build.mcu=atmega328p
pro.menu.cpu.8MHzatmega328.build.f_cpu=8000000L
Тут я поменял low_fuses FF > E2 (переход на внутрениий генератор) и extended_fuses FD > FF (запрет контроля питания)
Все, перезапускаем ArduinoIDE, ставим донора в наш программатор, отключаем провод DTR от USB-TTL (если конечно он у Вас есть ;-)
В разделе Инструменты-Программатор Выбираем "Arduino AS ISP", тип платы Arduino Pro or Pro Mini (3.3V, 8 MHz INTERNAL) — Прошить загрузчик.
Все! Не буду напрягать лишними проверками с помощью avrdude и прочими премудростями и так описанными в десятках мануалов — хотелось дать максимально простой материал.
На заглавном фото кстати, плата с уже выпаянным керамическим резонатором.
Дополнительная плюшка — скетчи в ардуинки можно прошивать без нажатия reset — по Ctrl-Shift-U (Выгрузить с помощью программатора)
Помимо помехозащищенности, такой метод избавляет от сбоя генерации обычного кварца при тряске и ударах.
Минус — точность таймеров +-5%.
Удачных Вам проектов!
Андрей.