Digispark - емуляція com-порту, вивчаємо боротьбу з arduino

Дуже часто, розробляючи якусь «Мікроконтроллерні пристрій», виникає необхідність підключити його до комп'ютера. При цьому не потрібно якихось «над-завдань», всього-то й потрібно передати з комп'ютера в пристрій якусь команду або невеликий масив данн; і / або, навпаки - з пристрою вивантажити дані в комп'ютер. Зазвичай для таких цілей використовують старий, перевірений RS232. Однак, зараз знайти комп'ютер з подібним інтерфейсом - вельми непросте завдання ...

Поглянувши на задню стінку Вашого комп'ютера, Ви навряд чи побачите щось підходяще для завдання - окрім декількох портів USB.

Digispark - емуляція com-порту, вивчаємо боротьбу з arduino

USB - дуже вдале рішення в еволюції комп'ютерної техніки: і «гаряче» підключення, і харчування є і ще багато чого хорошого ... Одне погано - вже дуже складний інтерфейс вийшов. Якщо копнути інтернет в цьому напрямку - відразу ... руки опускаються.

Є прекрасний вихід з ситуації - використання емуляції СОМ-порту. Для цього є маса «копійчаних» мікросхем: CP2102, PL2303, CH340 і ін.

Digispark - емуляція com-порту, вивчаємо боротьбу з arduino
Все що стосується USB - вони беруть на себе, а нам дають добре знайомий UART. За цим принципом влаштовано безліч виробів, наприклад, так побудовано взаємодія Arduino з комп'ютером ...

Цікаво обійтися без цих «милиць» - благо - ресурсів навіть ATtiny для цього вистачає з надлишком ... Подивимося - як реалізована емуляція COM порту в широко поширеному проекті Digispark. Раніше було розглянуто варіант підключення плати до комп'ютера і Arduino IDE

Digispark - емуляція com-порту, вивчаємо боротьбу з arduino
Всі нюанси емуляції описані в першоджерелі на Digistump. Зараз розглянемо варіант використання плати для її взаємодії з комп'ютером через USB - DigiCDC. Для цього зручно використовувати злегка доопрацьований під DigiCDC приклад Echo з розділу Приклади -> DigisparkUSB -> Echo

Ключовим моментом в програмі є рядок

після її виконання Digispark перетворюється в Digispark Virtual Com Port і комп'ютер його так і виявляє (при цьому DigisparkBootloader з пристроїв в диспетчері зникає). Для того щоб комп'ютер визначив новий пристрій так як треба, комп'ютера треба підсунути потрібний драйвер (вказати на файл DigiSerial.inf)

Digispark - емуляція com-порту, вивчаємо боротьбу з arduino

Якщо комп'ютер потрібний драйвер сам не знайшов, вказуємо йому на те що треба і отримуємо потрібний пристрій в диспетчері пристроїв:
Digispark - емуляція com-порту, вивчаємо боротьбу з arduino

З вийшов COM портом можна робити все, що завгодно. Найпростіше - «нацькувати» на нього монітор Arduino IDE. Просто в налаштуваннях середовища вибираємо наш новий COM порт і працюємо з ним ...
Digispark - емуляція com-порту, вивчаємо боротьбу з arduino

У використанні такого «порту» є нюанси:

  • Бібліотека DigiCDC використовує досить багато оперативної пам'яті. Рекомендується при виведенні в порт тексту користуватися функцією F (), наприклад: SerialUSB.print (F ( "test")).
  • Порт можна використовувати для обміну повідомленнями, як це зазвичай прийнято (типова рядок Serial.print () використовується майже у всіх творіннях). Але, тепер треба використовувати, наприклад, SerialUSB.read () замість Serial.read () і т.п.
  • Ніякої вказівки швидкості обміну при ініціалізації тепер не потрібно, просто пишемо: SerialUSB.begin ().
  • Обмін через емульований порт о-о-дуже повільний. На передачу символу йде 5 мс. Це треба мати на увазі при розробці рішень.
  • Якщо в проекті треба використовувати затримку функцією delay (). то її треба замінити на SerialUSB.delay ().
  • У проектах з DigiCDC функцііSerialUSB.delay () іліSerialUSB.refresh () потрібно викликати не рідше, ніж кожні 10 мс, якщо немає викликів інших функцій SerialUSB.

Приклад роботи скетчу:

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», вимикає його.