Адаптированная цитата из Википедии на условиях распространения Attribution-ShareAlike
Arduino — торговая марка аппаратно-программных средств для построения простых систем автоматики и робототехники, ориентированная на непрофессиональных пользователей. Программная часть состоит из бесплатной программной оболочки (IDE) для написания программ, их компиляции и программирования аппаратуры. Аппаратная часть представляет собой набор смонтированных печатных плат, продающихся как официальным изготовителем, так и сторонними производителями.
Под торговой маркой Arduino выпускается несколько плат с микроконтроллером и платы расширения. Большинство плат с микроконтроллером снабжены минимально необходимым набором обвязки для нормальной работы микроконтроллера (стабилизатор питания, кварцевый резонатор, цепочки сброса и т. п.).
Arduino и Arduino-совместимые платы спроектированы таким образом, чтобы их можно было при необходимости расширять, добавляя в устройство новые компоненты. Эти платы расширений подключаются к Arduino посредством установленных на них штыревых разъёмов. Существует ряд плат с унифицированным конструктивом, допускающим конструктивно жесткое соединение процессорной платы и плат расширения в стопку через штыревые линейки. Кроме того, выпускаются платы уменьшенных габаритов (например, Nano, Lilypad) и специальных конструктивов для задач робототехники. Независимыми производителями также выпускается большая гамма всевозможных датчиков и исполнительных устройств, в той или иной степени совместимых с базовым конструктивом Ардуино.
Помимо стандартных конструктивов Ардуино сторонние разработчики создали множество миниатюрных клонов, сохранив лишь архитектурную и программную совместимость.
Микроконтроллеры для Arduino отличаются наличием предварительно прошитого в них загрузчика (bootloader). С помощью этого загрузчика пользователь загружает свою программу в микроконтроллер без использования традиционных отдельных аппаратных программаторов. Загрузчик соединяется с компьютером через интерфейс USB (если он есть на плате) или с помощью отдельного переходника UART-USB. Поддержка загрузчика встроена в Arduino IDE и выполняется в один щелчок мыши.
На случай затирания загрузчика или покупки микроконтроллера без загрузчика разработчики предоставляют возможность прошить загрузчик в микроконтроллер самостоятельно. Для этого в Arduino IDE встроена поддержка нескольких популярных дешевых программаторов, а большинство плат Arduino имеет штыревой разъем для внутрисхемного программирования (ISP для AVR).
В линейке устройств Arduino в основном применяются микроконтроллеры Atmel AVR ATmega328, ATmega168, ATmega2560, ATmega32U4, ATTiny85 с частотой тактирования 16 или 8 МГц.
- Петин В.А. Проекты с использованием контроллера Arduino. — БХВ-Петербург, 2014. — 400 с. — ISBN 9785977533379.
- Arduino — https://ru.wikipedia.org/wiki/Arduino
В китайском интернет-магазине aliexpress была куплена отладочная плата с микроконтроллером ATmega328P, совместимая с Arduino Pro Mini, но физически немного отличающаяся от неё. В данной статье будет показана распаковка, комплектация и быстрая проверка работоспособности. Будут приведены краткое описание и основные отличия от оригинальной отладочной платы. В конце будет показан пример работы данной платы с небольшой полезной программой, подсоединив к ней датчик препятствия и светодиод. В другой статье будет рассмотрен вариант использования платы без загрузчика и программирование её сторонней программой простым самодельным программатором.
Предисловие
У начинающего или рядового радиолюбителя, а иногда даже и у продвинутого, зачастую нет возможности использовать в своих конструкциях микроконтроллеры в корпусах TQFP, QFN или MLF в силу их маленького размера, тонких коротких выводов и маленького расстояния между выводами:
Трудности встречаются при создании платы для таких микроконтроллеров во время переноса рисунка или вытравливания, а так же при установке микроконтроллера на плату без применения паяльного фена или паяльной станции обычным паяльником:
Правда некоторые ухитряются сделать это даже весьма большим паяльником, но чаще всего выходом из ситуации является приобретение готовых модулей и отладочных плат в виде Arduino. Это довольно хорошее решение для новичков, потому что на таких платах уже припаян микроконтроллер со всей необходимой обвязкой в виде стабилизатора и фильтра питания, а так же индикаторных светодиодов, кнопки сброса и кварцевого резонатора. Порты ввода-вывода удобно выведены и к ним можно подпаять проводники или контактные разъёмы:
Arduino Mini
На большинстве отладочных плат имеется преобразователь интерфейса USB-UART и микроконтроллер можно запрограммировать через USB-разъём компьютера без применения специальных программаторов. Так же в микроконтроллер загружена специальная небольшая программа, так называемый Boot Loader и выставлены необходимые FUSE-биты:
Arduino Nano
Текст программы пишется в простой и понятной среде Arduino IDE и в микроконтроллер загружается одним нажатием. Исходный текст легко адаптируется под разные версии отладочных плат с минимальными изменениями:
На самых популярных и распространённых отладочных платах установлены микроконтроллеры ATmega168/328 и в среде разработки Arduino IDE уже имеется их поддержка:
Перед тем, как перейти к приобретённой отладочной плате из Китая, коротко рассмотрим подлинную оригинальную отладочную плату Arduino Pro Mini:
Arduino Pro Mini
Arduino Pro Mini от SparkFun Electronics
Arduino Pro Mini — это отладочная плата на базе микроконтроллера ATmega168/ATmega328. Она имеет 14 цифровых входов/выходов (6 из которых могут использоваться как выходы ШИМ), 8 аналоговых входов, установленный резонатор, кнопку сброса и отверстия для монтажа штыревых разъемов. Плата поставляется без предварительно установленных разъемов, что позволяет использовать различные их типы или прямую пайку проводов. Расположение контактов совместимо с Arduino Mini. Существует две версии Pro Mini: одна работает от напряжения 3,3 В и имеет тактовую частоту генератора 8 МГц, другая — от 5 В и тактирование на 16 МГц. Плата Arduino Pro Mini была спроектирована и изготовлена организацией SparkFun Electronics.
Выводы Arduino Pro mini
Вкратце рассмотрим и изучим названия и назначение выводов на классической отладочной плате Arduino Pro mini:
Итак отладочная плата Arduino Pro Mini имеет 14 цифровых выводов, которые могут быть использованы как входы или как выходы, и 8 аналоговых выводов с разрешением 10 бит каждый.
Кроме этого некоторые выводы могут иметь специализированную функциональность:
- 0 (RX) и 1 (TX) — последовательная шина для приема (RX) и передачи (TX) последовательных данных TTL;
- 2 и 3 — внешние прерывания — эти контакты могут быть сконфигурированы так, чтобы инициировать прерывание;
- 3, 5, 6, 9, 10 и 11 — обеспечивают 8-разрядный ШИМ-выход;
- 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK) — шина SPI;
- 13 — встроенный светодиод, подключенный к цифровому выходу 13. Когда сигнал на этом выводе имеет высокий уровень, светодиод светится, когда уровень низкий, он погашен;
- A4 (SDA) и A5 (SCL) — поддержка шины I²C (TWI);
- вывод сброс используется для аппаратного сброса микроконтроллера.
На рисунке ниже схематически показано с каким выводом микроконтроллера соединён каждый контакт отладочной платы Arduino Pro Mini и как организовано питание микроконтроллера:
Перейдём к товару с Алиэкспресс и представляю Вам фотографию платы с сайта продавца:
К моменту покупки это был самый дешёвый образец и его стоимость составляла 90 рублей с бесплатной доставкой. Товар был доставлен в очень большом пупырчатом пакете:
Внутри находился ещё один, теперь уже антистатический пакет в котором и был герметично запечатан купленный товар:
Упаковка было произведена хорошо и надёжно, ничего не сломалось и не повредилось, за что спасибо продавцу. Как и было написано на сайте продавца, в комплектацию входила сама плата и три колодки штыревых контактов в общей сумме 48 отдельных единиц:
Длина самой платы не превышает длины спичинки:
Основной пакет, в который был упакован товар, просто огромный для такой маленькой платки. Если сравнить, то на фоне этого пакета плата выглядит просто крошечной:
На данной отладочной плате кроме микроконтроллера установлен кварцевый резонатор на частоту 16 МГц, микросхема стабилизации питания на 5 В, кнопка сброса, два индикаторных светодиода, и несколько конденсаторов и резисторов. Монтаж выполнен ровно и красиво, места пайки выглядят хорошо. В некоторых местах имеются остатки флюса, но это не критично:
Некоторой сложностью и неудобством оказалось впаивание гребёнки со штыревыми контактами. Контакты оказались из какого-то плохо залуживаемого материала, и впаять гребёнку полностью не предоставилось возможным. Пришлось вытаскивать контакты из гребёнки и залуживать их по одному:
Это нужно учесть при покупке платы у данного продавца. В будущем я не планирую использовать контактную гребёнку, а намерен подпаивать провода прямо к контактным площадкам. Потому на время проверки платы были впаяны лишь необходимые для этого выводы:
Это контакты для подачи питания 5 В и выводы для шины внутрисхемного программирования ISP:
- 11 — MOSI,
- 12 — MISO,
- 13 — SCK,
- RST — сброс,
- VCC — стабилизированное напряжение питания +5 В,
- GND — общий провод,
- RAW — напряжение питания 7 — 12 В.
Это стандартные выводы шины внутрисхемного программирования ISP, имеющейся у большинства микроконтроллеров AVR, и по этой шине можно записывать/считывать программу и FUSE-биты в/с микроконтроллер. В моём случае понадобились именно эти выводы, потому что я использовал программатор для внутрисхемного программирования и так же с его помощью в микроконтроллер можно загрузить так называемый BootLoader. В последствии я буду использовать эту плату без программы-загрузчика, и о том как это делать будет рассказано в отдельной статье.. Я использовал простейший самодельный программатор COM-ISP, но потому что их большое множество Вы можете использовать тот ISP-программатор, который имеется у Вас. Это простейший и самый доступный вариант, но так же можно использовать другой программатор, и подключать его через интерфейс UART к выводам RX и TX.
Во время проверки отладочной платы использовалась среда разработки Arduino IDE версии 1.8.2. В других версиях могут быть отличия.
Я подключил свой программатор к выводам отладочной платы в соответствии с приведённой выше распиновкой шины ISP и открыв Arduino IDE загрузил BootLoader в микроконтроллер. Как правило, отладочная плата поставляется с уже запрограммированным bootloader-ом, но потому что приведённая здесь отладочная плата не является подлинной, то для надёжности лучше перезаписать программу-загрузчик.
Для этого на вкладке «Tools» в пункте «Board» предварительно нужно выбрать плату «Arduino Pro or Pro Mini», указать версию процессора в пункте «Processor», выбрать Ваш программатор в пункте «Programmer» и COM-порт в пункте «Port», к которому подключена плата через данный программатор. Затем в этой же вкладке «Tools» нажимаем на «Burn Bootloader» и записываем загрузчик в память микроконтроллера:
В это время в памяти микроконтроллера выделяется 2 килобайта пространства под программу загрузчика и устанавливаются определённые FUSE-биты. Программа загрузчика записывается в память микроконтроллера и выдаётся сообщение об успешном завершении процесса записи:
После завершения записи загрузчика и отсоединения вывода программатора «Сброс» от отладочной платы для нормального её запуска, светодиод, подключённый к тринадцатому выводу платы, начал мигать короткими вспышками:
После этого из Arduino IDE в микроконтроллер Я загрузил не делающую ничего полезного программу, и потому что для загрузки использовался программатор, то на вкладке «Sketch» нужно выбрать опцию «Upload Using Programmer»:
После компиляции, в микроконтроллер программа загрузится с помощью выбранного ранее программатора:
Запуская микроконтроллер с ничего не делающей программой, светодиод, подключённый к тринадцатому выводу платы, перестал мигать короткими вспышками.
Если Вашего программатора нет в списке программаторов Arduino IDE, или Вы тоже используете простейший самодельный COM-ISP программатор, то его поддержку можно добавить в конфигурационные файлы Arduino IDE. Так же для загрузки скомпилированных hex-файлов в микроконтроллер, можно воспользоваться этим самодельным COM-ISP программатором и программой Uniprof, но по умолчанию она не поддерживает микроконтроллер Atmega328, потому что его подписи и данных нет в папке подписей микроконтроллеров программы Uniprof. Для того, что бы Uniprof опознала Atmega328 и могла работать с ним, нужно добавить файл данных указанного микроконтроллера. Как всё это сделать, я так же расскажу в обещанной ранее статье.
Сейчас же вернёмся к проверке нашей отладочной платы и загрузим в микроконтроллер первую работающую программу:
Эта программа есть в примерах программ среды разработки Arduino IDE и она включает и выключает присоединённый к тринадцатому выводу платы светодиод с интервалом 1000 миллисекунд, или, что то же самое, в 1 секунду, что и видно на рисунке ниже:
Далее Я установил интервал включения/выключения на 400 миллисекунд и снова загрузил программу в микроконтроллер:
После запуска микроконтроллера светодиод стал мигать чаще:
После быстрой проверки микроконтроллера и отладочной платы со стандартным примером из среды разработки Arduino IDE, Я залудил остальные контакты на гребёнке и, прикрепив её к плате, растворителем почистил места пайки и всю плату от остатков флюса:
Прежде чем перейти к написанию более сложной программы рассмотрим отличия данной отладочной платы от оригинальной платы Arduino Pro Mini, а точнее основное отличие, заключающееся в расположении выводов с контактными площадками. Если взглянуть на обе платы, то видно, что на оригинальной плате выводы с контактными площадками расположены лишь по трём сторонам, при том, что на рассматриваемой здесь плате, контактные площадки занимают все четыре стороны платы, и аналоговые входы A4-A7 расположены с краю, вместе с остальными выводами, что в некоторых случаях даже более удобней, чем на оригинальной плате, у которой упомянутые аналоговые входы A4-A7 расположены за основным рядом контактов:
Остальные отличия,такие как тип резонатора или микросхемы стабилизатора питания, не столь существенны и в основном не влияют на совместимость данных плат друг с другом и с Arduino.
Убедившись в работоспособности и корректной отработке временных интервалов можно приступать к написанию более серьёзной программы.
Написание программы средней сложности
Для примера была поставлена задача спроектировать устройство, управляющее включением и отключением освещения на основе сигнала с датчика препятствия. Но это будет не просто включение и выключение, а при срабатывании датчика яркость освещения будет быстро нарастать до максимума и, после пропадания сигнала, по истечении заданного времени яркость должна плавно уменьшаться до полного погасания.
В микроконтроллере будет задействована ШИМ и логика работы программы будет следующей:
- периодически опрашивается состояние датчика и если он сработает, начнётся первый цикл быстрого нарастания яркости от нуля до максимума;
- по достижении максимальной яркости пойдёт отсчёт времени включённого состояния, по истечении которого, если датчик уже выключен, начнётся второй цикл медленного уменьшения яркости до полного отключения освещения;
- но если по истечении времени включённого состояния, от датчика всё ещё есть сигнал, то цикл уменьшения яркости не начнётся, и снова пойдёт отсчёт времени включённого состояния;
- в ситуации, когда по истечении времени включённого состояния, сигнала от датчика уже нет и начнётся второй цикл медленного уменьшения яркости, но не достигнув полного отключения освещения сигнал с датчика снова появится, то будет произведено завершение второго цикла уменьшения яркости, и уровень яркости в данный момент времени будет передан первому циклу, и яркость снова увеличится до максимума и опять пойдёт отсчёт времени включённого состояния.
Окончательный текст программы выглядит следующим образом:
// назначение номеров выводов:
const byte sensorPin = 12; // номер вывода для подключения датчика
const byte PWMPin = 11; // номер вывода для подключения светодиода
// установка времени включения в секундах
#define ontime 7
// сколько времени будет светиться светодиод
// после достижения максимальной яркости
// переменные
byte brightness = 0; // начальная яркость светодиода
long timeout = ontime*1000; // конвертирование времени включённого состояния
// из секунд в миллисекунды
// функция начальной настройки
void setup() {
// настройка PWMpin как выход:
pinMode(PWMPin, OUTPUT);
// установка начальной яркости:
analogWrite(PWMPin, brightness);
// настройка sensorPin как вход:
pinMode(sensorPin, INPUT);
// включение подтягивающего резистора:
digitalWrite(sensorPin, HIGH);
}
// основной цикл программы
void loop() {
// проверка срабатывания датчика:
if (digitalRead(sensorPin) == LOW) {
// увеличение яркости от 0 до 255 с шагом в 5 делений:
for (int fadeValue = ((brightness/5)*5)+5 ; fadeValue <= 255; fadeValue += 5) {
brightness = fadeValue; // изменение яркости
analogWrite(PWMPin, brightness);
// ожидание 5 миллисекунд до следующего шага:
delay(5);
}
delay(timeout); // ожидание на установленное время включения
}
// уменьшение яркости от 255 до 0 с шагом в одно деление:
for (int fadeValue = brightness-1 ; fadeValue >= 0 && digitalRead(sensorPin) != LOW; fadeValue -= 1) {
brightness = fadeValue; // изменение яркости
analogWrite(PWMPin, brightness);
// ожидание 15 миллисекунд до следующего шага:
delay(15);
}
}
Сначала назначаются номера выводов отладочной платы для подключения датчика и светодиода. В качестве вывода для подключения датчика может быть назначен любой цифровой или аналоговый вывод отладочной платы Arduino. А вот вывод для подключения светодиода должен поддерживать широтно-импульсную модуляцию и на отладочной плате Arduino Pro Mini это могут быть выводы 3, 5, 6, 9, 10 или 11. В данном случае используется вывод 11, потому что он у нас уже распаян.
Далее задаётся время включённого состояния освещения, для удобства в секундах. Определяется начальная яркость светодиода и конвертируется ранее заданное время включённого состояния из секунд в миллисекунды. Это нужно для последующего использования этого значения в программе, потому что используемая здесь функция задержки работает со значением в миллисекундах.
Потом идёт функция настройки, задающая определённые выводы как входы/выходы и устанавливающая необходимые значения на них. Это происходит один раз, при запуске микроконтроллера, и далее после функции настройки следует основной цикл программы, который будет повторятся бесконечно, пока работает микроконтроллер. Это стандартные и обязательные функции Arduino.
В основном цикле пишется текст самой программы, то — что будет делать микроконтроллер во время своей работы. В нашем случае сначала проверяется состояние датчика, и если он не сработал, то так будет продолжатся бесконечно, без произведения каких-либо других действий. После срабатывания датчика, по условию начинается цикл увеличения яркости в функции «for». В условии цикла стоит выражение «fadeValue = ((brightness/5)*5)+5» которое мы рассмотрим немного позже. Ну а пока работает этот первый цикл, то происходит увеличение значения на выходе с шагом в 5 делений и соответствующее увеличение яркости с каждым проходом цикла. По достижении этого значения своего максимального уровня 255 происходит завершение цикла и начало отсчёта времени включённого состояния, по истечении которого во втором цикле проверяется условие наличия сигнала с датчика, и если сигнал отсутствует начинается второй цикла уменьшения яркости до нуля. Наличие сигнала с датчика проверяется при каждом проходе цикла, и если до снижения яркости до нуля сигнал с датчика снова появится, то произойдёт преждевременное завершение второго цикла и значение уровня яркости в данный момент времени будет передано первому циклу, и яркость снова увеличится до максимума и весь процесс повторится.
Так зачем же нужно такое, на первый взгляд абсурдное, выражение fadeValue = ((brightness/5)*5)+5. Абсурдным его можно назвать с точки зрения привычной всем нам арифметики, но с точки зрения чисел в микроконтроллере, это выражение округляет предыдущее значение яркости до большего числа, кратному пяти. Дело в том, что в цикле увеличения значения яркости происходит увеличение на 5 единиц, а цикл завершается, если значение fadeValue станет больше 255. При этом значение яркости brightness всегда будет на 5 единиц меньше и будет иметь уровень brightness=fadeValue-5. При нулевом значении начальной яркости цикл завершится при значении fadeValue=260 и конечная яркость будет 255. Но если после преждевременного завершения второго цикла уменьшения яркости в первый цикл будет передано значение не кратное пяти, то цикл увеличения яркости может завершится со значением fadeValue=256 и тогда максимальная яркость не будет достигнута и переменная brightness будет иметь значение fadeValue-5=251. Что бы этого не происходило и яркость всегда достигала бы максимального значения, происходит деление предыдущего значения на 5, а потому что brightness у нас имеет тип данных byte, то это целое число без плавающей запятой, и снова умножив результат на 5 получается значение, кратное пяти. Так как первый цикл — это увеличение яркости, то к полученному числу ещё прибавляется 5, что бы значение яркости начало возрастать и не было бы меньше значения после преждевременного завершения цикла уменьшения яркости.
Если по истечении времени включённого состояния сигнал от датчика продолжает поступать, то второй цикл уменьшения яркости не начнётся. Так же будет пропущен первый цикл, потому что ему будет передано значение яркости 255, и после выражения fadeValue = ((brightness/5)*5)+5 значение переменной fadeValue будет 260, а по условию это больше для начала цикла. Опять начнётся отсчёт времени включённого состояния, и так будет происходить до тех пор, пока сигнал от датчика не пропадёт. В это время не будут производится никакие другие действия и уровень яркости будет поддерживаться на максимальном значении равным 255.
Данный текст программы несколько дней обсуждался на форуме по Arduino и постепенно доводился до совершенного. Так же было произведено наблюдение за значением переменной brightness в четырёх точках программы при разных вариантах срабатывания и отключения датчика. Наблюдение производилось через монитор серийного порта со следующим текстом программы:
const byte sensorPin = 12;
const byte PWMPin = 11;
#define ontime 5
byte brightness = 0;
long timeout = ontime*1000;
void setup() {
// Инициализация последовательного соединения:
Serial.begin(9600);
pinMode(PWMPin, OUTPUT);
analogWrite(PWMPin, brightness);
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH);
}
void loop() {
if (digitalRead(sensorPin) == LOW) {
for (int fadeValue = ((brightness/5)*5)+5 ; fadeValue <= 255; fadeValue += 5) {
brightness = fadeValue;
analogWrite(PWMPin, brightness);
// Отправка в монитор последовательного порта значения brightness:
Serial.print(«Значение яркости в первом цикле — 1: «);
Serial.println(brightness);
delay(10);
}
delay(timeout);
}
// Отправка в монитор последовательного порта значения brightness:
Serial.print(«Значение яркости после первого цикла — 1-1: «);
Serial.println(brightness);
delay(40); // задержка для наблюдения результата
for (int fadeValue = brightness-1 ; fadeValue >= 0 && digitalRead(sensorPin) != LOW; fadeValue -= 1) {
brightness = fadeValue;
analogWrite(PWMPin, brightness);
// Отправка в монитор последовательного порта значения brightness:
Serial.print(«Значение яркости во втором цикле — 2: «);
Serial.println(brightness);
delay(15);
}
// Отправка в монитор последовательного порта значения brightness:
Serial.print(«Значение яркости после второго цикла — 2-2: «);
Serial.println(brightness);
delay(40); // задержка для наблюдения результата
}
Вот так выглядит наблюдение за монитором последовательного порта в результате работы данной программы:
Значение яркости после первого цикла — 1-1: 0
Значение яркости после второго цикла — 2-2: 0
Значение яркости после первого цикла — 1-1: 0
Значение яркости после второго цикла — 2-2: 0
Значение яркости в первом цикле — 1: 5 // датчик сработал и начался цикл увеличения яркости
Значение яркости в первом цикле — 1: 10
Значение яркости в первом цикле — 1: 15
Значение яркости в первом цикле — 1: 20
Значение яркости в первом цикле — 1: 25
Значение яркости в первом цикле — 1: . . .
Значение яркости в первом цикле — 1: 240
Значение яркости в первом цикле — 1: 245
Значение яркости в первом цикле — 1: 250
Значение яркости в первом цикле — 1: 255
Значение яркости после первого цикла — 1-1: 255
Значение яркости после второго цикла — 2-2: 255
Значение яркости после первого цикла — 1-1: 255
Значение яркости во втором цикле — 2: 254 // датчик отключился и начался цикл уменьшения яркости
Значение яркости во втором цикле — 2: 253
Значение яркости во втором цикле — 2: 252
Значение яркости во втором цикле — 2: 251
Значение яркости во втором цикле — 2: . . .
Значение яркости во втором цикле — 2: 185
Значение яркости во втором цикле — 2: 184
Значение яркости во втором цикле — 2: 183
Значение яркости во втором цикле — 2: 182
Значение яркости после второго цикла — 2-2: 182 // датчик снова сработал
Значение яркости в первом цикле — 1: 185
Значение яркости в первом цикле — 1: 190
Значение яркости в первом цикле — 1: 195
Значение яркости в первом цикле — 1: 200
Значение яркости в первом цикле — 1: . . .
Значение яркости в первом цикле — 1: 245
Значение яркости в первом цикле — 1: 250
Значение яркости в первом цикле — 1: 255
Значение яркости после первого цикла — 1-1: 255
Значение яркости во втором цикле — 2: 254 // датчик отключился и начался цикл уменьшения яркости
Значение яркости во втором цикле — 2: 253
Значение яркости во втором цикле — 2: 252
Значение яркости во втором цикле — 2: 251
Значение яркости во втором цикле — 2: 250
Значение яркости во втором цикле — 2: . . .
Значение яркости во втором цикле — 2: 5
Значение яркости во втором цикле — 2: 4
Значение яркости во втором цикле — 2: 3
Значение яркости во втором цикле — 2: 2
Значение яркости во втором цикле — 2: 1
Значение яркости во втором цикле — 2: 0
Значение яркости после второго цикла — 2-2: 0
Значение яркости после первого цикла — 1-1: 0
Значение яркости после второго цикла — 2-2: 0
Как можно видеть, ни один цикл не начинается, пока не сработает датчик препятствия, или при достижении максимальной яркости с включённым датчиком. Вот так это выглядит графически если открыть визуальное отображение данных с последовательного порта:
В устройстве был использован инфракрасный датчик препятствия, описанный в ранней статье:
Устройство и характеристики датчика Вы можете посмотреть перейдя по ссылке /me/review/review61.php
Во время проверки и тестирования этого датчика было отмечено довольно большое потребление тока для автономных устройств. В некоторой степени это можно исправить, отказавшись от индикаторных светодиодов и немного пожертвовав дальнодействием. На плате датчика имеется два индикаторных светодиода — один для индикации подачи питания, и другой для визуального контроля срабатывания датчика. Для отключения индикации нужно будет удалить с платы два токоограничительных резистора, включённых последовательно со светодиодами. Я рекомендую удалять именно резисторы, а не светодиоды, потому что во время удаления, светодиоды могут повредится и при надобности, для восстановления индикации на модуле датчика, нужно будет установить новые светодиоды, а в случае с резисторами, можно будет вернуть на место прежние. Кроме того не рекомендуется паять светодиоды поверхностного монтажа больше одного раза, а на плате модуля установлены именно такие светодиоды. Избавившись от индикации получается небольшой выигрыш по потребляемому току, но ещё больший выигрыш можно получить, увеличив сопротивление токоограничительного резистора излучающего инфракрасного светодиода. При этом с уменьшением потребляемого тока так же уменьшится дальнодействие датчика, и поэтому значение сопротивления данного резистора придётся подобрать под удовлетворительное дальнодействие. Делается это следующим образом. Подстроечным резистором на плате модуля нужно установить максимальную чувствительность, при которой сохраняется стабильное срабатывание. Затем нужно подобрать такое значение токоограничительного резистора светодиода, при котором достигается удовлетворительное для Вас дальнодействие. Завершив подбор резистора, можно ещё немного прибавить чувствительность подстроечным резистором, не нарушая стабильности и устойчивости датчика. Элементы, которые нужно удалить выделены красным цветом, а заменённый токоограничительный резистор зелёным:
После указанных изменений можно добиться уменьшения потребляемого тока в два раза при приемлемом дальнодействии датчика препятствия.
Модуль инфракрасного датчика препятствия и светодиод были соединены с рассматриваемой в данной статье отладочной платой по следующей схеме:
Перед включением, в микроконтроллер надо загрузить основную программу. Для этого снова подключаем программатор в соответствии с нужными выводами для программирования:
Далее в среде разработки нужно произвести загрузку программы. Текст программы написан без ошибок и компиляция с загрузкой завершаются успешно:
После загрузки программы в микроконтроллер, датчик препятствия и светодиод были соединены с отладочной платой проводами с разъёмами на концах. Вот так выглядит вся система в макете:
Для питания использовался обрезанный USB-кабель, подключённый к зарядному устройству:
К отладочной плате подсоединены два разъёма — один для питания, другой для входного и выходного сигналов:
Светодиод был использован сверхяркий, высокоэффективный, с номинальным рабочим током 150 мА:
После подачи питания и срабатывания датчика, как и ожидалось, яркость светодиода быстро нарастала до максимальной, а далее, после пропадания сигнала с датчика, по истечении времени включённого состояния, яркость медленно снижалась до полного погасания светодиода:
Также Вы можете посмотреть видео работы устройства и скачать исходные тексты программ. Это был просто пример самостоятельно работающей полезной программы на микроконтроллере AVR, но на его основе можно собрать разнообразные конструкции, и используя датчики разного типа и светодиоды большой мощности с питающими драйверами можно найти этому устройству применение в автоматических осветительных установках.
Всем спасибо за внимание, задавайте вопросы, оставляйте отзывы и пожелания. Подписывайтесь на статью, потому что в дальнейшем Я расскажу и покажу как использовать данную отладочную плату без загрузчика, как изготовить простой самодельный COM-ISP программатор и добавить его поддержку в среду разработки Arduino IDE. Так же на примере описанной здесь платы покажу как считывать и загружать прошивки с помощью указанного программатора и программы Uniprof. После выхода новой статьи здесь будет добавлена ссылка на неё.
Прикрепленные файлы:
- Arduino_Pro_Mini_schematic.pdf (59 Кб)
- arduino-pro-mini-reference-design.zip (99 Кб)
- ArduinoProMini16MHz.pdf (315 Кб)
- Atmega328P.pdf (5938 Кб)
- Sensor_with_PWM_Debug.ino (2 Кб)
- Sensor_with_PWM.ino.ino (3 Кб)