RP2040を使用したジョイスティックを作成する。
環境
- XIAO RP2040
- Windows 11
- Arduino IDE 1.8.19
1.今回使用するボード
Seeed XIAO RP2040
Raspberry pi picoと同じチップを使用したボード
1000円位で安い
2.ArduinoIDEの下準備
ボードデータの追加
ファイル -> 環境設定 -> 追加のボードマネージャのURLにRP2040を追加
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
ライブラリの追加
今回使用するライブラリは下記
RP2040のボードを追加したときに自動的に入る
入っていなければ、下記のGitからzip ファイルをDLしてArduinoIDEに読み込ませる
2.配線
3.ジョイスティックとして認識させる
コードの実装
ヘッダファイルとピンの設定
#include "Adafruit_TinyUSB.h"
#define BTN D4
#define ANALOG_X A0
#define ANALOG_Y A1
uint8_t const desc_hid_report[] =
{
TUD_HID_REPORT_DESC_GAMEPAD()
};
Adafruit_USBD_HID usb_hid(desc_hid_report, sizeof(desc_hid_report), HID_ITF_PROTOCOL_NONE, 2, false);
hid_gamepad_report_t gp;
初期設定
void setup()
{
TinyUSB_Device_Init(0);
usb_hid.begin();
// wait until device mounted
while( !TinyUSBDevice.mounted() ) delay(1);
pinMode(BTN, INPUT_PULLUP);
pinMode(ANALOG_X, INPUT);
pinMode(ANALOG_Y, INPUT);
if ( !usb_hid.ready() ) return;
gp.x = 0;
gp.y = 0;
gp.z = 0;
gp.rz = 0;
gp.rx = 0;
gp.ry = 0;
gp.hat = 0;
gp.buttons = 0;
usb_hid.sendReport(0, &gp, sizeof(gp));
}
analogRead,digitalReadで読み取った内容をhid_gamepad_report_t構造体に入れ
usb_hid.sendReportでPCに送信をしています。
void loop()
{
gp.x = (int8_t)map(analogRead(ANALOG_X), 0, 1023, -127, 127);
gp.y = (int8_t)map(analogRead(ANALOG_Y), 0, 1023, -127, 127);
gp.buttons = (!digitalRead(BTN) << 0);
usb_hid.sendReport(0, &gp, sizeof(gp));
}
Windowsで認識するか確認
書き込んでWindowsにさしJoystickとして認識することを確認する
コントロール パネル\ハードウェアとサウンド\デバイスとプリンターからXIAO RP2040名のデバイスを確認
ゲームコントローラの設定
なぜか x,y,z軸 回転軸 ボタンが32個 表示されるが、今回使用しているのは一部のみ
ジョイスティックを動かすとXY軸が動くことが確認できた。
4.まとめ
RP2040を使用してジョイスティックとして認識させ動作をPCに取り込むことができた。