Digispark и USB (или: как связать ATtiny и компьютер по USB)

Очень часто, разрабатывая какое-нибудь «микроконтроллерное устройство», возникает необходимость подключить его к компьютеру. При этом не требуется каких-нибудь «сверх-задач», всего-то и нужно передать из компьютера в устройство какую-нибудь команду или небольшой массив даннных; и/или, наоборот — из устройства выгрузить данные в компьютер. Обычно для таких целей используют старый, проверенный RS232. Однако, сейчас найти компьютер с подобным интерфейсом — весьма не простая задача…

Взглянув на заднюю стенку Вашего компьютера, Вы вряд ли увидите что-то подходящее для задачки — кроме нескольких портов USB.
USB — очень удачное решение в эволюции компьютерной техники: и «горячее» подключение, и питание есть и еще много чего хорошего… Одно плохо — уж очень мудреный интерфейс получился. Если копнуть интернет в этом направлении — сразу… руки опускаются.

Есть прекрасный выход из ситуации — использование эмуляции СОМ-порта. Для этого есть масса «копеечных» микросхем: CP2102, PL2303, CH340 и др.2102 Все что касается USB — они берут на себя, а нам дают хорошо знакомый UART. По этому принципу устроено множество изделий, например, так построено взаимодействие Arduino с компьютером…

…все хорошо, но хочется «чего-то такого» — как же так, неужели AVR нельзя сразу приделать к компьютеру без «всяких там»… Оказывается можно! Уже давно «энтузиасты» разобрались с USB и предоставили человечеству свои наработки. В частности, на этом основана работа Digispark . Ранее был рассмотрен вариант подключения платы к компьютеру и Arduino IDE dgsp1Сейчас рассмотрим вариант использования платы для ее взаимодействия с компьютером через USB. Для этого удобно использовать слегка доработанный пример Echo из раздела Примеры -> DigisparkUSB -> Echo

#include <DigiUSB.h>

void setup() {
  pinMode(1, OUTPUT);
  DigiUSB.begin();
}

void get_input() {
  int lastRead;
  // when there are no characters to read, or the character isn't a newline
  while (true) { // loop forever
    if (DigiUSB.available()) {
      // something to read
      lastRead = DigiUSB.read();
      DigiUSB.write(lastRead);
      
      if (lastRead == '\n') {
        break; // when we get a newline, break out of loop
      }
      if (lastRead == '0') {
        digitalWrite(1, LOW);   // turn the LED off
        DigiUSB.println(" LED Off ...");
        break; // break out of loop
      }
      if (lastRead == '1') {
        digitalWrite(1, HIGH);   // turn the LED on
        DigiUSB.println(" LED On ...");
        break; // break out of loop
      }
    }  
    // refresh the usb port for 10 milliseconds
    DigiUSB.delay(10);
  }
}

void loop() {
  // print output
  DigiUSB.println("Waiting for input...");
  DigiUSB.println("Press 0 to LED off or 1 to LED On...");
 // get input
  get_input();
}

Ключевым моментом в программе является строка

DigiUSB.begin();

после ее выполнения Digispark превращается в USB HID-совместимое устройство и компьютер его так и обнаруживает (при этом DigisparkBootloader из устройств в диспетчере исчезает). Для того чтобы компьютер определил новое устройство так как надо, компьютеру надо подсунуть нужный драйвер (указать на файл DigiUSB.inf)

driverusb
Если компьютер нужный драйвер сам не нашел, указываем ему на то что надо и получаем требуемое устройство в Диспетчере устройствdispetchusb
Теперь самое интересное — а что нам с этим устройством делать? Каким образом передать в него данные или извлечь их из него? Для программиста это — не задача (на Digistump в разделе про DigiUSB есть ссылка на Github с материалами для решения), а вот нам — простым радиотехникам — хочется какой-нибудь простой программки, типа терминала, для взаимодействия с устройством…

Есть такая программка — и лежит «не глубоко». Да простит меня автор, продублирую ее тут. Запускаем приложение, в окне программы видим, что нам «говорит» Digispark, а нажимая клавиши, их коды «уходят» к нему.

Программа, прямо скажем, сыровата — выводимый из DigiUSB текст лишь мельком появляется на экране, но в текстовом файле, где сохраняется принятая информация: received_digiusb.txt — все нормально:

Waiting for input…
Press 0 to LED off or 1 to LED On…
0 LED Off …
Waiting for input…
Press 0 to LED off or 1 to LED On…
1 LED On …
Waiting for input…
Press 0 to LED off or 1 to LED On…

Приведенный выше скетч реагирует на клавишу «1» — включением светодиода на плате Digispark, а, при нажатии клавиши «0», выключает его.

PS  В упомянутой выше статье есть ссылка на RubyGem — аналогичную по функциональности терминальную программу способную работать с DigiUSB…

Digispark и USB (или: как связать ATtiny и компьютер по USB): 2 комментария

Добавить комментарий

Ваш e-mail не будет опубликован.

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".