Digispark — платформа разработки на базе микроконтроллера ATtiny85. Им можноуправлять и программировать из Arduino IDE напрямую через USB-кабель.
Плата представляет собой дополнение для платформ Arduino, там, где важны небольшие размеры и выполнение простых задач, требующих использования всего нескольких выводов. При этом данная платформа дешевле своих больших братьев.
Функционал Digispark
- Питание от USB или блока питания 7 – 35В
- Встроенный стабилизатор 5В/500мА
- Поддержка USB (программная)
- 6 линий I/O
- 3 линии PWM (аппаратный)
- 4 линии АЦП (аналоговые входы)
- 8 кБ флэш-памяти (в том числе ок. 2кБ занято загрузчиком)
- Интерфейс I2C или SPI с использованием USI
- Светодиоды — питания и пользовательский, подключенный к выводу P0 или P1 (в зависимости от версии модуля)
Digispark не имеет никаких USB-чипов. Вся работа выполняется программно с помощью встроенного загрузчика под названием Micronucleus. Цена удобства этого решения — потребление около четверти доступной флеш-памяти, то есть около 2кБ. Кроме того, при этом блокируется вывод RESET (PB5), что делает невозможным ISP программирование (внутрисистемное программирование).
Распиновка платы Digispark
Контакты, используемые для программирования через USB (3 и 4), во время программирования должны быть свободны (ни к чему не подключены). После программирования вы можете использовать их как обычно, если вам не нужно использовать последовательное соединение, например, для отправки данных на терминал. Ограничения платформы более подробно описаны в wiki-странице продукта, и вам следует ознакомиться с ними перед началом работы с модулем.
Выше я писал о то, что данная платформа предназначена для простых задач из-за количества памяти и контактов. С другой стороны, в библиотеку включено большое количество примеров, которые показывают возможности платы и облегчают начало работы с ней. Правда на практике это иногда бывает сложно, с чем я столкнулся при попытке подключить датчик HC-SR04.
[vit 136]Программирование
Для использования платы, все, что вам нужно, это кабель с MicroUSB разъемом. Сперва вы должны настроить Arduino IDE и установить соответствующие драйверы (Micronucleus). Все подробно описано на wiki-странице Подключение и программирование вашего Digispark.
Я скачал версию micronucleus-2.0a4-win, но код был написан и работал на 1.8.7 IDE (требуется версия 1.6.5+). В этой версии я импортировал поддержку Digispark через Boards Manager, как описано на упомянутой выше странице.
Я выбрал платформу «Digispark (по умолчанию — 16,5 МГц)». В общем, в меню Файл / Примеры / Digispark есть много интересных примеров. Я выбрал из них два, из которых в дальнейшей части статьи я построю простой монитор температуры.
Стоит также упомянуть о DigisparkExamplePrograms. В каталоге DigisparkExamplePrograms / Python / DigiUSB находятся такие программы, как digiscope.exe или monitor.exe, которые работают с Digispark (если не используются контакты, соответствующие USB-соединению).
Первая программа показывает графики, а вторая — последовательный терминал. Примеры использования доступны в среде IDE в разделе «Файл / Примеры / DigisparkUSB». Они используют файл DigiUSB.h.
Есть еще один способ связи через USB с использованием файла DigiCDC.h (File / Examples / DigisparkCDC), и этот способ имеет то преимущество, что достаточно обычного терминала с Arduino IDE.
Сам процесс программирования выглядит следующим образом:
- После нажатия кнопки «Загрузить» на информационной панели, в нижней части среды IDE появиться следующее сообщение: «Запуск Digispark Uploader… Подключите устройство сейчас… (время ожидания истекает через 60 секунд)»
- На этом этапе мы подключаем Digispark и загружаем код.
- После загрузки загрузчик завершает работу и загруженная программа запускается.
Ввод в эксплуатацию
В качестве демонстрации я написал практический пример в виде мониторинга температуры с помощью датчика DS18B20, работающего по протоколу 1-Wire.
Результат измерения отображается на небольшом OLED-дисплее (драйвер SSD1306), управляемом по I2C шине.
Код программы это, по сути, компиляция кода из двух примеров, касающихся перечисленных систем (DS18B20 и OLED-дисплея). Кроме того, код сделан максимально коротким, чтобы уместить его в память Attiny. Хотя это и так, но использование памяти достигло 100% (6012 байт). Из-за этого, как видите в коде, закомментированной является функция проверки контрольной суммы.
Здесь я столкнулся с двумя проблемами, как и в предыдущем проекте (с датчиком HC-SR04). Во-первых, быстро заканчивается FLASH-память, а во-вторых, это распределение контактов. 1-Wire не хотел работать на контакте P1, помогла замена на контакт на P3.
Код термометра
#include <DigisparkOLED.h> #include <OneWire.h> #include <Wire.h> OneWire ds(3); byte addr[8]; void setup() { oled.begin(); } void loop() { byte data[12]; byte i; if (!ds.search(addr)) { ds.reset_search(); delay(250); return; } /*if (OneWire::crc8(addr, 7) != addr[7]) { return; }*/ ds.reset(); ds.select(addr); ds.write(0x44, 1); delay(1000); ds.reset(); ds.select(addr); ds.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds.read(); } int16_t raw = (data[1] << 8) | data[0]; byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; oled.clear(); oled.setCursor(0, 0); oled.setFont(FONT8X16); oled.print(raw / 16); oled.print("."); oled.print(raw % 16); delay(5000); }
Из-за удобочитаемости я удалил комментарии. Их можно найти в примерах DS18B20 и OLED.
Еще одно важное замечание — DS18B20 требует подтягивающего резистора (4,7 кОм) между входом и напряжением питания — у моего модуля он уже был. Отсюда его отсутствие на схеме подключения.
В скетче ошибки. По два раза повторения в одной строке
Спасибо за замечание. Код поправил
Неопознанное устройство. После заливки скетча