Назначение
Модуль предназначен для подключения к платам Arduino/Freeduino различной USB-периферии, является аналогом модуля от Circuits@Home и отличается только более удобным конфигурированием выводов SS/INT, а также совместимостью с платами формата Nano.
Модуль поставляется в двух вариантах монтажа - для плат стандартного формата Arduino, и для плат формата Nano. Немонтируемые в той или иной версии разъемы высылаются вместе с платой для возможного последующего монтажа.
В настоящее время библиотека USB Host Library, разработанная для подобных модулей, поддерживает ряд функционала следующих устройств:
- HID устройства, такие как клавиатуры, мыши, джойстики и др.
- Игровые контроллеры - Sony PS3, Nintendo Wii, Xbox360
- Последовательные порты - FTDI, PL-2303, ACM, а также некоторых сотовых телефонов и GPS приемников.
- ADK-Android телефоны и планшеты
- Цифровые фотоаппараты - Canon EOS, Powershot, Nikon
- Ряд устройств хранения данных, такие как USB флэш накопители, внешние жесткие диски
- Ряд Bluetooth адаптеров
Принципиальная схема по лицензии Creative Commons Attribution-ShareAlike 2.5
Подключение модуля
USB Host Shield основан на микросхеме программно-управляемого USB-контроллера Max3421E.
Обмен данными между микросхемой Max3421E (в составе USB Host Shield v.3) и микропроцессором Atmega (в составе Arduino/Freeduino) осуществляется по SPI интерфейсу. Для обмена данными задействуются пять выводов платы Arduino/Freeduino: SCK, MISO, MOSI, SS для организации SPI интерфейса, и вывод INT для организации прерываний. Сигналы SCK, MISO, MOSI подключены к выводам 13, 12, 11 платы Arduino/Freeduino. Для совместимости со сторонними платами Mega возможно подключение этих сигналов через разъем ICSP.
Для аппаратной совместимости с другими модулями и версиями плат сигналы SS и INT могут быть переключены на любой из пинов 10, 9 или 8 платы Arduino/Freeduino при помощи группы перемычек JSS и JINT. По умолчанию в библиотеке USB Host Library принято, что сигнал SS подключен к пину 10, а сигнал INT к пину 9.
Схема питания
Схема питания USB Host Shield v.3. осуществляет подачу 3.3В на микросхему Max3421E и согласование сигнальных уровней напряжений 5В микросхемы Atmega на плате Arduino/Freeduino и 3.3В микросхемы Max3421E модуля USB Host Shield v.3.
Схема стабилизированного питания 3.3В собрана на линейном стабилизаторе напряжения MC33269D-3.3. Питание 5В на вход стабилизатора MC33269D-3.3 подается с платы Arduino/Freeduino.
Согласование уровней напряжения 3.3В и 5В реализовано на двух микросхемах:
74AHC125 – преобразователь уровней с 5В до 3.3В для сигналов SCK, MOSI, SS, RESET.
74HCТ125 – преобразователь уровней с 3.3В до 5В для сигналов MISO, INT, GPX.
Дополнительный сигнал GPX может быть при необходимости задействован в Ваших разработках самостоятельно.
Возможен выбор источника питания 3.3В от стабилизатора MC33269D-3.3 USB Host Shield или от встроенного в плату Arduino/Freeduino с помощью перемычки SJPWR.
Кроме того, возможна работа с платами Arduino/Freeduino с напряжением питания ATmega 3.3В. В таком случае отпадает необходимость в преобразовании уровней напряжения, т.к. сигналы платы Arduino/Freeduino также имеют уровень 3.3В. Для передачи сигналов 3.3В без их преобразования предусмотрено семь джамперов: SJ4 (MISO), SJ5 (INT), SJ6 (GPX), SJ7 (SCK), SJ9 (SS), SJ8 (Reset), SJ10 (MOSI). Замыкание джамперов шунтирует входы/выходы микросхемы 74AHC125 и 74HCТ125 и сигналы 3.3В передаются напрямую. Микросхемы 74AHC125 и 74HCТ125 могут быть выпаяны.
USB Host Shield обеспечивает питание периферийных USB устройств постоянным напряжением 5В, однако с целью уменьшения энергозатрат для некоторых периферийных устройств USB возможно напряжение питания 3.3В. С этой целью предусмотрен выбор питания на шине USB при помощи джампера JBUS, который по умолчанию подключен в положение 5В.
Библиотека USB Host Library
Библиотека USB Host Library доступна на страничке разработчика, в том числе, в виде архива, а также у нас.
Она совместима с ПО Arduino версии 1.0.5 (также предполагается совместимость и с более поздними версиями).
Более подробно установка библиотек описана в разделе подключение библиотек. Структура каталогов папки libraries после установки должна стать такой:
/libraries/USB_Host_Shield_20
/libraries/USB_Host_Shield_20/examples
/libraries/USB_Host_Shield_20/...
Библиотека достаточно "объемна", поскольку поддерживает большое количество различной периферии, и кроме того, может компилироваться не только для Arduino-совместимых устройств. В силу этого, для решения многих задач, связанных с обменом данными по USB может потребоваться глубокое понимание стандартов USB и навыки программирования C/C++ на уровне выше начального.
К библиотеке прилагаются примеры, поясняющие работу с ней.
Рассмотрим пример подключения манипулятора типа мышь и обработки событий движения мыши и нажатия на клавиши.
#include <hidboot.h>
class MouseRptParser : public MouseReportParser
{
protected:
virtual void OnMouseMove(MOUSEINFO *mi);
virtual void OnLeftButtonUp(MOUSEINFO *mi);
virtual void OnLeftButtonDown(MOUSEINFO *mi);
virtual void OnRightButtonUp(MOUSEINFO *mi);
virtual void OnRightButtonDown(MOUSEINFO *mi);
virtual void OnMiddleButtonUp(MOUSEINFO *mi);
virtual void OnMiddleButtonDown(MOUSEINFO *mi);
};
void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
{
Serial.print("dx=");
Serial.print(mi->dX, DEC);
Serial.print(" dy=");
Serial.println(mi->dY, DEC);
}
void MouseRptParser::OnLeftButtonUp(MOUSEINFO *mi)
{
Serial.println("L Butt Up");
}
void MouseRptParser::OnLeftButtonDown(MOUSEINFO *mi)
{
Serial.println("L Butt Dn");
}
void MouseRptParser::OnRightButtonUp(MOUSEINFO *mi)
{
Serial.println("R Butt Up");
}
void MouseRptParser::OnRightButtonDown(MOUSEINFO *mi)
{
Serial.println("R Butt Dn");
}
void MouseRptParser::OnMiddleButtonUp(MOUSEINFO *mi)
{
Serial.println("M Butt Up");
}
void MouseRptParser::OnMiddleButtonDown(MOUSEINFO *mi)
{
Serial.println("M Butt Dn");
}
USB Usb;
USBHub Hub(&Usb);
HIDBoot<HID_PROTOCOL_MOUSE> Mouse(&Usb);
MouseRptParser Prs;
void setup()
{
Serial.begin( 115200 );
Serial.println("Start");
if (Usb.Init() == -1)
Serial.println("OSC did not start.");
delay( 200 );
Mouse.SetReportParser(0,(HIDReportParser*)&Prs);
}
void loop()
{
Usb.Task();
}