Руководство к Arduino Leonardo и Micro

Для подключения к компьютеру Arduino Leonardo или Micro вам понадобится USB-кабель с разъемом Micro-B. Такой USB-кабель служит как для передачи данных, так и для питания платы. Чтобы прошить Arduino Leonardo, в среде разработки Arduino IDE из меню Tools > Board необходимо выбрать пункт "Arduino Leonardo" или "Arduino Micro".

Отличия от Arduino Uno

В целом, порядок работы и программирования Leonardo и Micro точно такой же, как и в других моделях Ардуино. Тем не менее, существует и несколько важных отличий.

Единый процессор - и для выполнения программ, и для связи по USB.

Leonardo и Micro отличаются от других моделей Ардуино, прежде всего, тем, что в них для выполнения всех функций используется один микроконтроллер - и для выполнения программ, и для взаимодействия с компьютером по интерфейсу USB. В Arduino Uno и других моделях для выполнения этих двух функций используются разные микроконтроллеры, соответственно, USB-соединение с компьютером всегда остается активным, независимо от текущего состояния главного микроконтроллера.  Объединение обеих функций в один микроконтроллер позволило сделать Leonardo более гибким во взаимодействии с компьютером, а также уменьшить его себестоимость за счет отсутствия дополнительного процессора.

Переназначение порта при сбросе платы.

В составе устройства нет отдельной микросхемы, обслуживающей последовательную связь, поэтому используемые последовательные порты являются виртуальным - как в операционной системе ПК, так и на самом устройстве. При запуске загрузчика, Leonardo/Micro автоматически создает экземпляр класса для работы с последовательным интерфейсом, точно так же, как компьютер создает экземпляр драйвера последовательного порта при подключении Ардуино. В системе подключенная плата является экземпляром специального класса драйвера для работы с USB (Connected Device Class - CDC).

Такая организация приводит к тому, что при каждом сбросе платы, USB-соединение с компьютером будет разрываться и устанавливаться вновь. В системе устройство будет исчезать из списка доступных портов, соответственно последовательные порты будут перенумеровываться. Поэтому все программы, в которых был открыт порт Ардуино, потеряют соединение с устройством. Это одно из явных отличий Leonardo/Micro от Arduino Uno, в котором сброс микроконтроллера (ATmega328P) не приводит к разрыву USB-соединения (которое поддерживается дополнительным процессором ATmega8U2 или ATmega16U2). Эти отличия приводит к некоторым особенностям установки драйвера, процесса прошивки и взаимодействия с устройством, которые описаны ниже.

Отсутствие сброса при открытии последовательного порта.

В отличие от Arduino Uno, Arduino Leonardo и Micro не перезапускают загруженный скетч при каждом открытии последовательного порта на компьютере. Это означает, что компьютер не получит данные, отправленные платой до открытия в операционной системе последовательного порта (в том числе, например, данные, отправляемые в блоке setup()).

Такое изменение приводит к тому, что любые функции для передачи последовательных данных (такие, как print(), println(), write() и др.), написанные в блоке setup, не будут вызываться в момент открытия последовательного порта. Чтобы обойти эту проблему, можно программно проверять статус последовательного порта после вызова функции Serial.begin(), например, так:

Serial.begin(9600);
   // пока последовательный порт не будет открыт - ничего не делаем:
   while (!Serial) ;

Эмуляция клавиатуры и мыши.

Одно из преимуществ использования единого процессора для выполнения программ и USB-связи - это гибкость при взаимодействии устройства с компьютером. В частности, благодаря этому Ардуино может определяться в системе не только, как виртуальный последовательный порт (также называемый CDC), используемый для прошивки и передачи данных (подобно Arduino Uno), но и работать в качестве HID-устройства, эмулируя клавиатуру или мышь. Предупреждения об использовании этого режима см. в разделе "Правила хорошего тона при программировании", приведенном ниже.

Раздельное функционирование USB и UART.

В Arduino Leonardo и Micro, основной класс Serial ассоциирован с драйвером виртуального последовательного порта для соединения с компьютером через USB. Физически он не соединен с выводами 0 и 1, как это сделано на платах Arduino Uno и в более старых версиях. Для обращения к аппаратному последовательному порту (выводам 0 и 1, RX и TX) используйте класс Serial1. (Для получения дополнительной информации см. справку по классу Serial).

Отличия в распиновке.

Распиновка Arduino Leonardo несколько отличается от стандартного расположения некоторых выводов (особенно выводов интерфейсов SPI и TWI). Эти отличия подробно описаны на странице описания устройства.

Установка драйверов для Arduino Leonardo и Micro

OSX

  • При первом подключении Leonardo или Micro к компьютеру Mac, автоматически запустится программа "Keyboard Setup Assistant". Т.к. для Leonardo настраивать здесь особо нечего, можно просто закрыть это окно, кликнув по красной кнопке в левом верхнем углу.

Инструкции для Windows

Нижеследующие инструкции, прежде всего, относятся к Windows 7, хотя они также подходят и для Windows XP (лишь с небольшими отличиями в диалоговых окнах).

  • Подключите плату к компьютеру и дождитесь, пока Windows не запустит мастер установки драйверов. Если мастер не запустился автоматически, то вручную перейдите к Диспетчеру устройств (Пуск > Панель управления > Оборудование) и отыщите в списке строку Arduino Leonardo. Щелкните по ней правой кнопкой и выберите пункт "Обновить драйвер".
  • В появившемся окне выберите "Выполнить поиск драйверов на этом компьютере" и жмите Далее.
  • Жмите кнопку "Обзор...". В появившемся окне перейдите к папке с программным обеспечением Ардуино (которое вы предварительно скачали). Выберите папку drivers и нажмите ОК, а затем Далее.
  • Возникнет сообщение о том, что устанавливаемое оборудование не проходило тестирование в Windows Logo. Жмите на кнопку Все равно продолжить.
  • Через несколько секунд появится сообщение о том, что мастер завершил установку программного обеспечения для Arduino Leonardo. Теперь закройте окно.

Linux

Под Linux установка драйверов не требуется вообще. (Проверено на Ubuntu 10.0.4)

Прошивка программ в Arduino Leonardo и Micro

В целом, процесс загрузки программы в Arduino Leonardo или Micro особо ничем не отличается от прошивки Uno или других моделей Ардуино. Достаточно в среде разработки нажать кнопку Upload, и ваша программа будет автоматически загружена в память Ардуино и запущена им на выполнение. В общих чертах этот процесс устроен точно так же, как и в Arduino Uno: среда Arduino инициирует сброс платы, который приводит к запуску загрузчика, отвечающего за получение, хранение и запуска нового скетча.

Однако, поскольку последовательный порт, взаимодействующий с устройством, является виртуальным и исчезает при каждом сбросе платы, то среда разработки Ардуино придерживается несколько другой стратегии при выборе таймингов на загрузку скетча, в отличие от Uno и других моделей. В частности, после автоматического сброса Leonardo или Micro (через последовательный порт, выбранный в меню Tools > Serial Port), среда Ардуино ожидает появления в системе нового виртуального последовательного (CDC) / COM-порта - того, который предположительно будет "прослушивать" загрузчик. После этого среда осуществляет отправку скетча на этот вновь созданный порт.

Если автоматический сброс не сработал, то ввиду описанных отличий, использовать физическую кнопку сброса для прошивки Arduino Leonardo/Micro нужно несколько по-другому. Нажмите и удерживайте нажатой кнопку сброса на плате, после этого в среде разработки Ардуино кликните по кнопке Upload. Отпускайте кнопку сброса только после того, как в строке состояния программы появится надпись "Uploading...". После этого на плате запустится загрузчик, что приведет к созданию виртуального (CDC) последовательного порта на компьютере. Среда разработки увидит новый порт в системе и начнет передачу прошивки через этот порт. Опять таки, эти действия необходимы, только если на устройстве не сработала традиционная процедура прошивки (т.е. по нажатию одной кнопки Upload). (Обратите внимание, что автоматический сброс устройства происходит, если компьютер открывает последовательный порт на скорости 1200 бод и затем закрывает его; соответственно, он может не сработать, если что-то в системе оказывает влияние на USB-соединение с платой - например, отключенные прерывания).

Правила хорошего тона при программировании Arduino Leonardo и Micro

Несколько слов предостережения об использовании библиотек USB Mouse и Keyboard: постоянно запущенные на устройстве библиотеки Mouse или Keyboard могут сильно усложнить процесс прошивки Ардуино. Такие функции, как Mouse.move() и Keyboard.print() перемещают указатель мыши или постоянно отправляют сигналы о нажатии клавиш подключенному компьютеру, поэтому они должны вызываться только тогда, когда вы готовы обрабатывать поступающие от них события. Рекомендуется использовать какую-нибудь систему управления, позволяющую выключать подобную функциональность, например, в зависимости от положения переключателя или сигнала на выводе, состояние которого вы можете контролировать. Перед использованием функций библиотек Mouse или Keyboard непосредственно с компьютером, лучше всего протестировать возвращаемые ими значения с помощью функции Serial.print(). Так вы сможете удостовериться в правильности отправляемых значений. Подробнее см. примеры работы с библиотеками Mouse и Keyboard.

Эффективное использование программы Serial Monitor: поскольку последовательные данные идут только через один процессор, Ардуино может заполнять приемный буфер компьютера гораздо быстрее, чем другие устройства. Вам следует помнить, что при циклической отправке данных по последовательному интерфейсу, например, так:

void loop() {
    int sensorReading = analogRead(A0);
    Serial.println(sensorReading);
}

Serial Monitor в среде разработки может подтормаживать, поскольку он не будет успевать отображать поступающие от Ардуино данные. Если у вас возникла такая ситуация, добавьте небольшую задержку внутрь вашего цикла, чтобы приемный буфер компьютера не заполнялся слишком быстро. Поможет даже небольшая задержка в 1 мс:

void loop() {
    int sensorReading = analogRead(A0);
    Serial.println(sensorReading);
    delay(1);
}

Приложения, работающие с последовательным портом через родные библиотеки, а не через библиотеку RXTX, как правило, считывают данные с порта гораздо быстрее, поэтому в большинстве случаев вы не столкнетесь с этой ошибкой за исключением программ, построенных на базе функций RXTX (в том числе Serial Monitor, Processing и пр.).

Для получения дополнительной информации об Arduino Leonardo и Micro, см. описание устройств Leonardo и Micro. Подробнее о возможностях работы с USB см. справку по библиотекам Mouse и Keyboard