Attiny85: прототип беспроводного сенсора

ATtiny85: прототип беспроводного сенсора +14

  • 17.12.15 06:03


custos

#267798

Гиктаймс


Tutorial

6400

Open Source, DIY или Сделай сам, Arduino, Электроника для начинающих

Обычно, для перехода от идеи к реализации, необходим прототип устройства, удобный для проверки и отладки на месте, что особенно важно для мобильного устройства. Далее постараюсь максимально подробно разобрать процесс создания прототипа беспроводного сенсора на базе ATtiny85.
Цель — создать сенсор работающий, условно говоря, в коробке с искусственным освещением и передающий температуру и статус освещения с немедленной реакцией на изменение освещения: включилось, отключилось, мигнуло

Сенсор решено было сделать мобильным и питать от элемента CR2032, иначе говоря, при разряде до 2.7V (предел для датчика TMP36), можно рассчитывать на 200mAh.
Микроконтроллер ATtiny85 имеет всего 5 портов ввода/вывода и возможность отключить RESET в пользу дополнительного порта. Данный бюджет был распределён следующим образом:

  • 3 порта — радиомодуль NRF24L01+, спецификация требует пять портов, но в данном случае это не приемлемо и будет использована 3-х пиновая конфигурация;
  • 1 порт — датчик освещения на базе фототранзистора BPW17N;
  • 2 порта — температурный датчик на базе TMP36, второй порт нужен для подачи питания, чтобы иметь возможность отключать датчик при необходимости.

Шаг 6: Установка библиотек Attiny-IR и Tinytuner

А) Аттины-ИК библиотека:

скачать его с Http: //drive.google.com/open ID = 0B_w9z88wnDtFNHlq …?затем распакуйте его в папку с библиотеками альбомов.

Б) Библиотека Tinytuner:

Это необходимо только в том случае, если вы не используете кристалл 16 МГц, но, поверьте мне, даже если он работает и без кристалла, он намного более стабилен и стоит несколько центов, поэтому будьте проще, используйте кристалл и пропустите эта библиотека.

Еще не убежден? хорошо, скачать библиотеку сHttp: //storage.googleapis.com/google-code-archive …затем распакуйте его в папку с библиотеками альбомов.

Мы закончили с библиотеками, теперь мы переходим к установке загрузчиков.

Шаг 2. Начнем с оборудования

Инструменты, которые вам нужны:

  • совместимая с Arduino плата
  • Адаптер последовательного интерфейса к USB для декодирования ваших удаленных ключей (просто используйте FT232RL)
  • ПК с установленной GNU / Linux и правильно настроенной IDE arduino, я использую IDE arduino 1.8.0
  • ИК-пульт для тестирования вашего устройства (даже такой дрянной, как те, что есть в стартовых комплектах Arduino, будет работать)
  • мультиметр для отладки вашей платы (надеюсь, она вам не понадобится, удачи!)

Список материалов:

  • 1 attiny85
  • 2 резистора 68R
  • 1 1.5K резистор
  • 1 4.7K резистор
  • 1 кристалл 16 МГц
  • 1 конденсатор 22 пФ
  • 1 0,1 мкФ конденсатор
  • 1 10 мкФ конденсатор
  • 2 стабилитрона 3,6 В 0,5 Вт
  • 1 штекер USB типа A
  • 1 штрипс с 6 контактами для программирования и отладки платы.
  • 1 ИК-датчик TSOP31238
  • много кофе, чтобы вы не спали

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

Для подключения attiny85 к ПК в окончательном варианте используется разъем USB типа A, который впаян в плату, но для прототипа вам потребуется кабель USB, который можно подключить к макету:

Припой в небольшой кусок 4 штырька для картона, затем обрежьте старый USB-кабель и припаяйте штырьки к 4 проводам внутри USB-кабеля:

  • красный VCC (5 В)
  • черный — земля
  • белый D-
  • зеленый это D +

Держите все вместе с горячим клеем.

Теперь нам нужно подключить программатор ISP (Arduino), адаптер USB-последовательный порт (FT232RL) и ИК-датчик к attiny85.

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

Для этого подключите все, следуя этим инструкциям:

Интернет-программист (Arduino):это позволяет нам записывать загрузчики и загружать эскизы

  • attiny85 PB0 (pin5) для pin11 (MOSI) в Arduino
  • attiny85 PB1 (pin6) для pin12 (MISO) в Arduino
  • attiny85 PB2 (контакт 7) для контакт 13 (SCK) в Arduino
  • attiny85 RESET (pin1) с подтягиванием (4.6k к VCC) к pin10 в Arduino
  • attiny85 VCC до 5 В в Arduino
  • attiny85 GND для GND в Arduino

переходник с USB на последовательный порт (FT232RL):это позволяет нам проверить последовательный порт

  • attiny85 PB0 (pin5 -> RX) для передачи в FT232RL
  • attiny85 PB2 (pin7 -> TX) для RX в FT232RL
  • attiny85 GND (pin4) для GND на FT232RL
  • так как attiny85 уже питается от Arduino, вам не нужно подключать 5 В на FT232RL, в противном случае подключите: attiny85 VCC (pin8) к 5 В на FT232RL

переходник с USB на последовательный порт (FT232RL) только для калибровки часов(только для загрузчика «ATtiny85 @ 8MHz (внутренний генератор; BOD отключен)»)

  • PB4 (pin3 -> RX) к TX в attiny85 FT232RL
  • PB3 (pin2 -> TX) к RX в attiny85 FT232RL
  • GND (pin4) в GND на FT232RL
  • так как attiny85 уже питается от Arduino, вам не нужно подключать 5 В на FT232RL, в противном случае подключите: attiny85 VCC (pin8) к 5 В на FT232RL

Если вы используете Crysta 16 МГцl, подключите его к контактам Attiny85 PB3 (контакт 2) и PB4 (контакт 3) и подключите каждый контакт к GND, а также через крышку 22 пФ каждый.

Фильтр Attiny85 VCC с конденсаторами 0,1 мкФ и 10 мкФ, соединяющими их параллельно с заземлением

Подключите ИК-датчик выходной контакт на PBT1 attiny85 (контакт 6), включите его.

Создайте и подключите интерфейс USB:

  • GND (черный провод): подключите его к общему GND (все заземления соединены вместе)
  • D- (белый провод) подключен к attiny85 PB0 (контакт 5) через резистор 68R, подключите его также к заземлению через стабилитрон 3,6 В 0,5 Вт и протяните его до VCC с резистором 1,5 К
  • D + (зеленый провод) подключен к PB2 через резистор 68R, подключите его к земле через стабилитрон 3,6 В 0,5 Вт
  • 5V, вы можете оставить его неподключенным, так как на этом этапе все запитывается от Arduino, в противном случае подключите его к VTC attiny85

Стабилитроны подключены таким образом, что аноды связаны с заземлением, а катоды подключены к линиям передачи данных D + и D-.

Конфигурирование Arduino IDE для программирования ATttiny85

Для того, чтобы программировать плату ATtiny85 с помощью Arduino IDE сначала нам необходимо добавить поддержку платы Digispark в Arduino IDE. Для этого откройте пункт меню File > Preferences, добавьте следующую ссылку в Additional Boards Manager URLs в Arduino IDE и нажмите ‘OK.’

После этого откройте пункт меню tools > Board > Board Manager, выполните поиск ‘Digistump AVR’ и установите его последнюю версию.

После этого в инструментах вы обнаружите новый пункт меню с именем ‘Digispark’.

Затем откройте пункт меню file > Examples > Basics и откройте Blink example (пример с мигающим светодиодом).

Измените в коде этого примера номер контакта с LED_BUILTIN на 0.

После этого откройте пункт меню Tools -> Board и выберите плату “Digispark (Default – 16mhz)”. После этого в Arduino IDE нажмите кнопку загрузки кода.

Примечание: подключайте плату программатора ATtiny85 к компьютеру только тогда, когда в Arduino IDE появится сообщение “Plugin device now”.

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

Более подробно процесс работы платы нашего программатора можно посмотреть в следующем видео.

Как прошить Digispark ATtiny 85.

Зальем в плату тестовый скетч, с помощью которого плата будет мигать встроенным светодиодом.

Для этого понадобятся:

1. Приложение Arduino IDE

2. Ссылка для менеджера плат

3. Добавить платы Digispark в приложение Arduino IDE

4. Установить драйверы для Digispark ATtiny 85.

Ознакомиться с приложение Arduino IDE http://kolotushkin.com

Запустите приложение Arduino IDE, зайдите во вкладку Файл/Настройки и в Дополнительные ссылки для
Менеджера плат: добавьте эту ссылку

И нажмите «ОК»

Затем откройте вкладку Инструменты /Выбор платы /Менеджер плат

В открывшемся списке выбираем пункт “Digistump AVR Boards” и нажмите “Установить”.

Чтобы быстрее найти, впишите в окно поиска слово “Digistump” или просто “digi”.

Осталось скачать и установить драйверы.

Откройте архив Digistump.Drivers.zip и извлеките из него папку с драйверами Digistump Drivers. Это можно сделать простым перетаскиванием папки Digistump Drivers из архива в удобную для вас папку.

Затем подключите плату Digispark к компьютеру. Откройте Пуск/Панель управления/Диспетчер устройств. Найдите в списке устройство помеченное желтым треугольником (у вас может отобразиться как «Неизвестное устройство»), кликните на него правой кнопкой мышки и в открывшемся окне кликните обновить драйверы.

Затем выберите пункт «Выполнить поиск драйверов на этом компьютере»

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

Если теперь устройство определено как Digispark Bootoalder без желтой отметки, значит все готово!

Теперь откройте скетч Blink, который находится во вкладке “Файл/Примеры/Basics/Blink”.

Так как скетч расcчитан для платы Arduino на которой светодиод подключен к 13 пину, то необходимо
заменить значение “13” на “1” потому как на плате Digispark светодиод подключен к 1 пину!

Затем в менеджере плат выберите плату Digispark (Default — 16,5mhz)

Нажимаете “Загрузить”. После чего произойдет компиляция и снизу появится сообщение (will timeout in 60
seconds), и вот только тогда в течении 60 секунд нужно подключить плату к USB порту для загрузки скетча!

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

Видео версия обзора платы Digispark ATTiny85. «Как прошить Digispark ATTiny85. Обзор платы Digispark ATTiny85»

Шаг 1: Некоторые соображения

  • У меня нет программиста AVR ISP, и я не очень хочу его покупать, поэтому я использовал Arduino для программирования attiny85
  • Меня не волнует какая-либо другая ОС, кроме GNU / Linux, поэтому я не знаю, будет ли это работать иначе.
  • Есть и другие ИК-библиотеки, но я не смог заставить их работать даже с Arduino. Учтите, что я начал с ограниченного знания о библиотеках IR. Возможно, я мог бы заставить их работать сейчас, после того, как приобрел опыт работы с большим количеством вопросов. Во всяком случае, я был потерян и в отчаянии, прежде чем нашел библиотеку, предоставленную Seejaydee, и я использовал это с тех пор (большое спасибо человек!).
  • Существуют и другие аппаратные конфигурации, но я использовал только ту, которая использует 5 В для питания attiny85 и два 3,6 В 0,5 Вт стабилитрона для ограничения напряжения линий передачи данных, это работает из коробки, поэтому я не связывался с другие конфигурации.
  • Вы можете использовать кристалл 16 МГц или библиотеку tinytuner для калибровки внутренних часов вашего attiny85. Я настоятельно рекомендую использовать кристалл, он намного более стабилен и, вероятно, избавит вас от головной боли.
  • Я использую здесь два разных загрузчика для attiny85:

а) версия программного обеспечения Rowdy DogОн имеет встроенный последовательный интерфейс, который очень крутой и очень маленький, поэтому у вас есть больше места для вашей программы и других библиотек. Проблема в том, что по некоторым причинам, хотя он работает довольно хорошо, через некоторое время USB-устройство было отключено (вы можете найти проблемы с командой dmesg).Я не знаю, является ли это проблемой ядра или смешанной комбинации ядра плюс выбранных библиотек, поэтому через некоторое время я решил использовать это ядро ​​просто для декодирования удаленных клавиш и калибровки часов (когда не используется 16 МГц кристалл). После этого я просто записываю загрузчик Mellis и загружаю окончательный эскиз, который не использует последовательный интерфейс.

б) версия Меллисастабильный загрузчик, я использовал это во многих проектах. Я бы использовал этот загрузчик всегда, если бы он включал последовательный интерфейс. Я использую это ядро ​​в окончательном наброске после расшифровки всех ключей на пульте.

Перепрограммируемый загрузчик ATtiny85 с использованием платы Arduino Uno

Для программирования ATtiny85 без использования платы Arduino мы сначала должны загрузить в него загрузчик используя плату Arduino Uno. Этот процесс выполняется один раз и в дальнейшем у нас не будет необходимости в использовании платы Arduino для программирования микроконтроллера ATtiny85. Загрузчик (bootloader) – это специальная программа, которая выполняется в микроконтроллере, который необходимо запрограммировать. Использование загрузчика – это один из самых удобных способов загрузки программы в микроконтроллер. Загрузчик находится в микроконтроллере и выполняет поступающие команды, а затем записывает новую программу в память микроконтроллера.

Перепрограммируемый загрузчик в микроконтроллере устраняет необходимость в использовании специальных внешних аппаратных средств (плат программирования, программаторов) для программирования микроконтроллера и позволяет загружать программу в микроконтроллер непосредственно с помощью USB соединения. Платы Digispark ATtiny85 (а выбор подобных плат сейчас достаточно большой) работают на загрузчике “micronucleus tiny85”, первоначально написанным Bluebie. Загрузчик – это программный код, который заранее загружен в плату Digispark и позволяет работать ей как USB устройство, которое можно программировать с помощью Arduino IDE. Мы будем использовать аналогичный подход и загружать загрузчик digispark attiny85 в наш микроконтроллер ATtiny85.

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

Шаг 1. Конфигурирование платы Arduino Uno в качестве ISP программатора.

Поскольку ATtiny85 является всего лишь микроконтроллером, для его программирования требуется ISP (In-System Programming — внутрисистемное программирование). Поэтому для программирования ATtiny85 нам необходимо сначала сконфигурировать плату Arduino Uno в качестве ISP программатора. Для этого подключите плату Arduino Uno к компьютеру и запустите Arduino IDE. После этого откройте пункт меню File > Example > ArduinoISP и загрузите в Arduino ISP код.

Шаг 2. Схема перепрограммируемого загрузчика ATtiny85.

Схема перепрограммируемого загрузчика ATtiny85 представлена на следующем рисунке.

Конденсатор 10 мкФ подключен между контактами Reset и GND платы Arduino. Все соединения схемы представлены в следующей таблице:

ATtiny85 Pin Arduino Uno Pin
Vcc 5V
GND GND
Pin 2 13
Pin 1 12
Pin 0 11
Reset 10

После сборки схемы подключите плату Arduino Uno и запустите Arduino IDE. Определите к какому COM порту подключена плата Arduino Uno (в диспетчере устройств Windows). В нашем случае это COM5.

После этого скопируйте отредактированный файл «Burn_AT85_bootloader.bat» и файл ATtiny85.hex» в корневой каталог Arduino IDE (C:\Program Files (x86)\Arduino).

После этого сделайте клик правой кнопкой мыши на файле «Burn_AT85_bootloader.bat» и выберите «Run as Admin» (запуск от администратора). Необходимо примерно 5-6 секунд чтобы загрузчик загрузился. Если все прошло успешно, то вы должны увидеть сообщение «AVRdude done. Thank you. Press any key to continue…».

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

Шаг 11: Загрузка финального эскиза и надежда на лучшее!

Теперь у нас декодированы все кнопки пульта, файл UsbKeyboard.h заполнен нашими кодами клавиш, поэтому теперь мы можем загрузить в IDE arduino окончательный эскиз из:

Http: //github.com/venumz/ATtiny85-USB-IR-receiver …

Этот файл является точным файлом, который я использую для своего ресивера, и он работает для 2 разных пультов, поэтому вам, очевидно, потребуется обновить его для работы с вашими пультами.

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

Обратите внимание, что в функции цикла есть много операторов вроде этого:

if (results.value == 3405 || results.value == 1357) {// стрелка вверх

если (lastStroke! = results.value) UsbKeyboard.sendKeyStroke (KEY_ARROW_UP);

}

Вы должны создать свои собственные заявления, по одному на кнопку на вашем пульте. В условии «if» вы должны поместить в results.value значения, которые вы нашли, декодируя ваш пульт, и в качестве аргумента метода UsbKeyboard.sendKeyStroke вы должны поместить один из уже определенных кодов клавиш в файл UsbKeyboard.h.

Состояние » если (lastStroke! = results.value) «необходим, потому что некоторые пульты отправляют один и тот же код дважды за удар, и это предотвращает второй удар. Я не совсем уверен, и это может зависеть от протокола IR, который запрограммирован в вашем пульте (я не очень разбираюсь в ИК-протоколы), но, согласно моему опыту с моими пультами дистанционного управления, каждая кнопка может генерировать 2 разных кода, и, пока вы нажимаете и удерживаете кнопку, она отправляет один и тот же код, но если вы нажмете кнопку еще раз, она отправит другой. Кажется, что коды отправляются альтернативным способом, я думаю, это стандартный режим, чтобы узнать, сколько раз вы действительно нажали кнопку.

Хорошо, мы почти закончили, просто загрузите окончательный эскиз, подключите его к ПК и посмотрите, как он работает.

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

Если все работает нормально, когда вы открываете терминал и отправляете команду dmesg, вы должны увидеть нечто похожее на первое изображение на этом шаге. Если были проблемы, у вас должны быть ошибки, подобные тем, которые обнаружены на втором изображении, и вы должны начать отладку своей схемы и / или программного обеспечения. Одним из источников первоначальных ошибок, которые у меня были, был USB-концентратор, который не работал с моим ИК-приемником (хотя другие работали) … так что для этого последнего шага лучше подключить ИК-приемник непосредственно к порту ПК. Возможные ошибки может быть трудно найти, но в конце концов, как и я, вы многому научитесь, и цена, которую стоит заплатить, уверяет вас.

Вот и все, дайте мне знать, если вы заметили какие-либо ошибки в этой инструкции и наслаждайтесь вашим новым ИК-приемником USB!

Программная часть

Проблема с драйвером датчика MAX30102 заключается в том, что используемый в приборе датчик выпускается на плате MH-ET LIVE. В спецификации на датчик подразумевается, но не указывается явно, что LED1 – красный светодиод, LED2 – инфракрасный (ИК). Однако, если сигнал управления на LED1 равен 0, красный светодиод остается включенным (как на Рисунке 3), если же сигнал управления на LED2 равен 0, то красный светодиод гаснет. Очевидный вывод состоит в том, что LED1 – это ИК светодиод, а LED2 – красный, который также участвует в измерениях уровня насыщения крови кислородом (см. описание ниже). Мы упоминаем этот момент по причине того, что самый распространенный драйвер датчика MAX30102 для проектов на Arduino – это драйвер SparkFun 3010x, в котором однозначно определено, что LED1 – красный, LED2 – ИК. Это может быть справедливо для модулей с датчиком серии MAX30105, установленных на платах SparkFun, но, похоже, не относится к датчику MAX30102 на плате MH-ET LIVE.

Уровень кислорода в крови обозначает насыщение периферийных капилляров кислородом. Более конкретно, это процент насыщенного кислородом гемоглобина по сравнению с общим количеством гемоглобина в крови (насыщенный и ненасыщенный кислородом гемоглобин).

Насыщенный и ненасыщенный гемоглобин имеют разные характеристики поглощения света для красных и ИК длин волн. На этом принципе основана работа датчиков, таких как MAX30102. В вычислениях используется следующее соотношение:

R = (AC_red/DC_red)/(AC_IR/DC_IR)

где AC_xxx является переменной составляющей сигнала xxx, а DC_xxx является постоянной составляющей сигнала xxx. В приборе вычисляются два значения R. Верхнее значение на дисплее (следующее после частоты пульса) вычисляется по классической формуле:

R = 104 — 1.7 × R

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

-45.060 × R × R + 30.354 × R + 94.845

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

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

Например, дикротические выемки, которые можно увидеть на полученном с помощью прибора графике сердечного ритма (Рисунок 1) – «второе движение вверх на нисходящей части траектории, соответствующее увеличению давления в аорте при закрытии аортального клапана. – словарь Merriam Webster». Автор заметил, что если эти дикротические выемки более ярко выраженные – у более молодых людей – они могут преодолеть фильтрацию второго уровня и привести к ошибочному выходному сигналу детектора пульса, который, по сути, ищет пики и впадины в сигнале. Работа над проектом продолжается!

Исходный код (скетч Arduino), необходимые библиотеки, проект корпуса (Рисунок 5) для печати на 3D принтере доступны для скачивания в разделе загрузок.

Рисунок 5. Простой корпус для прибора, напечатанный на 3D принтере.

Дополнительно автор добавил версию прибора (nanoPulsePPG) для стандартных плат Arduino и протестировал работу на плате Arduino Nano, но также должно работать на плате Arduino Uno. Таким образом, вы можете экспериментировать с исходным кодом и датчиком.

Подготовка IDE и программатора

Arduino IDE наиболее доступное кроссплатформенное программное обеспечение для программирования AVR микроконтроллеров и вполне удобное для небольших проектов.

Значит нужно Arduino ядро для ATtiny85, его можно взять здесь arduino-tiny, версия для Arduino 1.5 подойдет. Доступны будут не все функции, но базовый набор, включая программный последовательный порт, для отладки, можно будет использовать. К сожалению в актуальной, на данный момент, Arduino IDE v1.6.6 что-то сломали, и c этим ядром необходимо использовать версию 1.6.5.

Осталось приготовить программатор. Для этого совсем не обязательно использовать специальное устройство, можно в ближайшую Arduino прошить скетч из File → Examples → ArduinoISP, затем соединить с сенсором, как указанно на принципиальной схеме, и не забыть про конденсатор 10μF, который необходимо установить между RST и GND выводами Arduino.

Программировать устройство нужно без установленных радиомодуля и перемычек. В меню Tools → Board нужно выбрать конфигурацию микроконтроллера, в данном случае: ATtiny85 @ 1 MHz (internal oscillator; BOD disabled), в меню Tools → Port выбрать USB порт программатора и в меню Tools → Programmer указать тип программатора, в данном случае: Arduino as ISP, затем воспользоваться кнопкой Upload.