Seeed Studio XIAO SAMD21 作为 USB 设备 (TinyUSB)
本文档由 AI 翻译。如您发现内容有误或有改进建议,欢迎通过页面下方的评论区,或在以下 Issue 页面中告诉我们:https://github.com/Seeed-Studio/wiki-documents/issues

本篇 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 投资时间和资源提供此开源代码,
请通过购买 Adafruit 的产品支持 Adafruit 和开源硬件!
MIT 许可证,更多信息请查看 LICENSE
版权所有 (c) 2019 Ha Thach for Adafruit Industries
上述所有文本以及以下启动画面必须包含在任何再分发中
*********************************************************************/
#include "Adafruit_TinyUSB.h"
/* 此代码演示 USB HID 鼠标
* 按下按钮引脚将使鼠标移动到
* - 显示器的右下角
*
* 根据开发板的不同,按钮引脚
* 和其活动状态(按下时)可能不同
*/
#if defined ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS
const int pin = 4; // 左按钮
bool activeState = true;
#elif defined ARDUINO_NRF52840_FEATHER
const int pin = 7; // 用户按钮
bool activeState = false;
#else
const int pin = 0;
bool activeState = true;
#endif
// 使用 TinyUSB 模板的 HID 报告描述符
// 单报告(无 ID)描述符
uint8_t const desc_hid_report[] =
{
TUD_HID_REPORT_DESC_MOUSE()
};
// USB HID 对象
Adafruit_USBD_HID usb_hid;
// setup 函数在按下复位或为开发板供电时运行一次
void setup()
{
// 设置按钮,拉高或拉低与活动状态相反
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);
// 等待设备挂载
while( !USBDevice.mounted() ) delay(1);
Serial.println("Adafruit TinyUSB HID 鼠标示例");
}
void loop()
{
// 每 10 毫秒轮询一次 GPIO
delay(10);
// 检查按钮是否被按下
bool btn_pressed = (digitalRead(pin) == activeState);
// 如果按钮未按下,则无需执行任何操作
if (!btn_pressed) return;
// 远程唤醒
if ( USBDevice.suspended() )
{
// 如果我们处于挂起模式,并且主机启用了 REMOTE_WAKEUP 功能,则唤醒主机
USBDevice.remoteWakeup();
}
if ( usb_hid.ready() )
{
int8_t const delta = 5;
usb_hid.mouseMove(0, delta, delta); // 无 ID:向右 + 向下
}
}
技术支持与产品讨论
感谢您选择我们的产品!我们提供多种支持渠道,以确保您使用我们的产品时体验顺畅。我们提供多个沟通渠道,以满足不同的偏好和需求。