Attiny85 драйвер как установить
Итак начнем с разбора самой платы и ёё возможностей .
ATtiny85 — небольшой микроконтроллер с приличными возможностями и приятными особенностями, включая:
Плата разработчика ATTINY85 предназначена для разработки устройств с минимальными требованиями к периферии и возможностью непосредственного подключения к USB интерфейсу компьютера для программирования и отладки. Для подключения к компьютеру не требуется кабеля - контроллер подключается непосредственно в USB разъем. У контроллера выведено 6 выходов и все они доступны для использования. Два зарезервировано для работы с USB интерфейсом, к одному подключен светодиод. Для разработки можно использовать среду разработки Arduino IDE (OSX/Win/Linux).
Питаться устройство может от USB интерфейса, внешнего источника напряжением 5В и напряжением от 7В до 12В от внутреннего стабилизатора напряжения 5В 500мА. Переключение источника питания происходит автоматически.
Функции выводов контроллера:
- Р0 - ARef, SDA, DI, PWM
- P1 - DO, PWM
- P2 - D/A, SCK
- P3 - D/A, USB+
- P4 - PWM, D/A, USB-
- P5 - D/A
Характеристики:
- Микроконтроллер: ATTINY85
- Внутренний генератор: 8МГц
- Встроенный умножитель частоты: 8
- Объем памяти программ: 8Кбайт (6Кбайт доступных)
- Аппаратные интерфейсы: SPI, I2C
- ШИМ: 3 канала
- АЦП: 4 канала
- Индикаторы: Питание Состояние (Pin0)
Пинмапинг и распиновка
Покупал я платы на Алиэкспресс :
Устанавливаем своеобразный плагин для среды Arduino (поддерживается начиная с версии 1.6.5).
Вставляем в поле Additional Boards Manager URLs строку
Переходим в меню Инструменты — Boards Manager:
В выпадающем списке Type выбираем Contributed, а затем щелкаем по Digistump AVR Boards, при этом появится кнопочка Install, которую и нажимаем:
Начнется скачивание и установка софта и драйверов. Говорим, что согласны на все:
Выбираем рекомендованную для начинающих плату Digispark (Default — 16,5mhz) - выбираем вашу плату :
Теперь можем перейти в раздел примеры - digispark и выбрать понравившийся вам тестовый скетч :
В отличие от классических плат Arduino, эту плату не нужно подключать к компьютеру перед загрузкой прошивки. Наоборот, сначала нужно запустить загрузку из среды Arduino и дождаться приглашения к подключению контроллера. Вот теперь — можно.
Таймаут на загрузку — 60 секунд:
Связано это с особым режимом работы загрузчика: при старте контроллера он ждет загрузки кода через USB в течение 5 секунд, а потом переключается в режим исполнения имеющегося в памяти контроллера кода.
Иными словами, если контроллер подключить к компьютеру до приглашения, то спустя пять секунд он начнет выполнять имеющийся код (если есть), а чтобы загрузить новый, нужно отключить и снова подключить плату к компьютеру.
В конце концов, ПРОСТО загрузить USB-Linux c arduino ide под него.
Нет-же, в этот раз свет клином сошелся на Диджиспарке и ДЕСЯТКЕ — зря что-ли платил $3 за ESD-лицензию?.
"Уж если я чего решил, то выпью обязательно" пел Высоцкий, и как Вы поняли — таки да!
Ладно, с присказками закончили — бутаем комп, заходим в биос.
Находим пункт устройства/порты — USB — да, Digispark не работает с USB-3
Отключаем совместимось USB3-Disable (У некоторых просто может выставляться режим порта — ставим USB-2 Compatible)
У меня этот пункт назывался xHCI — Disable
Не торопитесь выходить — включите отладку — Debug-Enable
Опять на моем биосе эта функция зовется иначе — EHCI — Enable
Гуд? Загрузили винду?
Не торопитесь входить в ArduinoIde!
Снесите для начала Все установленные ранее дрова под digistump/digispark!
WIN-x — выполнить — regedit — поиск ищем digistump в реестре и беспощадно удаляем, F3 — поиск дальше!
Повторяем процедуру со словом digispark.
Контролный reboot в голову — винда все-же ;-)
Теперь нам нужно сделать две закачки — правильный комплект дров с лоадером — micronucleus по ссылке
У меня это была версия micronucleus-2.0a4-win.zip
Еще нужна прога ArduinoIde с предустановленной поддержкой Digispark-a — идем сюда:
качаем последний ArduinoIDE, моя версия(на 07.06.2018) — DigisparkArduino-Win32-1.0.4-May19.zip, извлекаем содержимое.
На 64-битке — работает!
Распаковываем/сетапим наш микронуклеус драйвер.
Окей, запускаем DigisparkArduino версии 1.0.4!
Старый? А Вам Шашечки или Ехать?
Its a Sparta — это винда!
Лулзов добавляет, трейдмарк Sparta, под которым у меня импульсный паяльник и набор отверточек.
Но не торопитесь подключать плату в Usb порт!
Выбираем (в ArduinoIDE ) Сервис-Плата-Digispark (Tiny Core)
Наконец пришло время поморгать светодиодом ;-)
Загружаем Ctrl-U (ведь правда мы еще не вставляли плату в ЮСБ? ЭТО ВАЖНО!!)
Вот только после такой надписи внизу — включаем Digispark в порт.
иначе он будет бесцельно блинкать появляясь и исчезая в устройствах — как первый спутник земли!
Если ВСЕ пункты выполнялись внимательно и последовательно, то мы получим подобную картинку
Представляю вашему вниманию новый компактный Bootloader для AVR Tiny 45/85. Данный автозагрузчик распространяется под лицензией GNU GPL, как того требует лицензия V-USB. Основой для данного автозагрузчика послужил ATtiny85 USB Boot Loader от Embedded Creations и его потомок micronucleus-t85, используемый платами Digispark.
Также как и вышеупомянутые, TinyHID Loader основан на библиотеке V-USB.
Ключевые особенности:
А почему вообще AVR Tiny 85?
Экономика должна быть экономной, господа. А с AVR Tiny x5 вы экономите дважды да ещё и в двух вопросах. Первый — это вопрос цены: «тиньки» дешевле «мег». Но персонально у Tiny x5 есть PLL генератор, позволяющий также отказаться от кварцевого резонатора. Так что экономим на нём да и на двух конденсаторах. Кроме того есть ещё и вопрос места на плате. В QNF корпусе таракан размером 2,5 на 2,5 мм. И снова нам не нужен резонатор. Всю схему можно легко уместить на смехотворных 12x5 мм. Как резюме — использование AVR Tiny 85 уместно всегда, и особенно для USB девайсов пока не появится необходимость в функционале, которого данный таракан не поддерживает (например когда нужно много IO портов)
А зачем специальный автозагрузчик?
Автозагрузчиков для AVR Mega пруд пруди, но с Tiny 85 всё не так просто. Для понимания этих сложностей, излагаю алгоритм работы классики:
- Если конфигурационный бит BOOTRST установлен в 0, то после перезапуска контроллер начинает исполнение не с нулевого адреса, а с Boot Reset Address (специфичен для разных моделей и может настраиваться).
- По Boot Reset Address располагается сам автозагрузчик, который первым делом перемещает таблицу прерываний на Boot Reset Address.
- автозагрузчик определяет, нужно ли грузиться ему самому или нет. Если нужно, то он запускается как обычная прошивка, хоть и расположенная не в нулевом адресе.
- Если загружать автозагрузчик не надо, то он перемещает таблицу прерываний обратно на нулевой адрес, и переводит туда же управление, тем самым загружая прикладную прошивку.
- Во время записи данных на Flash, автозагрузчик продолжает работать с USB протоколом, отвечая на запросы хоста.
- Также область памяти автозагрузчика является незаписываемой, что не даёт автозагрузчику повредить себя.
А теперь нюансы 85-ой Tiny:
- ATtiny всегда загружается с нулевого адреса, сконфигурировать его на другой адрес нельзя.
- Вектора прерываний также никуда не переносятся.
- Во время записи контроллер приостанавливает работу на 4.5 мс, и не на что не способен реагировать.
- Ну и аппаратной защиты от самозаписи у автозагрузчика тоже нет.
И способы обхода.
- Очищенная память заполнена единицами, которые трактуются контроллером как NOP. А это значит что после сброса, управление до автозагрузчика таки дойдёт. Хоть перед этим и будет выполнены полторы тысячи NOP-ов.
- Но для функционирования USB протокола этого ещё мало. Нужна также реакция на прерывание PCINT0. Таблицу векторов прерываний перемещать нельзя, но можно записать в эту таблицу адреса автозагрузчика. Поэтому сразу после первой загрузки автозагрузчик записывает в RESET и PCINT0 вектора адреса своих обработчиков.
- Во время записи прикладной прошивки автозагрузчик также заменяет RESET и PCINT0 вектора.
- Изначальные RESET и PCINT прикладной прошивки автозагрузчик пишет в адреса непосредственно перед автозагрузчиком.
- Доработка V-USB шного обработчика PCINT0 таким образом, чтобы он мог вызывать PCINT0 обработчик прикладной прошивки. Условием для работы обработчика автозагрузчика считаем TCCR1 == 0 && TCNT1 == 0xff. Иначе запускаем обработчик приложения.
- Задержка перед выполнением записи или очистки памяти. В это время контроллер успевает сообщить хосту о успехе операции, и хост его не теряет.
- После проведения операции очистки памяти, автозагрузчик всегда записывает свои вектора RESET и PCINT0.
- Перед записью прикладной прошивки, автозагрузчик производит очистку FLASH из конца в начало. Такое направление очистки гарантирует, что даже если процесс очистки/записи будет прерван неожиданным отключением питания, автозагрузчик останется в рабочем состоянии. Либо первая страница FLASH ещё не затёрта/уже записана, и управление на автозагрузчик перейдет по вектору. Либо очищена вся память, и управление перейдет на автозагрузчик через цепочку NOP-ов.
- Производится программная проверка записи в автозагрузчик вместо аппаратной.
Более подробно о особенностях работы автозагрузчика на AVR Tiny 85 можно почитать на сайте Embedded Creations на английском
А зачем изобретать велосипед?
Использование классических MEGA-вских автозагрузчиков на AVR tiny не возможно по причинам, описанным в предыдущей главе. Но даже без них есть 2 реализации автозагрузчика: ATtiny85 USB Boot Loader и micronucleus-t85, и обе они эмулируют некогда популярный программатор USBasp. А вышеупомянутый программатор работает на хосте через библиотеку libusb. Это замечательная и многофункциональная библиотека, и её использование под Mac OS или Linux элементарно как 2x2. И если вы свои творения собираетесь использовать сами, то TinyHID Loader вам может приглянуться разве что более компактными размерами. Но вот под Windows 8.1 x64 установка libusb драйвера уже не является тривиальной задачей. Глубоко-глубоко в настройках есть пункт, позволяющий разово перезагрузить компьютер с отключенной проверкой электронной подписи драйверов. И горе тому, кто будет объяснять типичному юзеру этот способ. Поэтому основной идеей было создание автозагрузчика, способного работать через HID Feature Report-ы. Для всех HID устройств используются стандартные драйвера ОС, и дополнительные ставить не надо. Также оказалось, что отказ от поддержки avrdude приносит возможность сократить вес загрузчика. При отключении всех опций кроме записи/очистки FLASH и программного выхода в прикладную прошивку, автозагрузчик весит 2кб, что меньше чем у конкурентов.
А как использовать?
Для начала нужно сконфигурировать прошивку. Для этого нужно скорректировать файл firmware/usbloader/usbloader.h под вашу схему и ваши нужды:
При этом не нужно заботиться, чтобы USB_CFG_DPLUS_BIT попал на ногу INT0, так как автозагрузчиком используется прерывание PCINT0, которое можно сконфигурировать на любую ногу.
В приведённом выше варианте загрузчик укладывается в 2кб, хотя и впритык. Включение любых дополнительных опций выведет его за эти пределы, и придётся заодно менять его расположение в памяти. Делается это по разному в зависимости от того, используете ли вы AtmelStudio, или Makefile
Atmel Studio
Удостоверьтесь, что выбрана конфигурация Release.
Откройте свойства проекта, перейдите на вкладку Toolchain, и в пункте «AVR/GNU Linker/Memory Settings» уменьшите значение ".text=0xc00". Уменьшать можно только порциями по 32 слова. То есть 0xbe0, 0xbc0, 0xba0. 0xba0 хватит для работы всех доступных опций, дальше уменьшать не надо. Помимо этого, нужно также уменьшить значение константы BOOTLOADER_WADDRESS. Это можно сделать на странице «AVR/GNU C Compiler/Symbols». Значение должно равняться значению ".text bash">TinyLoaderCmd.exe firmware.hex
А если в вашей прошивке добавить функцию загрузки автозагрузчика:
То перепрошивка превратиться для пользователя в нажатие одной кнопки. А ваш проект в то время:
- Сообщит вашей прошивке, что нужно загрузить автозагрузчик.
- Дождётся (Loader.TryGetLoader) момента, когда система подцепит автозагрузчик.
- Запишет новую прошивку.
- Сообщит автозагрузчику, что нужно загрузить прошивку.
- Дождётся момента, когда система подцепит вашу новую прошивку.
А если понадобился другой набор опций?
Поставили полный набор опций и новая прошивка теперь не влезает? Или жалеете, что не добавили возможность чтения памяти? Ну или вам вообще не подходит TinyHID Loader, и без avrdude жизнь не мила? А ведь микроконтроллер уже не только прошит, но и запаян. И выпаивать его совсем не хочется. Не вопрос — TinyHID Loader умеет перерошивать сам себя!
Алгоритм самоперепрошивки такой:
Digispark – неофициальное семейство Arduino-совместимых плат от Digistump. Эти ребята из США делают отладочные платы на различных микроконтроллерах и шилды для них. Китайцы быстро смекнули, что дигиспарк на базе ATtiny85 – отличная штука и начали продавать свою версию. До кризиса полупроводников плата стоила около 80 рублей – что весьма приятно для основы небольшого проекта. В этом уроке рассмотрим именно дигиспарки на базе ATtiny85, вы можете видеть их на картинке выше в разных модификациях.
Купить на Aliexpress
Дёшево купить Дигиспарк всех трёх видов можно тут: ссылка, ссылка, ссылка.
Версии плат
Первая сама плата вставляется в USB, вторая и третья – подключается по micro USB. Отдельное спасибо тому, кто проектировал плату: работать с ней на брэдборде – то ещё приключение.
Четвёртая плата является “пустышкой”, в которую можно вставить ATtiny в DIP-8 корпусе. Пины выведены так, что можно удобно подключать USB ASP программатор, но работать на макетке опять же не выйдет. Можно прошить загрузчик от дигиспарк и прошиваться по USB.
В чём прикол?
ATtiny85 – микроконтроллер AVR из младшей серии, имеет всего 8 ножек. А также:
- Flash память: 8 кБ
- SRAM память: 512 Б
- EEPROM память: 512 Б
- Частота ядра: до 32 МГц внутренний клок
- Таймеры: 2 штуки 8 Бит
- GPIO: 6 пинов (5 + RST)
- ШИМ: 3 пина
- АЦП: 10 Бит 4 пина
- USI: UART, I2C
- SPI
- Макс. ток с пина: 20 мА
В то же время это относительно свежая модель и в ней используются некоторые новые технологии, которых нет в той же ATmega328 (Arduino UNO/Nano), например:
- PLL – умножитель частоты. МК может тактироваться от внутреннего источника с частотой 16 МГц и выше (мы разгоняли до 32 МГц)
- Соответственно высокочастотный ШИМ
- Улучшенный таймер, умеет делать аппаратный deadtime
- Встроенный усилитель АЦП – можно измерять термопару без внешних железок
- Дифференциальный АЦП
Основная фишка этих плат – программный USB, то есть USB порт подключен напрямую к пинам микроконтроллера! Что это даёт:
- Плата может прикидываться USB HID устройством (клавиатура, мышь, геймпад, MIDI)
- Загрузка прошивки по USB (используется загрузчик Micronucleus )
- Экономия на отсутствии USB-UART преобразователя, плата стоит дешевле
- Можно спалить компьютер, если неаккуратно подключать USB пины во всякое
Официальная документация
Начало работы
Прошивка загружается следующим образом: ПЛАТУ НЕ ПОДКЛЮЧАЕМ, ПОРТ НЕ ВЫБИРАЕМ, нажимаем загрузка, ждём компиляции. Появится надпись “подключите плату”. Втыкаем плату в USB и прошивка загружается.
Распиновка
- Цифровые пины – по подписям на плате (без буквы): подадим HIGH на P0: digitalWrite(0, HIGH)
- К аналоговым пинам – по номеру вывода АЦП (как на распиновке). Читаем с пина P2: analogRead(1)
Пройдёмся по особенностям пинов:
- P0: ничего особенного
- P1: подключен светодиод. Пин не может работать в режиме INPUT_PULLUP
- P2: ничего особенного
- P3: USB пин. Подтянут к VCC резистором на 1.5 кОм
- Не трогать этот пин, если нужна работа USB, также на момент загрузки прошивки!
- Нет смысла в режиме INPUT_PULLUP
- Не трогать этот пин, если нужна работа USB, также на момент загрузки прошивки!
- Не использовать как выход
- Не подавать низкий сигнал (МК перезагрузится)
- Можно измерять аналоговый сигнал до VCC/2 (до 2.5V при питании от 5V)
Стороннее ядро
Официальное ядро Digispark не обновлялось с 2016 года, при наличии ISP программатора рекомендуется использовать вот это ядро, для чего нужно будет прошить загрузчик (подробно разбирали вот в этом уроке).
Библиотеки
Большинство Arduino-библиотек совместимы с дигиспарком, также у него есть свой набор встроенных библиотек (ссылка на библиотеки в новом ядре). Из них можно выделить:
Обычно, для перехода от идеи к реализации, необходим прототип устройства, удобный для проверки и отладки на месте, что особенно важно для мобильного устройства. Далее постараюсь максимально подробно разобрать процесс создания прототипа беспроводного сенсора на базе ATtiny85.
Цель — создать сенсор работающий, условно говоря, в коробке с искусственным освещением и передающий температуру и статус освещения с немедленной реакцией на изменение освещения: включилось, отключилось, мигнуло. Сенсор решено было сделать мобильным и питать от элемента CR2032, иначе говоря, при разряде до 2.7V (предел для датчика TMP36), можно рассчитывать на 200mAh.
Микроконтроллер ATtiny85 имеет всего 5 портов ввода/вывода и возможность отключить RESET в пользу дополнительного порта. Данный бюджет был распределён следующим образом:
- 3 порта — радиомодуль NRF24L01+, спецификация требует пять портов, но в данном случае это не приемлемо и будет использована 3-х пиновая конфигурация;
- 1 порт — датчик освещения на базе фототранзистора BPW17N;
- 2 порта — температурный датчик на базе TMP36, второй порт нужен для подачи питания, чтобы иметь возможность отключать датчик при необходимости.
Элементная база определена, можно приступать к проектированию.
RESET в качестве порта ввода/вывода
Ситуация требует использовать RESET в качестве порта ввода/вывода. Однако RESET необходим для программирования микроконтроллера, в том числе и для прошивки настроек (Fuses). Соответственно, после отключения RESET программировать устройство будет не возможно. Таким образом, чтобы не получить «кирпич» первым делом необходимо раздобыть высоковольтный (12V) программатор, для сброса Fuse-ов.
Подходящую схему и скетч для Arduino можно найти по ссылке ATTiny Fuse Reset with 12 Volt Charge Pump. Данная схема не требует дополнительного питания, и для получения 12V используется умножитель (Charge Pump).
Схема находится на сайте по ссылке, расположенной выше.
На вывод (4) подается питание 5V, при этом на выводе (2) устанавливается низкий уровень (земля), конденсатор C1 заряжается до 5V. Затем на (2) подается 5V и на обкладках С1 образуются 10V, они через диод D2, при низком уровне на (3), попадают на C2. Затем уровни на (3) и (2) меняются местами и уже 15V поступают на C3, следующая итерация сливает 20V (на самом деле ~17V) на C4. Затем напряжение через делитель R2/R3 попадает на аналоговый вход A0, где сравнивается с опорным значением, и если напряжение выше 12V, то раскачка (смена уровней на (2) и (3)) выключается. Транзистор Q1 нужен для быстрой разрядки конденсаторов и формирования необходимого импульса для программатора. Резисторы на выводах ATtiny85 необходимы для защиты микроконтроллера при неправильном подключении.
У меня получился следующий дизайн:
Неудобно, что USB разъём накрывает контактные пины, но дизайн платы таков, что здесь к микроконтроллеру сложно даже штатное питание подвести. Проще говоря, было место на плате, появилась идея добавить пины для подключения обычного программатора в следующей конфигурации:
Позже стало очевидно, что использовать схему в таком виде целесообразно только в самом крайнем случае.
Принципиальная схема
Разработка схемы вместе с макетной платой будет производится в KiCad EDA, это свободный пакет для автоматизации разработки электронных схем.
Исходные файлы KiCad проекта размещены на GitHub, в папке attwlight_sensor.pcb.
Существует множество хороших инструкций по работе с данным редактором, например стоит посмотреть ролик на YouTube KiCAD Quick-Start Tutorial.
Если совсем кратко, то для начала работы над схемой в KiCad достаточно запустить редактор схемы и справа пройтись по иконкам, чтобы добавить: элементы , питание , провода и метки .
Метки нужны, чтобы не загромождать схему проводами. При разводке печатной платы все одинаковые метки необходимо будет соединить дорожками.
Если в доступных библиотеках нет необходимого элемента его можно создать с нуля либо изменить один из существующих. В последнем случае достаточно поставить курсор на нужный элемент и нажать Ctrl+E (редактировать элемент в редакторе) и в новом окне: создать элемент из текущего , отредактировать его внешний вид и свойства , затем сохранить в новую библиотеку .
Чтобы созданную библиотеку можно было использовать, её необходимо подключить в , воспользовавшись кнопкой Add в верхней части. Для добавления в библиотеку других элементов, её нужно выбрать и после добавления сохранить .
По сути, устройство состоит из трех независимых частей. Проверив их по отдельности вполне можно ожидать, что в сборе всё заработает как было задумано. Прототип как раз и нужен, чтобы проверить насколько данное ожидание соответствует действительности. Ниже, в комментариях к схеме, я остановлюсь на том, что пошло не так.
Датчик температуры TMP36
В рабочем режиме питание на датчик подается с порта PB5 микроконтроллера. В отладочной конфигурации подать питание на датчик можно установив перемычку между выводами VCC и D10 контактной площадки P2. Сигнал RESET активен при низком уровне и высокий уровень не мешает работе микроконтроллера и даже увеличивает стабильность по сравнению с висящим в воздухе RESET. Для съема данных с датчика используется аналоговый порт ADC2.
Радиомодуль NRF24L01+
Нумерация выводов у штыревых разъёмов в KiCad не соответствует принятой для данного модуля, поэтому нумерация здесь зеркальная относительно указанной в инструкции для NRF24L01+. Для работы радиомодуля в 3х пиновой конфигурации необходимо поменять местами выводы MISO и MOSI, и добавить часть схемы справа, состоящую из элементов: R3, D1 и C2. Схема данной конфигураци взята отсюда nRF24L01+ with ATtiny85 3 Pins.
Работа данной схема возможна по тому, что на CE (chip enable) можно сразу установить высокий уровень, а CSN (chip select) нужен только для передачи модулю сигнала о начале новой команды, что достигается сбросом высокого уровня в низкий. Соответственно, CSN можно объединить с одним из оставшихся выводов, в данном случае SCK (clock). Штатные импульсы SCK не успевают зарядить конденсатор C2 и на CSN остается низкий уровень, перед началом передачи команды нужно установить на SCK высокий уровень на более длительное время, чтобы получить высокий уровень на CSN. С чем связанна необходимость поменять местами MISO и MOSI я не понял, видимо так было удобно.
Для стабильной работы модуля желательно наличие ёмкости 1-10μF на выводах питания модуля, для этих целей на схеме предусмотрен конденсатор C4.
После устранения проблем с датчиком температуры, первым делом была проверена возможность прошить ATtiny85 с установленным радиомодулем. Процесс не пошёл, avrdude ругнулся на не верную сигнатуру, но я проявил упорство и запустил прошивку… и в итоге тоже ошибка. В результате эксперимента радиомодуль не пострадал, правда и шансов что-то в него прошить не было из-за модификаций приведенных выше. А вот микроконтроллер пришлось реанимировать с помощью высоковольтного программатора. Идея оказалась неудачной, но попробовать стоило.
Микроконтроллер ATtiny85
Датчик освещения на BPW17N
С этим датчиком всё относительно просто, на него попадает только искусственное освещение, а регистрировать он должен только моменты его включения и отключения. Для максимально быстрой реакции на событие датчик генерирует прерывание на порту PCINT3 (Pin Change Interrupt).
Элементы R1 и C3 подстроечные, для них предусмотрено место на плате, но они не распаяны. С3 параллельно с фототранзистором Q1 может понадобиться, чтобы исключить дребезг сигнала. Проблема в том, что стандартный для таких случаев конденсатор 0.1μF, разряжается через резистор 10MΩ около секунды, что не приемлемо для регистрации события — свет мигнул. Соответственно, можно установить конденсатор меньшей ёмкости и/или уменьшить сопротивление резистора R2, но сначала нужно проверить, есть ли в этом смысл.
Поскольку здесь используется прерывание может показаться, что в схеме нужен компаратор, но эти мысли сразу отпадают, как только становится понятно сколько эта штука потребляет. Правда и потребление микроконтроллера, при уровне сигнала вблизи центра рабочего диапазона, подскакивает с 7μA примерно до 260μA в режиме сна. Однако данную проблему проще решить программно, а именно, после срабатывания прерывания (PCINT3 или WDT), можно проверить напряжение на аналоговом входе ADC3, если оно неприемлемо, сообщить о проблеме и пропустить активацию PCINT3. В любом случае это нештатная ситуация, которая требует внимания.
Макетная плата
Готовую схему необходимо развести на плате. Это также можно сделать в KiCad. Для этого сначала требуется завершить работу со схемой:
- Промаркировать элементы на схеме , все настройки можно оставить по умолчанию.
- Сопоставить элементы схемы с посадочными местами на плате . Появится следующее окно:
Здесь для наглядности следует включить просмотр выбранного элемента .
Поскольку предстоит работать с макетной платой необходимо следить, чтобы все посадочные места укладывались в сетку 1/10" (2.54mm). Если требуемый элемент найти не удаётся, проще назначить похожий, затем, в редакторе печатной платы, изменить его (Ctrl+E) и записать в свою библиотеку.
Как только все посадочные места будут назначены нужно сохранить результат и вернуться в редактор схемы. - Сгенерировать netlist , настройки по умолчанию вполне приемлемы.
Редактор схемы можно закрыть и перейти к редактору печатной платы . Здесь нажать , затем загрузить ранее созданный netlist , убедиться, что не было ошибок и закрыть окно. Если схема была изменена или элементам были назначены другие посадочные места, необходимо обновить netlist и загрузить его здесь снова.
При первой загрузке netlist все посадочные места окажутся стопкой в одной куче. Сначала необходимо переключить сетку на 1/10" (2.54mm), растащить элементы (используя кнопку m), убрать лишние надписи и, пользуясь подсказками редактора, соединить элементы дорожками.
Результат будет выглядеть примерно так:
Оставшиеся белые линии, указывают какие посадочные места необходимо соединить проводами. К сожалению в KiCad нет способа вывести результат, так чтобы его было удобно воспроизвести на макетной плате. Но в данном случае макетная плата получилась не большой, и с ней можно поступить просто: отключить лишние надписи , снять скриншот и зеркально отразить его по вертикали.
Тут два несоответствия со схемой выше: не распаяны подстроечные элементы R1,C3 и диод короче на одно отверстие.
Плата немного побита жёсткой отладкой, но на то она и макетная. Большинство других вариантов, после всех модификаций, выглядело бы хуже.
Подготовка IDE и программатора
Arduino IDE наиболее доступное кроссплатформенное программное обеспечение для программирования AVR микроконтроллеров и вполне удобное для небольших проектов.
Не смотря на то, что Arduino IDE официально не поддерживает ATtiny85, существует штатный способ добавить данный микроконтроллер в список поддерживаемых. Как это сделать, подробно описано по ссылке Programming an ATtiny w/ Arduino 1.6. Однако данный способ годится только для непосредственного программирования ATtiny85 и не позволяет использовать Arduino код. С одной стороны это хорошо, код чище будет, но задача в данном случае — разработать скетч демонстрирующий способность устройства функционировать как было задумано, и такая оптимизация здесь преждевременна.
Значит нужно Arduino ядро для ATtiny85, его можно взять здесь arduino-tiny, версия для Arduino 1.5 подойдет. Доступны будут не все функции, но базовый набор, включая программный последовательный порт, для отладки, можно будет использовать. К сожалению в актуальной, на данный момент, Arduino IDE v1.6.6 что-то сломали, и c этим ядром необходимо использовать версию 1.6.5.
Осталось приготовить программатор. Для этого совсем не обязательно использовать специальное устройство, можно в ближайшую Arduino прошить скетч из , затем соединить с сенсором, как указанно на принципиальной схеме, и не забыть про конденсатор 10μF, который необходимо установить между RST и GND выводами Arduino.
Программировать устройство нужно без установленных радиомодуля и перемычек. В меню нужно выбрать конфигурацию микроконтроллера, в данном случае: , в меню выбрать USB порт программатора и в меню указать тип программатора, в данном случае: , затем воспользоваться кнопкой Upload.
Программное обеспечение
Тестовый скетч для работы с сенсором получился довольно интересным, в нем можно найти широкий набор примеров, а именно:
- Работа с радиомодулем NRF24L01+;
- Измерение напряжения питания средствами микроконтроллера;
- Перевод микроконтроллера в режим сна;
- Пробуждение по таймеру WDT (WatchDog Timer);
- Пробуждение по Pin Change прерыванию PCINT;
- Работа с аналоговыми и цифровыми портами.
Чтобы скомпилировать скетч необходимы сторонние библиотеки:
Это оптимизированные версии библиотек для работы с радиомодулем NRF24L01+, которые подходят для микроконтроллера ATtiny85. Их необходимо скачать и распаковать в папку libraries в директории со скетчами Arduino.
Ниже будут приведены наиболее интересные куски кода с подробными комментариями. Полностью скетч можно найти на GitHub в папке attwlight_sensor, также в папке attwlight_rx находится скетч для приёмника.
Перевод микроконтроллера в режим сна
Функция void sleep() вызывается в главном цикле void loop() и останавливает его до тех пор пока не сработает одно из прерываний PCINIT3 либо WDT. Затем выполняется полезная работа и снова вызывается данная функция.
Функция содержит обращения к регистрам микроконтроллера, и что при этом происходит не всегда очевидно. Чтобы с этим разобраться нужно заглянуть в документацию на микроконтроллер ATtiny85 datasheet раздел «23. Register Summary», в нем приведен полный список регистров с прямой ссылкой на страницу с подробным описанием для чего предназначен тот или иной бит.
Опрос датчика освещения
Особенности работы с данным датчиком уже были разобраны в разделе «Принципиальная схема». Отмечу только, что параметры здесь выбраны так, чтобы потребление микроконтроллера в режиме сна не превышало 20μA.
Измерение напряжения питания
Если не использовать вывод AREF микроконтроллера, который предназначен для задания опорного напряжения, все измерения на аналоговом порту будут привязаны к напряжению питания. Батарея не стабилизированный источник, следовательно для корректного считывания показаний датчика температуры, необходим способ измерять напряжение питания в процессе работы. Напряжение питания также является хорошим индикатором состояния батареи.
Ниже приведен код, который позволяет произвести требуемые измерения полагаясь на стабильность внутреннего опорного напряжения Vbg (Bandgap reference voltage) равного 1.1V. Согласно спецификации Vbg может находится в пределах 1.0-1.2V, поэтому необходимо убедиться в точности измерений и при необходимости скорректировать константу 1125300.
Измерение температуры
Получив напряжение питания, легко вычислить точное напряжение на аналоговом входе микроконтроллера и перевести его в температуру.
Если скомпилировать данный код, можно увидеть, что он свободно умещается в 8KiB и даже есть куда развернуться:
Осталось проверить, что всё работает как было задумано, и можно прошивать Fuses переключающие RESET в порт ввода/вывода. Готовой конфигурации в Arduino IDE для этого нет, поэтому нужно воспользоваться командной строкой:
- avrdude — команда из пакета Arduino IDE находящаяся в папке hardware/tools/avr/bin/;
- /dev/ttyUSB0 — устройство программатора;
- /etc/avrdude.conf — ссылка на файл находящийся в директории с Arduino IDE по адресу hardware/tools/avr/etc/avrdude.conf.
Что из себя представляют данные Fuses, можно посмотреть в калькуляторе Engbedded Atmel AVR® Fuse Calculator.
Если кратко, то эти настройки предписывают: использовать встроенный осциллятор с делителем частоты на 8 (итоговая частота 1MHz); использовать стандартные задержки при старте, необходимые для стабилизации осциллятора; отключить BOD (Brown-out Detector) — перезагрузка при низком напряжении питания для защиты памяти от записи мусора; включить возможность считывать прошивку; и собственно отключить RESET.
Энергопотребление
Пришло время измерить энергопотребление получившегося устройства. Вводные следующие: данные передается каждые 120sec, если пришло прерывание от датчика освещения, то немедленно; событиями от датчика освещения можно пренебречь; ёмкость батареи 200mAh.
Частота 1MHz 8MHz Радиомодуль (потребление) 15.7mA 18.3mA Микроконтроллер (потребление) 1.1mA 4.3mA Режим сна (потребление) 7μA 7μA Радиомодуль (активен за цикл) 51ms 16ms Микроконтроллер (активен за цикл) 15ms 4ms Оценка времени работы (дней) 513 739 Как видно, тут было ради чего бороться. К сожалению, стабильности на 8MHz добиться не удалось. Видимо без внешнего осциллятора, это не реально.
Читайте также: