Обзор Digispark

 
    22.04.2018

    Сам проект "народный", бабло на него собирали кажется на кикстартере. Суть сводится к тому, что в AVR микроконтроллер зашит загрузчик при загрузке изображающий из себя USB устройство. Это позволяет из стандартной среды Arduino IDE заливать скетчи (они же программы, они же прошивки) напрямую в AVR контроллер. На алиэкспрессе "аналоги" подобной платы стоят в районе 100 рублей за штутку:

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

    Теперь немного о возможностях контроллера ATtiny85 питание от 2.7 до 5 Вольт, в даташите ссылок на рабочую температуру не нашёл, но там есть несколько графиков зависимости от температуры, где график начинается с -40 градусов, отчего можно предположить, что с зимней эксплуатацией в России проблем быть не должно. Рабочая частота 20 Мгц, АЦП доступен на 4х выводах, при это сам АЦП 1, и соответственно одновременно может производится только один замер, ацп 10-битный. Из 6 выводов 5й использовать проблематично - при замыкании его на землю, контроллер перезагружается. К выводу 1 подключен светодиод. PWM доступен, но использовать его можно разве что для световых приборов - частота маленькая менее 1000 Гц, отчего механическая нагрузка неизбежно будет гудеть. Практически для каждого из выводов есть свои ограничения:

Pin number Output Voltage Analogue Port Number
analogRead()
PWM USB Test LED I2C SPI*
05 V Y - 504 Hz Rev 1 SDAMISO
15 V Y - 504 Hz Rev 2 / 4 MOSI
25 V 1SCLSCK
33.6 V3 Y - 1.5 кОм к 5 В
стабилитрон 3,6 В
43.6 V2Y - 1007 HzY
стабилитрон 3,6 В
53 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();
}

    По итогу можно сказать, что преимущества данной платы - возможность использования части библиотек от ардуино, либо сторонних. В отличие от того же ассемблера. В сравнении с ардуино, digispark раза в полтора дешевле самой простой arduino nano.

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

Фотогалерея