Seeed Studio XIAO SAMD21 を USB デバイスとして使用する(TinyUSB)

この Wiki では、TinyUSB ライブラリを使用して Seeed Studio XIAO SAMD21 を USB クライアントとして使用する方法を紹介します。これにより、Seeed Studio XIAO SAMD21 をキーボード、マウスなどの HID デバイスとして使用できるようになります。
この機能は Adafruit TinyUSB Library for Arduino に依存しています。このライブラリは Seeed Studio XIAO SAMD21 と Wio Terminal(SAMD51) でテストされ、正常に動作しています。
Adafruit TinyUSB Library for Arduino のインストール
「Adafruit TinyUSB Library for Arduino」ライブラリの大幅なアップデートにより、V1.0.0 以降のバージョンは Seeed Studio XIAO SAMD21 では使用できません。このライブラリを使用する必要がある場合は、V0.10.5 バージョンのライブラリを使用してください。
-
Adafruit TinyUSB Library for Arduino リポジトリにアクセスし、リポジトリ全体をローカルドライブにダウンロードします。
-
これで、ライブラリを Arduino IDE にインストールできます。Arduino IDE を開き、
sketch
->Include Library
->Add .ZIP Library
をクリックし、ダウンロードしたAdafruit_TinyUSB_Arduino
ファイルを選択します。
簡単なサンプルコード
TinyUSB ライブラリには多くのサンプルが提供されています。ここでは、簡単なマウスのサンプルとして Files
-> Examples
-> Adafruit TinyUSB Library
-> HID
-> hid_mouse
に移動できます。Seeed Studio XIAO SAMD21 の D0 ピンにボタンを接続し、コード(#28)でも設定します:
コンパイルエラーを避けるため、ArduinoCore-samd
を最新バージョンに更新していることを確認してください。
/*********************************************************************
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
MIT license, check LICENSE for more information
Copyright (c) 2019 Ha Thach for Adafruit Industries
All text above, and the splash screen below must be included in
any redistribution
*********************************************************************/
#include "Adafruit_TinyUSB.h"
/* This sketch demonstrates USB HID mouse
* Press button pin will move
* - mouse toward bottom right of monitor
*
* Depending on the board, the button pin
* and its active state (when pressed) are different
*/
#if defined ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS
const int pin = 4; // Left Button
bool activeState = true;
#elif defined ARDUINO_NRF52840_FEATHER
const int pin = 7; // UserSw
bool activeState = false;
#else
const int pin = 0;
bool activeState = true;
#endif
// HID report descriptor using TinyUSB's template
// Single Report (no ID) descriptor
uint8_t const desc_hid_report[] =
{
TUD_HID_REPORT_DESC_MOUSE()
};
// USB HID object
Adafruit_USBD_HID usb_hid;
// the setup function runs once when you press reset or power the board
void setup()
{
// Set up button, pullup opposite to active state
pinMode(pin, activeState ? INPUT_PULLDOWN : INPUT_PULLUP);
usb_hid.setPollInterval(2);
usb_hid.setReportDescriptor(desc_hid_report, sizeof(desc_hid_report));
usb_hid.begin();
Serial.begin(115200);
// wait until device mounted
while( !USBDevice.mounted() ) delay(1);
Serial.println("Adafruit TinyUSB HID Mouse example");
}
void loop()
{
// poll gpio once each 10 ms
delay(10);
// Whether button is pressed
bool btn_pressed = (digitalRead(pin) == activeState);
// nothing to do if button is not pressed
if (!btn_pressed) return;
// Remote wakeup
if ( USBDevice.suspended() )
{
// Wake up host if we are in suspend mode
// and REMOTE_WAKEUP feature is enabled by host
USBDevice.remoteWakeup();
}
if ( usb_hid.ready() )
{
int8_t const delta = 5;
usb_hid.mouseMove(0, delta, delta); // no ID: right + down
}
}
技術サポートと製品ディスカッション
弊社製品をお選びいただきありがとうございます!弊社製品での体験ができるだけスムーズになるよう、さまざまなサポートを提供しています。さまざまな好みやニーズに対応するため、複数のコミュニケーションチャンネルを提供しています。