Ассемблер для avr скачать программу. Ассемблер avr для начинающих (первый шаг). Инструкции работы с битами

Не так давно столкнулся с необходимостью использования Arduino Pro Mini в своем проекте и сразу же встал вопрос как заливать в нее скетч. Конечно продаются различные переходники UART при помощи которых этот вопрос снимается быстро, но в тот момент такого переходника не оказалось под рукой.

То есть следующим образом:

Nano -> Pro Mini

  • +5v -> Vcc
  • GND -> GND
  • D10 -> RST
  • D11 -> D11
  • D12 -> D12
  • D13 -> D13

У меня получилось примерно так:

После того как все собрано и проверено можно подключить Nano к компьютеру, поморгав 7 раз обе платы готовы к работе.

Далее для прошивки нам необходимо убедиться, что при выставлении прошиваемой платы и программатора у нас используются одинаковые скорости порта, взяв за стандарт скорость из скетча. Для типа платы нужно найти файл boards.txt его путь относительно установленной программы IDE такой: Arduino/hardware/arduino/boards.txt . В нем нам нужно найти раздел параметров для платы Pro Mini выглядит она примерно так:

Pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328

У меня прошиваемая мини на 5 вольт с микроконтроллером ATmega328, если же у вас иная версия плата то вам нужно найти соответствующий вашей платы раздел.

Здесь необходимо убедиться что скорость выставлена верная:

Pro5v328.upload.speed=19200

Затем зайдем в файл programmers.txt, его путь Arduino/hardware/arduino/programmers.txt и убедимся в верности параметров:

Arduinoisp.name=Arduino as ISP
arduinoisp.communication=serial
arduinoisp.protocol=stk500v1
arduinoisp.speed=19200

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

После запуска IDE нам нужно выставить в меню «Инструменты» нашу прошиваемую плату и тип программатора «Arduino as ISP»:

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

Верный путь прошить Pro Mini лежит в меню «Файл» и называется он «Загрузить с помощью программатора», у меня стоит версия IDE 1.5.6-r2 там этот пункт называется «Вгрузить через программатор», по всей видимости трудности перевода в этом релизе, в версии 1.0.5-r2 все в порядке.

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

Однако не стоит беспокоится, если все собрано верно и спаяно надежно то, достаточно нажать «Reset» на Pro Mini, подождать пару секунд и плата успешно прошъется.

Благодарю за внимание на этом все, пока.

Arduino + два сервопривода + плата зарядки + плата повышающего преобразователя + старый аккумулятор + кучка радиодеталей + кусок фанеры + тумблер = сбылась мечта идиота!
Много текста, для тех, кто любит читать. Много спойлеров, для тех, кто любит читать «по диагонали». Видео, для тех, кто любит видео. Скетч, для тех, кто любит сразу скопировать и запустить «на коленке». Фото, фото, фото. Кот, для любителей котов.

Не совсем дисклеймер

Это мой первый проект, не считая мигания светодиодом, Hello world и т.п. По традиции надо предварительно посыпать голову пеплом, на предмет того, что код далек от совершенства и обязательно ввязаться в спор по этому поводу. А также по поводу частичной скопированности кода у другого проекта, попросить не бить сильно и т.д. Но этого не будет. Код идеален! Потому что работает, нравится мне и сделан для себя.
Интересующимся дам совет: не бойтесь, вступайте в бой, лопатьте горы кода, стройте свои мегапирамиды из разных операторов. Со временем придет и стиль, и утонченность, и идеал.
Пока в памяти контроллера есть место - вам ни чего не страшно. Упретесь в стену - будете оптимизировать. И это тоже развитие. Оно важно.
Большая книга по программированию на С - да, полезно. Но, на первых порах, гораздо полезнее иметь под рукой краткий справочник по командам и держать в закладках несколько ссылок на работу с простыми примерами, библиотеками и т.п., вроде , или той же Амперки.
И еще, мне очень помогают блок-схемы. Прямоугольник, ромбик, овал. Кто сталкивался - понимает. Делаю сейчас один проект - без блок-схемы никак. Для меня, лучше несколько дней рисовать - перерисовывать на бумаге, чтобы яснее представить себе весь ход работы программы, чем набросать кучу кода и зашиться в нем, т.к. я не обладаю умением охватить весь код силой своей программистской мысли, в виду малого опыта.
Желающим повторить или сделать по-своему – отвечу на все вопросы.
В пустые споры по моей письменной грамотности, стилю, дизайну, коду и нужности изделия и т.п., вступать не буду. Если допустил где-то в обзоре суровый косяк – исправлю или допишу.

Что такое «Самое бесполезное устройство» можете загуглить сами. Я натолкнулся на него случайно . Этот код и был взят за основу, т.к. сам по себе он не запустился, да и сценарии хотелось сделать свои.

Лирическое отступление

Говорят, после сорока, особенно, когда уже очень после сорока, нужно стараться «разминать» мозги. И что изучение языков - лучшая разминка. И не только в таком возрасте. К языкам я не очень, а журнал «Здоровье» как бы советует… В общем, решил я изучить что-то новое для себя. Электроника для меня не в новинку, хоть и забыл я ее уже по большей части, но вот программирование ни когда не было родным. Я его побаивался. Но тут совпало много знаков свыше: журнал «Здоровье», который рекомендует изучить что-то новое, давняя мечта разобраться (хоть немного) в программировании (хоть чего) и youtube, в котором только ленивый не рассказывает про то, как мигать светодиодом с помощью умной платы за доллар с копейками.
До этого я неплохо управлял миганием светодиода с помощью двух транзисторов, конденсатора и пары сопротивлений, но теперь, говорят, это не комильфо. Значит надо быть в тренде.


Очень мне понравилось это бесполезное, в прямом смысле слова, устройство. Увидел – влюбился. Хочу, и всё! Как детская мечта! Но возраст внес свои коррективы. Хочу именно сам сделать, а не купить. Тем более, что в продаже простые устройства. Я же натолкнулся на «интеллектуальное», а таких в продаже я не нашел. Тем более – надо делать!
И опять, Arduino. А я в нем ни бум-бум. Значит надо разбираться. Алиэкспресс в помощь. Начал с Ардуин. Понимал, что путь к изучению будет тернист и жертвы неизбежны. Поэтому заказал пять разных. Пусть себе горят, если что. Отладка схемы происходила на Uno от другого продавца. Но, так как в конечном устройстве оказалась именно эта плата - ее и вынес в заглавие.
Кроме ардуинок, заказал огромное количество всякого разного барахла, как ардуиносовместимого, так и околоардуинового. Здесь расскажу только о том, что пригодилось в данном изделии.

Arduino Pro Mini


Доставка быстрая, упаковка в виде стандартного антистатического пакета и конверта с внутренней пупырчатой поверхностью. Продавец общительный, русскоязычный.
На 328 чипе. 3,3 вольта, 8МГц. Почему именно так? Да по ошибке. Хотел на 5 вольт, 16МГц, а купил эту. Сам виноват. Впрочем, для данного проекта не критично - поставил лишний преобразователь напряжения. Собственно и всё. Огромных отличий от других Mini я не нашел. Фирменное отличие - черный текстолит(?) Из косяков: на плате не работает пин RAW. Но и это не остановило. Хотя, с ним мог бы сэкономить преобразователь на 3,3 В. гребенки не распаяны. Плата сделана добротно.
Почему так кратко? Потому что про этого продавца и его платы уже есть пристрастный (п.18). Желающие найдут легко. Пересказывать его не имеет смысла. Я в комментах к нему тоже вставил свои пять копеек. И с продавцом напереписывался вдоволь.


Сервопривод SG90


$3.2 за партию две штуки.
Описывать особенно нечего. Слабый сервопривод со средней точностью позиционирования, которая сильно зависит от скорости перемещения. Зато копеечный. Для привода крышки - с лихвой, для «руки» - на грани возможностей. Для работы нужно 5 вольт, но для управления достаточно и 3,3. Пробовал управлять через преобразователь и напрямую от ардуино - разницы нет. Поэтому преобразователь уровней сэкономил.


Контроллер зарядки и преобразователь питания


$2.28 за пять штук. С защитой. Пока заряжается - горит красный светодиод, окончание зарядки - синий светодиод. Обзор здесь был.


$0.50 за штуку. Доставка, правда, платная, но я брал в этом магазе еще целый ворох всякой всячины, поэтому доставка не напрягла. USB гнездо выпаял для облегчения веса))) На выходе выдает 5,12 вольт.





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


TTL преобразователь


$1.5 за штуку. Вообще-то я заказал сначала . Он в два раза дешевле. Но, по каким-то странным причинам, он пал смертью храбрых. Я так и не понял, чем я его убил. По этой причине проект застопорился на месяц, пока не пришел новый, более продвинутый - не надо давить reset. Это ли не прогресс?


Остальное из запасников

Регулятор напряжения1117Т-3,3V в корпусе TO220, конденсаторы 1500,0х6,3 и 470,0х16, два конденсатора по 0,1 мкФ, белый светодиод и микропереключатель от детской машинки, резистор 220 Ом. Аккумулятор валялся несколько лет без дела. Когда-то я разобрал сгоревший (в прямом смысле) портативный DVD-проигрыватель. Из хорошего там только аккумуляторы и уцелели. Вот один из них и пригодился. Вольтаж 3,7 V, емкости я в маркировке не нашел.
Клеевой пистолет, резинка для денег, два крючка от… лифчика (спасибо супруге. Дорогая, я тебя люблю!), два мебельных шканта, четыре шурупа, четыре клейких отбойника для мебельных дверей, кусок макетной платы, провода, разъемы.


Сложнее обстояло дело с корпусом. Было перепробовано множество коробок. Коробка из пластика от часов Tissot оказалась хрупкой, частично картонной. Но металлические завесы от нее подошли. Одна даже в запасе осталась. Пробовал готовые корпуса от парфюма, коробку от вина, от конфет. В итоге, решил сделать сам.
Качественная фанера, скорее всего березовая, нашлась в детском наборе для выжигания. Ребенок вырос - набор остался. С одной стороны был нанесен рисунок, зато другая сторона выглядела прямо-таки сказать, отлично

Прямо-таки сказать, отлично

В школе у нас был трудовик. В возрасте. В общем и целом - замечательный человек. Его уважали. Когда мы проходили электричество, на примере батарейки, лампочки и ключа, он прочитал нам лекцию.
«В батарейке живет ток. Вот выходит он из плюса и пошел по проводам. Идет, идет, вдруг бац - ключ на пути. И ключ разомкнут. Ток понимает, что дальше идти некуда. Он развернулся и ушел в батарейку. И лампочка не горит. Замыкаем ключ. Ток опять пошел, дошел до ключа, прошел через него, прошел через лампочку и вернулся в батарейку. И лампочка горит, прямо-таки сказать, отлично.» С тех пор и есть такая фраза в лексиконе, как синоним чего-то неожиданно удачного.




Пробовал резать фанеру ножовкой, лобзиком - всё не то. Сколы, которые потом трудно убрать, не ровная кромка. Нашел выход - острый канцелярский нож. Замечательно прорезает половину фанеры с одной стороны, и половину с другой. Потом чуть-чуть наждачкой и всё в ажуре. Зато, при хорошей металлической линейке и постоянно остром лезвии, получается идеальный срез и ровная линия.
Конечно, не без косяков - под наклейкой Hand made скрывается банальная дырка. Просверлил по центру, для тумблера. А серва не влезла. Пришлось смещать тумблер в бок и закрывать дырку. Меня такие трудности не пугают.
Описывать каждый свой чих по изготовлению устройства не вижу смысла. Я опишу некоторые моменты. А уж имеющий руки - да сделает.
Коробку собрал на термоклей. Самого клея не жалел. Держится отменно. Не скрипит, не люфтит. Быстро, дешево и сердито. Да и вообще, как вы заметили, практически всё держится на этом клее. Рекомендую. Очень ускоряет процесс сборки. Микрик выключения приклеил изнутри на левую стенку - виднеется на фото немного.
Крышку прикрепил на завесу.

С завесой намучился. Много экспериментировал. Хотел, чтобы крышка располагалась именно сверху коробки, а не внутри. Даже согнул несколько вариантов скоб-завес из скрепок. По потом вспомнил, что в процессе экспериментов на глаза попались завесы из коробки часов Tissot. Такие добротные, швейцарские (китайские?).
Завеса вещь важная. Ее качество очень важно для общей внешней красоты устройства.
Основной тумблер нужен помягШе, тогда и работать будет полегШе.
Крышку возвращает в закрытое положение резинка. Ее не нужно выбирать очень жесткой - серва справится, но, при центральном расположении завесы, крышку будет перекашивать.
В случае с фанерой, покрытие лаком обязательно - пачкается сильно. Я применил бесцветный цапон-лак. Просто потому, что другого под рукой не оказалось.
Серву, которая управляет «рукой» лучше расположить по-другому. Не сбоку, а спереди от тумблера. Тогда «рука» может быть попроще в изготовлении - г-образная, вместо п-образной. Ширину коробки можно уменьшить и тумблер расположить по центру.
Серву крышки лучше развернуть на 180 градусов, тогда в коде проще будет ассоциировать градусы этой сервы с работой крышки. У меня наоборот, поэтому открывание - это уменьшение градусов. А у «руки» наоборот. И правильнее толкать крышку с той же стороны, с которой ее тянет назад резинка.
Коробку не стоит делать слишком маленькой. Будет не удобно пользоваться. А вот более плоской - допустимо. Коробка легкая и если она будет площе, будет устойчивее. Удобнее будет толкать тумблер пальцем не придерживая коробку.
Из двух кусков макетной платы сделал что-то типа шилда. Ардуину впаял без разъемов. Намертво. Мне не жалко.


А вот всю периферию сделал на разъемах. Так удобнее.
Конденсатор большой емкости по питанию ардуины (3,3 вольт) обязателен. Без него ардуина «виснет».
У меня нет сборочных чертежей устройства. Оно на столько простое, что можно применить много других простых решений, на которых строится вся механика. На видео, как моем, так и других подобных устройств, можно видеть применяемые варианты приводов.

#include #include Servo doorServo; //сервопривод крышки Servo handServo; //сервопривод руки Bounce bouncer = Bounce(12, 40); //создаем экземпляр класса Bounce для 12 вывода тумблера int pos = 0; //переменная начальной позиции int pos1door = 70; //начальное положение сервопривода крышки int pos2door = 30; //конечное положение сервопривода крышки int pos1hand = 10; //начальное положение сервопривода руки int pos2hand = 160; //конечное положение сервопривода руки int r; //случайное число, от которого зависит вариант выключения тумблера #define LED_PIN 11 // номер выхода,подключенного к светодиоду int ledState = LOW; // этой переменной устанавливаем состояние светодиода long previousMillis = 0; // храним время последнего переключения светодиода #define INTERVAL 30UL // интервал между включение/выключением светодиода void setup() { pinMode(LED_PIN, OUTPUT); pinMode(12, INPUT); //переключаем 12 вывод в режим входа digitalWrite(12, 1); //включаем на нем подтягивающий резистор Serial.begin(9600); //установка порта на скорость 9600 бит/сек. Для отладки. Потом можно убрать. doorServo.attach(9); //назначаем сервопривод крышки на пин 9 handServo.attach(10); //назначаем сервопривод руки на пин 10 doorServo.write(pos1door); //устанавливаем в начальную позицию сервопривод крышки handServo.write(pos1hand); //устанавливаем в начальную позицию сервопривод руки } void loop() { if (bouncer.update()) { if (bouncer.read()==0) { //если кнопка нажата { r = random(0,11); //генерируем случайное число jn 0 до 10 Serial.println®; if (r == 0) { move_0(); } //вызов функции по случайному числу else if (r == 1) { move_1(); } else if (r == 2) { move_2(); } else if (r == 3) { move_3(); } else if (r == 4) { move_4(); } else if (r == 5) { move_5(); } else if (r == 6) { move_0(); } else if (r == 7) { move_1(); } else if (r == 8) { move_4(); } else if (r == 9) { move_3(); } else if (r == 10) { move_0(); } } } } } // Библиотека функций. Общий принцип: открыть крышку - высунуть руку и выключить тумблер - убрать руку - закрыть крышку //а уж вариантов как это красиво обставить................ void move_0(){ //простой вариант: открыли-выключили-закрыли //открываем крышку for(pos = pos1door; pos >= pos2door; pos -=3) { doorServo.write(pos); delay(15); } //высовываем руку for(pos = pos1hand; pos <= pos2hand; pos +=3) { handServo.write(pos); delay(15); } //убираем руку for(pos = pos2hand; pos >= pos1hand; pos -=3) { handServo.write(pos); delay(15); } //закрываем крышку for(pos = pos2door; pos <= pos1door; pos +=3) { doorServo.write(pos); delay(15); } } void move_1(){ //простой вариант 2: открыли-выключили-закрыли //открываем крышку for(pos = pos1door; pos >= pos2door; pos -=1) { doorServo.write(pos); delay(15); } delay(1000); //высовываем руку for(pos = pos1hand; pos <= pos2hand; pos +=1) { handServo.write(pos); delay(15); } //убираем руку for(pos = pos2hand; pos > <= pos1door; pos +=5) { doorServo.write(pos); delay(15); } } void move_2(){ //задумчивый вариант 2: приоткрыли-закрыли-открыли-выключили-закрыли //открываем крышку for(pos = pos1door; pos >= pos2door+15; pos -=5) { doorServo.write(pos); delay(15); } delay(1000); //закрываем крышку for(pos = pos2door+15; pos <= pos1door; pos +=5) { doorServo.write(pos); delay(15); } delay(1000); //открываем крышку for(pos = pos1door; pos > <= pos2hand+2; pos +=5) { handServo.write(pos); delay(15); } //убираем руку for(pos = pos2hand+2; pos >= pos1hand; pos -=5) { handServo.write(pos); delay(15); } //закрываем крышку for(pos = pos2door; pos <= pos1door; pos +=5) { doorServo.write(pos); delay(15); } } void move_3(){ //дерганый вариант: приоткрыли-подергали - закрыли-открыли-выключили-закрыли //открываем крышку for(pos = pos1door; pos >= pos2door+15; pos -=1) { doorServo.write(pos); delay(50); } delay(500); //дергаем крышку for(int i=1; i <=8; i ++) { doorServo.write(pos2door+18); delay(80); doorServo.write(pos2door+15); delay(80); static unsigned long previousMillis = 0; if(millis() - previousMillis > INTERVAL) { previousMillis = millis(); digitalWrite(LED_PIN,!digitalRead(LED_PIN)); } } delay(500); //закрываем крышку for(pos = pos2door+15; pos <= pos1door; pos +=1) { doorServo.write(pos); delay(50); } delay(1000); //открываем крышку for(pos = pos1door; pos >= pos2door; pos -=5) { doorServo.write(pos); delay(15); } //высовываем руку for(pos = pos1hand; pos <= pos2hand+2; pos +=5) { handServo.write(pos); delay(15); } //убираем руку for(pos = pos2hand+2; pos >= pos1hand; pos -=5) { handServo.write(pos); delay(15); } //закрываем крышку for(pos = pos2door; pos <= pos1door; pos +=5) { doorServo.write(pos); delay(15); } } void move_4(){ //открываем крышку delay(2000); for(pos = pos1door; pos >= pos2door+15; pos -=5) { doorServo.write(pos); delay(50); } delay(500); digitalWrite(LED_PIN,!digitalRead(LED_PIN)); delay(2000); digitalWrite(LED_PIN,!digitalRead(LED_PIN)); delay(500); //закрываем крышку for(pos = pos2door+15; pos <= pos1door; pos +=5) { doorServo.write(pos); delay(50); } delay(1000); //открываем крышку не полностью for(pos = pos1door; pos >= pos2door+15; pos -=1) { doorServo.write(pos); delay(50); } delay(2000); //открываем крышку полностью for(pos = pos2door+15; pos >= pos2door; pos -=1) { doorServo.write(pos); delay(15); } //высовываем руку for(pos = pos1hand; pos <= pos2hand-35; pos +=1) { handServo.write(pos); delay(35); } delay(1000); //высовываем руку for(pos = pos2hand-35; pos <= pos2hand+3; pos +=4) { handServo.write(pos); delay(15); } //убираем руку for(pos = pos2hand+3; pos >= pos1hand; pos -=7) { handServo.write(pos); delay(15); } //закрываем крышку for(pos = pos2door; pos <= pos1door; pos +=7) { doorServo.write(pos); delay(15); } delay(500); //открываем крышку for(pos = pos1door; pos >= pos2door+20; pos -=5) { doorServo.write(pos); delay(50); } delay(300); digitalWrite(LED_PIN,!digitalRead(LED_PIN)); delay(500); digitalWrite(LED_PIN,!digitalRead(LED_PIN)); delay(100); //закрываем крышку for(pos = pos2door+20; pos <= pos1door; pos +=1) { doorServo.write(pos); delay(50); } } void move_5(){ //возня for(int i=1; i <=2; i ++) { for(pos = pos1door; pos <= pos1door+45; pos +=5) { doorServo.write(pos); delay(50); } for(pos = pos1door+45; pos >= pos1door; pos -=5) { doorServo.write(pos); delay(50); } delay(100); } //дергаем крышку for(int i=1; i <=3; i ++) { doorServo.write(pos1door-6); delay(80); doorServo.write(pos1door-3); delay(80); } delay(300); //открываем крышку digitalWrite(LED_PIN,!digitalRead(LED_PIN)); for(pos = pos1door; pos >= pos2door+25; pos -=5) { doorServo.write(pos); delay(50); } delay(500); //открываем крышку digitalWrite(LED_PIN,!digitalRead(LED_PIN)); for(pos = pos2door+25; pos >= pos2door+10; pos -=5) { doorServo.write(pos); delay(50); } //открываем крышку digitalWrite(LED_PIN,!digitalRead(LED_PIN)); for(pos = pos2door+10; pos >= pos2door-5; pos -=2) { doorServo.write(pos); delay(50); } //высовываем руку for(pos = pos1hand; pos <= pos2hand-35; pos +=9) { handServo.write(pos); delay(35); } delay(1000); //убираем руку for(pos = pos2hand-35; pos >= pos2hand-70; pos -=1) { handServo.write(pos); delay(15); } delay(1000); //высовываем руку for(pos = pos2hand-70; pos <= pos2hand+3; pos +=9) { handServo.write(pos); delay(15); } delay(50); //убираем руку for(pos = pos2hand+3; pos >= pos1hand; pos -=7) { handServo.write(pos); delay(15); } //закрываем крышку digitalWrite(LED_PIN,!digitalRead(LED_PIN)); for(pos = pos2door-5; pos <= pos1door+3; pos +=5) { doorServo.write(pos); delay(50); } }

Скетч, предлагаемый автором из ссылки в начале обзора, у меня не запустился. А я еще был не тот профи, каковым являюсь сейчас)))))))
В общем, начал разбираться. В итоге, на основе чужого, сделал свой скетч. Добавил защиту от дребезга. Проще, конечно, было поставить резистор с конденсатором, но уж очень хотелось попрограммировать.


В принципе, схема понятна из скетча. Но я ее все-таки приведу. Уж простите за качество - как смог. Плату преобразователя взял немного другую - в «анфас» не нашел нужной.


Особых пояснений по скетчу нет. Разве что момент добавления угла поворота на несколько градусов, когда скорость сервы большая. Заметил, что если «рука» выскакивает резко, то она не выключает тумблер. Явно это от низкого качества сервоприводов. Поэтому нужно добавить немного к углу вылета «руки». Подозреваю, что при повторении эти добавочные градусы могут быть у вас другими. Зависит от плеча «руки».
И про программы. Пока шесть программ. Вызываются через генерацию случайного числа. Причем простые программы (0, 1 и 2) вызываются чаще обычных. Всем моим тестировщикам показалось, что более навороченные программы должны быть редким приятным бонусом, тогда появляется некая интрига. Так и сделал.
Для любителей цифр - размер коробки: длина - 150мм, высота - 70мм, ширина - 65мм.

Youtube сильно ухудшил качество. Если нужно глянуть в оригинале - качайте. 21 МБ.
Здесь в скетч внесено изменение, позволяющее увидеть все шесть программ по очереди, чтобы вы имели представление обо всех. В жизни, как я писал, у них псевдо-случайный порядок.



Зарядка производится через микро-USB обычным зарядником от мобильного. Автономность сильно зависит от частоты использования. Иногда несколько суток, а иногда за день «убиваю».


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

Да и вообще – можно сделать аккуратнее. Много всяких можно. Собственно именно этим я и предлагаю заняться тем, кого это заинтересовало.
Может я упустил что-то. Крупноват обзор получился для такого простого устройства. Вот за это могу извиниться.
Теперь кот и спасибо за то, что дочитали до конца.
Общие сведения

Arduino Pro Mini построена на микроконтроллере ATmega168 (техническое описание). Платформа содержит 14 цифровых входов и выходов (6 из которых могут использоваться как выходы ШИМ), 6 аналоговых входов, резонатор, кнопку перезагрузки и отверстия для монтажа выводов. Блок из шести выводов может подключаться к кабелю FTDI или плате-конвертеру Sparkfun для обеспечения питания и связи через USB.

Arduino Pro Mini предназначена для непостоянной установки в объекты или экспонаты. Платформа поставляется без установленных выводов, что позволяет пользователям применять собственные выводы и разъемы. Расположение выводов совместимо с платформой Arduino Mini.

Существует две версии платформы Pro Mini. Одна версия работает при напряжении 3.3 В и частоте 8 МГц, другая при напряжения 5 В и частоте 16 МГц.

Arduino Pro Mini разработана и производится SparkFun Electronics.

Схема и исходные данные

Характеристики
Питание

Arduino Pro Mini может получать питание: через кабель FTDI, или от платы-конвертора, или от регулируемого источника питания 3.3 В или 5 В (зависит от модели платформы) через вывод Vcc, или от нерегулируемого источника через вывод RAW.

Выводы питания:

  • RAW . Для подключения нерегулируемого напряжения.
  • VCC . Для подключения регулируемых 3.3 В или 5 В.
  • GND. Выводы заземления.
Память

Микроконтроллер ATmega168 имеет: 16 кБ флеш-памяти для хранения кода программы (2 кБ используется для хранения загрузчика), 1 кБ ОЗУ и 512 байт EEPROM (которая читается и записывается с помощью библиотеки EEPROM).

Входы и Выходы

Каждый из 14 цифровых выводов Pro, используя функции pinMode() , digitalWrite() , и digitalRead() , может настраиваться как вход или выход. Выводы работают при напряжении 3,3 В. Каждый вывод имеет нагрузочный резистор (стандартно отключен) 20-50 кОм и может пропускать до 40 мА. Некоторые выводы имеют особые функции:

  • Последовательная шина: 0 (RX) и 1 (TX) . Выводы используются для получения (RX) и передачи (TX) данных TTL. Данные выводы имеют соединение с выводами TX-0 и RX-1 блока из шести выводов.
  • Внешнее прерывание: 2 и 3 . Данные выводы могут быть сконфигурированы на вызов прерывания либо на младшем значении, либо на переднем или заднем фронте, или при изменении значения. Подробная информация находится в описании функции attachInterrupt().
  • ШИМ: 3, 5, 6, 9, 10, и 11 . Любой из выводов обеспечивает ШИМ с разрешением 8 бит при помощи функции analogWrite() .
  • SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK) . Посредством данных выводов осуществляется связь SPI, которая, хотя и поддерживается аппаратной частью, не включена в язык Arduino.
  • LED: 13 . Встроенный светодиод, подключенный к цифровому выводу 13. Если значение на выводе имеет высокий потенциал, то светодиод горит.

На платформе Pro Mini установлены 6 аналоговых входов, каждый разрешением 10 бит (т.е. может принимать 1024 различных значения). Четыре из них расположены на краю платформы, а другие два (входы 4 и 5) ближе к центру. Измерение происходит относительно земли до значения VCC. Некоторые выводы имеют дополнительные функции:

  • I2C: A4 (SDA) и A5 (SCL) . Посредством выводов осуществляется связь I2C (TWI), для создания которой используется библиотека Wire.

Существует дополнительный вывод на платформе:

  • Reset . Низкий уровень сигнала на выводе перезагружает микроконтроллер. Обычно применяется для подключения кнопки перезагрузки на плате расширения, закрывающей доступ к кнопке на самой плате Arduino.
Связь

На платформе Arduino Pro Mini установлено несколько устройств для осуществления связи с компьютером, другими устройствами Arduino или микроконтроллерами.ATmega168 поддерживает последовательный интерфейс UART TTL, осуществляемый выводами 0 (RX) и 1 (TX). Мониторинг последовательной шины (Serial Monitor) программы Arduino позволяет посылать и получать текстовые данные через подключение USB.

Библиотекой SoftwareSerial возможно создать последовательную передачу данных через любой из цифровых выводов Pro Mini.

ATmega168 поддерживает интерфейсы I2C (TWI) и SPI. В Arduino включена библиотека Wire для удобства использования шины I2C. Более подробная информация находится в документации. Для использования интерфейса SPI обратитесь к техническим данным микроконтроллера ATmega168.

Программирование

Микроконтроллер ATmega168 поставляется с записанным загрузчиком, облегчающим запись новых программ без использования внешних программаторов. Связь осуществляется оригинальным протоколом STK500.

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

Автоматическая (программная) перезагрузка

Arduino Pro Mini разработана таким образом, чтобы перед записью нового кода перезагрузка осуществлялась самой программой, а не нажатием кнопки на платформе. Один из выводов на блоке из шести выводов подключен к линии перезагрузки микроконтроллеров ATmega168 через конденсатор 100 нФ. Данный вывод соединен с одной из линий управления потоком конвертора USB-to-serial, подключенного к блоку: к линий RTS при использовании кабеля FTDI или к линии DTR при использовании платы-конвертора Sparkfun. Активация данной линии, т.е. подача сигнала низкого уровня, перезагружает микроконтроллер. Программа Arduino, используя данную функцию, загружает код одним нажатием кнопки Upload в самой среде программирования. Подача сигнала низкого уровня по линии перезагрузки скоординирована с началом записи кода, что сокращает таймаут загрузчика.

Функция имеет еще одно применение. Перезагрузка Pro Mini происходит каждый раз при подключении к программе Arduino на компьютере с ОС Mac X или Linux (через USB). Следующие полсекунды после перезагрузки работает загрузчик. Во время программирования происходит задержка нескольких первых байтов кода во избежание получения платформой некорректных данных (всех, кроме кода новой программы). Если производится разовая отладка скетча, записанного в платформу, или ввод каких-либо других данных при первом запуске, необходимо убедиться, что программа на компьютере ожидает в течение секунды перед передачей данных.

Физические характеристики

Габаритные размеры печатной платы Pro Mini составляют 1,8х3,3 см.

Общие сведения

Arduino Pro Mini - это устройство на базе микроконтроллера ATmega328. В его состав входит: 14 цифровых входов/выходов (из них 6 могут использоваться в качестве ШИМ-выходов), 8 аналоговых входов, кварцевый резонатор, кнопка сброса и контактные площадки для впаивания разъемов. Шестиконтактный разъем может служить для питания и взаимодействия с платой через USB посредством FTDI-переходника либо макетной платы Sparkfun.

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

Существует две версии Pro Mini: одна работает от 3.3В при частоте 8 МГц, другая - от 5В при 16 МГц.

Arduino Pro Mini разработан и изготовлен фирмой SparkFun Electronics.

Схема и исходный проект

Характеристики

Микроконтроллер ATmega168 или ATmega328
Рабочее напряжение 3.3В или 5В (в зависимости от модели)
Напряжение питания 3.35-12В (для модели 3.3В) или 5 - 12В (для модели 5В)
Цифровые входы/выходы 14 (из них 6 могут использоваться в качестве ШИМ-выходов)
Аналоговые входы 8
Максимальный ток одного вывода 40 мА
Flash-память 16 КБ (из которых 2 КБ используются загрузчиком)
SRAM 1 КБ
EEPROM 512 байт
Тактовая частота 8 МГц (для модели 3.3В) или 16 МГц (в модели 5В)

Питание

Arduino Pro Mini может быть запитан от различных источников:

  • через макетную плату;
  • через переходник FTDI , подсоединенный к шестиконтактному разъему;
  • от стабилизированного источника питания с напряжением 3.3В или 5В (в зависимости от модели), подключенного к выводу Vcc.

Кроме того, на плате есть встроенный стабилизатор напряжения, благодаря которому допускается подавать на плату напряжение питания величиной до 12В. Если для питания платы используется нестабилизированный источник питания, убедитесь, что он подсоединен к выводу "RAW", а не VCC.

Ниже перечислены выводы питания, расположенные на плате:

  • RAW. Для питания платы от нестабилизированного источника напряжения.
  • VСС. Стабилизированное напряжение 3.3В или 5В.
  • GND. Выводы земли.

Память

Объем флеш-памяти программ микроконтроллера ATmega328 составляет 32 КБ (из которых 2 КБ используются загрузчиком). Микроконтроллер также имеет 1 КБ памяти SRAM и 512 байт EEPROM (из которой можно считывать или записывать информацию с помощью библиотеки EEPROM).

Входы и выходы

Связь

Arduino Pro Mini предоставляет ряд возможностей для осуществления связи с компьютером, еще одним Ардуино или другими микроконтроллерами. В ATmega328 имеется приемопередатчик UART, позволяющий осуществлять последовательную связь посредством цифровых выводов 0 (RX) и 1 (TX). В пакет программного обеспечения Ардуино входит специальная программа, позволяющая считывать и отправлять на Ардуино простые текстовые данные через USB-соединение.

ATmega328 в Arduino Pro Mini выпускается с прошитым загрузчиком, позволяющим загружать в микроконтроллер новые программы без необходимости использования внешнего программатора. Взаимодействие с ним осуществляется по оригинальному протоколу STK500 ( , ).

Автоматический (программный) сброс

Чтобы каждый раз перед загрузкой программы не требовалось нажимать кнопку сброса, Arduino Pro Mini спроектирован таким образом, который позволяет осуществлять его сброс программно с подключенного компьютера. Один из выводов шестиконтактного разъема соединен с выводом RESET микроконтроллера ATmega328 через конденсатор номиналом 100 нФ. При подключении компьютеру этот вывод также связан с одной из линий, участвующих в аппаратном управлении потоком данных, идущих через преобразователь USB-Serial: при использовании кабеля FTDI - с линией RTS, при использовании макетной платы Sparkfun - с линией DTR. Когда на этой линии появляется ноль, вывод RESET, соответственно, также переходит в низкий уровень на время, достаточное для перезагрузки микроконтроллера. Данная особенность используется для того, чтобы можно было прошивать микроконтроллер всего одним нажатием кнопки в среде программирования Ардуино. Такая архитектура позволяет уменьшить таймаут загрузчика, поскольку процесс прошивки всегда синхронизирован со спадом сигнала на линии RESET.

Однако эта система может приводить и к другим последствиям. При подключении Pro Mini к компьютерам, работающим на Mac OS X или Linux, его микроконтроллер будет сбрасываться при каждом соединении программного обеспечения с платой. После сброса на Pro Mini активизируется загрузчик на время около полсекунды. Несмотря на то, что загрузчик запрограммирован игнорировать посторонние данные (т.е. все данные, не касающиеся процесса прошивки новой программы), он может перехватить несколько первых байт данных из посылки, отправляемой плате сразу после установки соединения. Соответственно, если в программе, работающей на Ардуино, предусмотрено получение от компьютера каких-либо настроек или других данных при первом запуске, убедитесь, что программное обеспечение, с которым взаимодействует Ардуино, осуществляет отправку спустя секунду после установки соединения.

Физические характеристики

Габаритные размеры печатной платы Arduino Pro Mini: 1.8 см х 3.3 см.

Введение

Приветствую Вас, читатели нашего ресурса. Сегодня мы поговорим об одном контроллере из серии Arduino, а именно об Arduino Pro Mini. Это маленький, компактный контроллер, имеющий все преимущества Arduino, но при этом очень компактный, можно сказать самый маленький из всех существующих Arduino контроллеров на данный момент. Многих так же привлекает и цена его Китайский копий, а стоят они от одного до двух долларов за штуку (местами и того меньше), что так же заставляет задуматься об его приобретении. Но существует и одна проблема, его не так-то уж и просто прошить, особенно Китайские копии, которые оснащают процессором Atmel ATmega168P, которыми некогда не оснащали официальные контроллеры Arduino Pro Mini и как следствие Arduino IDE отказывается их прошивать, сообщая о неправильной сигнатуре процессора.

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

Что для этого нужно?

Arduino Pro Mini очень компактный, а компактность требует жертв и жертва это - USB интерфейс который полностью выкосили в данном контроллере т.е. подключить Pro Mini к компьютеру напрямую у вас не получится и как следствие для этого понадобится либо специальный переходник USB в TTL или другой контроллер Arduino.

  • Первый способ. Прошиваем через адаптер USB в TTL - нужен сам адаптер в количестве одной штуки.
  • Второй способ. Прошиваем через Arduino UNO - нужна Arduino UNO, но не простая, а в классическом исполнении, это та Arduino, в которой процессор выполнен в DIP корпусе и вставлен в черный разъем.
  • Третий способ. Прошиваем через SPI интерфейс - нужна любая Arduino: UNO, Nano, Mega, Leonardo - не важно, главное чтобы был USB разъем для подключения к ПК.

Первый способ. Прошиваем через адаптер USB в TTL

Первым и самым простым способом загрузить свой скетч в Arduino Pro Mini - это приобрести специальный адаптер USB в TTL или как его называют UART переходник. Как правило, этот переходник это и есть та часть, которую вырезали из Arduino Nano, превратив ее в Arduino Pro Mini. Стоимость подобных переходников копеечная, а выбор и того больше. Китайцы наштопали их столько, что глаза разбегаться какой из них выбрать. При этом цена сего девайса не более одного вечно зеленого. После того как вы соедините Pro Mini и UART переходник проводами или шлейфом, остаётся только воткнуть его (переходник) в ПК, установить драйвер (не для всех переходников они требуются) и на этом собственно все. Ваш ПК определит переходник как очередной COM-порт, который появляется при подключении любой Arduino к ПК. Выбираете его, плату, с которой будете работать (Arduino Pro Mini) и спокойно загружаете свой скетч.

Единственным нюансом в данных переходниках, является наличие или отсутствие контактов RST или DTR. Рекомендую покупать переходники, на которых эти контакты есть. Они значительно упрощают жизнь и делают процесс прошивки беспроблемным. Если же вы купили уже переходник, на котором подобных контактов нет, то при каждой загрузке скетча в Arduino вам придется нажимать на кнопку Reset, что не всегда получается сделать вовремя, и это вносит свои неудобства.

Подключение переходник вы можете посмотреть по таблице ниже:

Второй способ. Прошиваем через Arduino UNO

Для этого способа нам понадобиться классическая Arduino UNO. Классическая эта та, в которой корпус микросхемы выполнен в DIP корпусе и вставлен в специальный разъем. Вот эту микросхему нам надо аккуратно поддеть отверткой. Тут важно не сломать процессор, поддевайте аккуратно, не погнув ноги.

Arduino UNO. Процессор выполнен в DIP корпусе.

Аккуратно поддеваем и вытаскиваем процессор отверткой.

После того как мы вытащили процессор из Arduino UNO мы по сути получили тот самый переходник USB в TTL, осталось только соединить проводами наш новый переходник и Arduino Pro Mini по следующей схеме:

Arduino UNO (без процессора)
Arduino Pro Mini
RX
RX
TX
TX
GND
GND
5V
VCC
RST
RST

После того как вы соединили две Arduino воедино, можно приступать к прошивке Arduino Pro Mini. Подключаем Arduino UNO по USB к ПК. Выбираем в настройках Arduino IDE COM-порт, указываем, что мы теперь работаем не с Arduino UNO, а с Arduino Pro Mini и все, заливаем наши скетчи. Способ довольно интересный, если вы не боитесь испортить Arduino и рядом не оказалось переходника USB в TTL.

Третий способ. Прошиваем через SPI интерфейс

Третьим и самым неудобным способом загрузить свой скетч в Arduino Pro Mini это прошить его при помощи ICSP интерфейса. Данный интерфейс присутствует на большинстве плат Arduino. Основные контакты данного интерфейса выведены на порты с 10 по 13, а так же выведены отдельно в виде шести контактной колодки с подписью ICSP. Располагается колодка, как правило, в центральной правой части Arduino.

Прошивка Arduino Pro Mini в этом случае делиться на два этапа:

  1. Прошивка платы Arduino как ISP программатора.

Первым делом мы должны подготовить наш будущий программатор. Возьмем для примера всю туже Arduino UNO. Далее пошагово:

  1. Запускаем Arduino IDE.
  2. Файл - Примеры - 11.ArduinoISP - ArduinoISP.
  3. Инструменты - Плата - Arduino UNO.
  4. Инструменты - Порт - Выбираем COM-порт.
  5. Компилируем и заливаешь в Arduino UNO.
Arduino UNO (ISP)
Arduino Pro Mini
5V
VCC
GND
GND
10
RST
11 (MOSI)
11 (MOSI)
12 (MISO)
12 (MISO)
13 (SCK)
13 (SCK)

Теперь опять открываем Arduino IDE. Открываем в ней скетч который вы хотите залить в Pro Mini и выполняете следующие действия:

2. Инструменты - Плата - Arduino Pro Or Pro Mini
3. Инструменты - Процессор - ATmega168 (5V, 16 MHz)
4. Инструменты - Порт - Выбираете порт
5. Инструменты - Программатор - Arduino as ISP
6. Скетч - Загрузить через программатор

Как видите загружать скетч в этом режиме надо через специальное меню "Загрузить через программатор", а не через кнопку "Загрузить" на главной форме Arduino IDE. В этом и связано все неудобство. Если вы нажмете кнопку "Загрузить" как это делаете обычно, то вы зальете скетч в Arduino UNO, а не Arduino Pro Mini, что затрет там скетч программатора. Так же в этом режиме недоступен класс Serial, то есть отлаживать свой скетч обмениваясь сообщениями по COM-порту у вас так же не получится. Ну и еще одна ложка дегтя в том, что после данной перепрошивки, в большинстве случаев, перепрошить Arduino Pro Mini через переходник у вас так же больше не получиться. Исправляется это заливкой нового bootloader-а через меню "Инструменты" - "Записать Загрузчик".

Добавляем китайский Pro Mini в Arduino IDE

Как я уже говорил в данной статье, Китайские клоны порой оснащают процессорами которыми не оснащали официальные версии Arduino Pro Mini и как следствие при прошивке их вы можете увидеть следующую или подобную ошибку.

Avrdude: Expected signature for ATmega168 is 1E 94 06 Double check chip, or use -F to override this check. Найден неправильный микроконтроллер. Вы указали правильную плату в меню Инструменты -> Плата?

Исправляется это легко:

  • Для начала необходимо открыть папку в которой расположена Arduino IDE.
  • Затем переходим в следующую папку "Папка с Arduino IDE\hardware\arduino\avr\".
  • Ищем там файл "boards.txt" и открываем его в текстовом редакторе.
  • Ищем в файле следующую строку "pro.menu.cpu.16MHzatmega168.build.mcu=atmega168".
  • И заменяем ее на "pro.menu.cpu.16MHzatmega168.build.mcu=atmega168p".
  • Перезапускаем Arduino IDE и на этом все.
  • Если у вас к примеру 328 процессор то делаем все так же, только ищем строку с цифрами 328.

Заключение

В данной статье я привел аж три варианта загрузки скетчей в Arduino Pro Mini. Лично я использую второй. Мне он больше нравиться.

Что будете использовать вы - выбирать вам. Оставьте в комментарии какой вариант вы предпочитаете.

Успехов вам и удачи.

Пожалуйста, включите javascript для работы комментариев.
  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то