arduino의 usb 호스트

개요



arduino uno에 usb host 연결하고, bluetooth 톤글 연결하고, bluetooth keyboard 연결하고, L 치카 해 보았다.

사진





로그





회로도





샘플 코드


#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();
}

좋은 웹페이지 즐겨찾기