Сам проект "народный", бабло на него собирали кажется на кикстартере. Суть сводится к тому, что в AVR микроконтроллер зашит загрузчик при загрузке изображающий из себя USB устройство. Это позволяет из стандартной среды Arduino IDE заливать скетчи (они же программы, они же прошивки) напрямую в AVR контроллер. На алиэкспрессе "аналоги" подобной платы стоят в районе 100 рублей за штутку:
Для работы с ним понадобится среда Arduino IDE, с сайта проекта нужно скачать драйвера, и выполнить небольшую настройку IDE. (на момент написания статьи сайт проекта не доступен, вероятно это результат спектакля роскомнадзор vs telegram) Расписывать тут не буду, так как если вы не сможете справиться с этим, то и читать дальше вам будет бессмысленно. Когда всё настроено, запускается прошивка скетча, при этом нужно отсоединить и подсоединить плату, загрузка при этом начнётся автоматически. Поскольку для передачи данных USB используются те же самые контакты, то при прошивке всё "лишнее" нужно отключать.
Теперь немного о возможностях контроллера ATtiny85 питание от 2.7 до 5 Вольт, в даташите ссылок на рабочую температуру не нашёл, но там есть несколько графиков зависимости от температуры, где график начинается с -40 градусов, отчего можно предположить, что с зимней эксплуатацией в России проблем быть не должно. Рабочая частота 16 Мгц, АЦП доступен на 4х выводах, при это сам АЦП 1, и соответственно одновременно может производится только один замер, ацп 10-битный. Из 6 выводов 5й использовать проблематично - при замыкании его на землю, контроллер перезагружается. К выводу 1 подключен светодиод. PWM доступен, но использовать его можно разве что для световых приборов - частота маленькая менее 1000 Гц, отчего механическая нагрузка неизбежно будет гудеть. Практически для каждого из выводов есть свои ограничения:
Pin number | Output Voltage | Analogue Port Number analogRead()
| PWM | USB | Test LED | I2C | SPI* |
---|---|---|---|---|---|---|---|
0 | 5 V | Y - 504 Hz | Rev 1 | SDA | MISO | ||
1 | 5 V | Y - 504 Hz | Rev 2 / 4 | MOSI | |||
2 | 5 V | 1 | SCL | SCK | |||
3 | 3.6 V | 3 | Y - 1.5 кОм к 5 В стабилитрон 3,6 В | ||||
4 | 3.6 V | 2 | Y - 1007 Hz | Y стабилитрон 3,6 В | |||
5 | 3 V | 0 |
Теперь немного расскажу о способах отладки прошивок. Простейший из способов - моргание светодиодом на выводе p1. Скажем, по умолчанию моргаем 1 раз в секунду, при условии 2 - 2 раза и т.д. Однако это случай довольно примитвный. Мне же довелось отлаживать проект, использующий ЦАП (ADC), а там уже 1024 значения. Моргать конечно можно, но как считать :) ? И тут я решил поподробнее изучить шину i2c, она использует 2 провода, одно устройство - мастер, и куча рабов, до 127. И этот способ мне показался довольно перспективным. Можно сделать головное устройство на Arduino Mega, и на общую шину посадить не один десяток устройств, как исполнительных механизмов, так и датчиков.
Отладочный скетч для мастера на Arduino Mega. Используется библиотека для работы с i2c wire. В цикле запрашивается информация с i2c раба с номером 11. Полученную информацию можно выводить в COM-порт, или на экран, подключенный к мастеру.
#include <Wire.h> byte GetI2C(byte dev){ byte ret, ret2; ret = Wire.requestFrom(dev, 1, true); if( ret == 0 ){ return 255; } ret2 = 254; while( Wire.available() > 0){ ret2 = Wire.read(); } return ret2; } void setup() { Wire.begin(); TWBR = 12; //400 kHz i2c } void loop(){ fromdigispark = GetI2C(11); }
Отладочный скетч для раба Digispark. Поскольку аппаратной поддержки i2c в digispark нет, для эмуляции i2c используются библиотеки TineWireS и TineWireM для раба и мастера соответственно. Нужную библиотеку нужно скачать и положить в папку проекта. Здесь для входа аналогового сигнала используется ADC2, он же p4.
#define I2C_SLAVE_ADDRESS 11 #include "TinyWireS.h" #ifndef TWI_RX_BUFFER_SIZE #define TWI_RX_BUFFER_SIZE ( 16 ) #endif #include <core_adc.h> void requestEvent(){ int adc_val; ADC_SetInputChannel( (adc_ic_t) 2); ADC_StartConversion(); while( ADC_ConversionInProgress() ); adc_val = ADC_GetDataRegister(); adc_val = (adc_val >> 2); TinyWireS.send((byte) adc_val); } void receiveEvent(uint8_t howMany) { ... } void setup() { pinMode(1, OUTPUT); TinyWireS.begin(I2C_SLAVE_ADDRESS); TinyWireS.onReceive(receiveEvent); TinyWireS.onRequest(requestEvent); digitalWrite(3, HIGH); pinMode(3, INPUT); //adc } void loop() { digitalWrite(1, HIGH); tws_delay(50); digitalWrite(1, LOW); tws_delay(1000); TinyWireS_stop_check(); }
Почти идеально для отладки подходит цифровой индикатор tm1637.
По итогу можно сказать, что преимущества данной платы - возможность использования части библиотек от ардуино, либо сторонних. В отличие от того же ассемблера. В сравнении с ардуино, digispark раза в полтора дешевле самой простой arduino nano.
Ну и на десерт напомню, никакой защиты в плате нет, и сами разработчики рекомендуют подключать плату к компьютеру через USB хаб, так как в случае замыкания линии питания, может выйти из строя компьютер.
Алгоритм борьбы с дребезгом контактов описан в статье PWM регулятор.
Сложности использования Pin 3 в качестве кнопки и организация питания от павербанка изложены в статье Пульт ИК ДУ на Digispark.
Решение с подключением нескольких кнопок на один вывод изложено в статье PWM регулятор семиуровневый с индикацией.
Решение проблем (не)запуска изложено в статье Термостат с PWM и индикацией.