arduinoでusb host

#概要
arduino unoにusb hostつないで、bluetoothトングルつないで、bluetooth keyboardつないで、Lチカしてみた。
#写真
![MVC-004S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/fb2e74e2-0734-7fdb-bb41-bcd049153c0e.jpeg)

#ログ
![bt.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/49266ecb-4642-363b-fe6a-c3cb3fcee20c.jpeg)

#回路図
![usbh.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/d1b9a153-6ac1-09e3-0aaa-8eea7669cbdd.jpeg)

#サンプルコード
```
#include <BTHID.h>
#include <usbhub.h>
#include "MouseParser.h"
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

class KbdRptParser : public KeyboardReportParser
{
protected:
	virtual uint8_t HandleLockingKeys(USBHID * hid, uint8_t key);
	virtual void OnControlKeysChanged(uint8_t before, uint8_t after);
	virtual void OnKeyDown(uint8_t mod, uint8_t key);
	virtual void OnKeyUp(uint8_t mod, uint8_t key);
	virtual void OnKeyPressed(uint8_t key);
private:
	void PrintKey(uint8_t mod, uint8_t key);
};
uint8_t KbdRptParser::HandleLockingKeys(USBHID * hid, uint8_t key)
{
	uint8_t old_keys = kbdLockingKeys.bLeds;
	switch (key)
	{
	case UHS_HID_BOOT_KEY_NUM_LOCK:
		Serial.println(F("Num lock"));
		kbdLockingKeys.kbdLeds.bmNumLock = ~kbdLockingKeys.kbdLeds.bmNumLock;
	break;
	case UHS_HID_BOOT_KEY_CAPS_LOCK:
		Serial.println(F("Caps lock"));
		kbdLockingKeys.kbdLeds.bmCapsLock = ~kbdLockingKeys.kbdLeds.bmCapsLock;
	break;
	case UHS_HID_BOOT_KEY_SCROLL_LOCK:
		Serial.println(F("Scroll lock"));
		kbdLockingKeys.kbdLeds.bmScrollLock = ~kbdLockingKeys.kbdLeds.bmScrollLock;
	break;
	}
	if (old_keys != kbdLockingKeys.bLeds && hid)
	{
		BTHID * pBTHID = reinterpret_cast<BTHID *> (hid);
		pBTHID->setLeds(kbdLockingKeys.bLeds);
	}
	return 0;
};
void KbdRptParser::PrintKey(uint8_t m, uint8_t key)
{
	MODIFIERKEYS mod;
	* ((uint8_t *) &mod) = m;
	Serial.print((mod.bmLeftCtrl == 1) ? F("C") : F(" "));
	Serial.print((mod.bmLeftShift == 1) ? F("S") : F(" "));
	Serial.print((mod.bmLeftAlt == 1) ? F("A") : F(" "));
	Serial.print((mod.bmLeftGUI == 1) ? F("G") : F(" "));
	Serial.print(F(" >"));
	PrintHex<uint8_t>(key, 0x80);
	Serial.print(F("< "));
	Serial.print((mod.bmRightCtrl == 1) ? F("C") : F(" "));
	Serial.print((mod.bmRightShift == 1) ? F("S") : F(" "));
	Serial.print((mod.bmRightAlt == 1) ? F("A") : F(" "));
	Serial.println((mod.bmRightGUI == 1) ? F("G") : F(" "));
};
void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
	Serial.print(F("DN "));
	PrintKey(mod, key);
	uint8_t c = OemToAscii(mod, key);
	if (c) OnKeyPressed(c);
};
void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after)
{
	MODIFIERKEYS beforeMod;
	* ((uint8_t *) &beforeMod) = before;
	MODIFIERKEYS afterMod;
	* ((uint8_t *) &afterMod) = after;
	if (beforeMod.bmLeftCtrl != afterMod.bmLeftCtrl) Serial.println(F("LeftCtrl changed"));
	if (beforeMod.bmLeftShift != afterMod.bmLeftShift) Serial.println(F("LeftShift changed"));
	if (beforeMod.bmLeftAlt != afterMod.bmLeftAlt) Serial.println(F("LeftAlt changed"));
	if (beforeMod.bmLeftGUI != afterMod.bmLeftGUI) Serial.println(F("LeftGUI changed"));
	if (beforeMod.bmRightCtrl != afterMod.bmRightCtrl) Serial.println(F("RightCtrl changed"));
	if (beforeMod.bmRightShift != afterMod.bmRightShift) Serial.println(F("RightShift changed"));
	if (beforeMod.bmRightAlt != afterMod.bmRightAlt) Serial.println(F("RightAlt changed"));
	if (beforeMod.bmRightGUI != afterMod.bmRightGUI) Serial.println(F("RightGUI changed"));
};
void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key)
{
	Serial.print(F("UP "));
	PrintKey(mod, key);
};
void KbdRptParser::OnKeyPressed(uint8_t key)
{
	Serial.print(F("ASCII: "));
	Serial.println((char) key);
	if (key == 49) digitalWrite(2, HIGH);
	if (key == 48) digitalWrite(2, LOW);
};
USB Usb;
BTD Btd(&Usb);
BTHID bthid(&Btd, PAIR, "0000");
KbdRptParser keyboardPrs;
MouseRptParser mousePrs;
void setup()
{
	pinMode(2, OUTPUT);
	Serial.begin(115200);
	if (Usb.Init() == -1)
	{
		Serial.print(F("\r\nOSC did not start"));
		while(1);
	}
	bthid.SetReportParser(KEYBOARD_PARSER_ID, &keyboardPrs);
	bthid.SetReportParser(MOUSE_PARSER_ID, &mousePrs);
	bthid.setProtocolMode(USB_HID_BOOT_PROTOCOL);
	Serial.print(F("\r\nHID Bluetooth Library Started"));
}
void loop()
{
	Usb.Task();
}
```