Seeeduino XiaoはArduinoのプログラムでいけるので、まずはWikiを確認してArduino IDEをセットアップ
Seeeduino Xiaoをはじめよう
キーボードとして使いたかったので
Seeeduino XIAOをUSBデバイス(TinyUSB)として使うを設定
スケッチ例から→AdafruitTinyUSBLibrary→HID→hid_compositeを選択
これを確認すると、HID_USAGE_CONSUMER_VOLUME_DECREMENT=音量キーダウンの記載があったので、コードをコピペ変更して音量キーアップにして、他のいらない部分を消しました。
D0を音量キーアップ(0x00E9)、今後使うかもしれないのでD1を音量キーダウン(0x00EA)に設定して、コンパイル→書込で完成です。
Seeeduino Xiaoには3.3VのDCDCコンバーター(XC6206P332MR)が内蔵されているようで、ICのデータシート確認して200mAまで出せるのでDCDCを一つ省略できそうでした。
USB-Cから給電する5Vがそのまま取り出せるので5V系も動かせます。
というかSPI、I2C、UARTなどもついているので、これだけで全部こなせそうな勢いですね。
タッチディスプレイ追加して、ストップウオッチ表示できるように組み込めば。。。(そんなプログラム書けませんが)
以下スケッチ例コピペ
<pre>
/*********************************************************************
  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"
#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 = 12;
const int pin = 0;
const int pin2 = 1;
bool activeState = false;
#endif
// Report ID
enum
{
  RID_KEYBOARD = 1,
  RID_MOUSE,
  RID_CONSUMER_CONTROL, // Media, volume etc ..
};
// HID report descriptor using TinyUSB's template
uint8_t const desc_hid_report[] =
{
  TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(RID_KEYBOARD) ),
  TUD_HID_REPORT_DESC_MOUSE   ( HID_REPORT_ID(RID_MOUSE) ),
  TUD_HID_REPORT_DESC_CONSUMER( HID_REPORT_ID(RID_CONSUMER_CONTROL) )
};
// USB HID object
Adafruit_USBD_HID usb_hid;
// the setup function runs once when you press reset or power the board
void setup()
{
  usb_hid.setPollInterval(2);
  usb_hid.setReportDescriptor(desc_hid_report, sizeof(desc_hid_report));
  //usb_hid.setStringDescriptor("TinyUSB HID Composite");
  usb_hid.begin();
  // Set up button, pullup opposite to active state
  pinMode(pin, activeState ? INPUT_PULLDOWN : INPUT_PULLUP);
  pinMode(pin2, activeState ? INPUT_PULLDOWN : INPUT_PULLUP);
  Serial.begin(115200);
  Serial.println("Adafruit TinyUSB HID Composite example");
  // wait until device mounted
  while ( !USBDevice.mounted() ) delay(1);
}
void loop()
{
  // poll gpio once each 1 ms
  delay(1);
  // Whether button is pressed
  bool btn_pressed = (digitalRead(pin) == activeState);
  bool btn_pressed2 = (digitalRead(pin2) == activeState);
  // Remote wakeup
  if ( USBDevice.suspended() && btn_pressed )
  {
    // Wake up host if we are in suspend mode
    // and REMOTE_WAKEUP feature is enabled by host
    USBDevice.remoteWakeup();
  }
  if ( USBDevice.suspended() && btn_pressed2 )
  {
    // Wake up host if we are in suspend mode
    // and REMOTE_WAKEUP feature is enabled by host
    USBDevice.remoteWakeup();
  }
  /*------------- Consumer Control -------------*/
  if ( usb_hid.ready() )
  {
    // Consumer Control is used to control Media playback, Volume, Brightness etc ...
    // Consumer report is 2-byte containing the control code of the key
    // For list of control check out https://github.com/hathach/tinyusb/blob/master/src/class/hid/hid.h#L544
    // use to send consumer release report
    static bool has_consumer_key = false;
    if ( btn_pressed )
    {
      // send volume up (0x00E9)
      usb_hid.sendReport16(RID_CONSUMER_CONTROL, HID_USAGE_CONSUMER_VOLUME_INCREMENT);
      has_consumer_key = true;
    } else
    {
      // release the consume key by sending zero (0x0000)
      if (has_consumer_key) usb_hid.sendReport16(RID_CONSUMER_CONTROL, 0);
      has_consumer_key = false;
    }
  }
  /*------------- Consumer Control -------------*/
  if ( usb_hid.ready() )
  {
    // Consumer Control is used to control Media playback, Volume, Brightness etc ...
    // Consumer report is 2-byte containing the control code of the key
    // For list of control check out https://github.com/hathach/tinyusb/blob/master/src/class/hid/hid.h#L544
    // use to send consumer release report
    static bool has_consumer_key = false;
    if ( btn_pressed2 )
    {
      // send volume down (0x00EA)
      usb_hid.sendReport16(RID_CONSUMER_CONTROL, HID_USAGE_CONSUMER_VOLUME_DECREMENT);
      has_consumer_key = true;
    } else
    {
      // release the consume key by sending zero (0x0000)
      if (has_consumer_key) usb_hid.sendReport16(RID_CONSUMER_CONTROL, 0);
      has_consumer_key = false;
    }
  }
}
</pre>
 
				  Posted at 2021/02/02 02:54:32 |  | 
トラックバック(0) | 
RC | 日記