RP2040を使用したジョイスティックを作成する。
環境
- XIAO RP2040
- Windows 11
- Arduino IDE 1.8.19
1.今回使用するボード
Seeed XIAO RP2040
Raspberry pi picoと同じチップを使用したボード
1000円位で安い
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F482400%2F698aac05-052b-081e-21db-8e88f066598f.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b5e4e51de80015781462ae727a56aac4)
2.ArduinoIDEの下準備
ボードデータの追加
ファイル -> 環境設定 -> 追加のボードマネージャのURLにRP2040を追加
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F482400%2F7041a57d-57ce-cb4c-ca9b-3c69930747fa.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a0713fb14b834333a9ffc3ccf12311be)
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
ライブラリの追加
今回使用するライブラリは下記
RP2040のボードを追加したときに自動的に入る
入っていなければ、下記のGitからzip ファイルをDLしてArduinoIDEに読み込ませる
2.配線
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F482400%2Fd836802a-6dcc-efe9-eac5-ebfe76867f73.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=3d5bb72f642b10423f98a71a01ed91d7)
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名のデバイスを確認
ゲームコントローラの設定
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F482400%2Fe4aa6db6-7280-f1cc-70e9-7737df0a65e4.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=7f0f4fa3846026695e8b19fedc1b3049)
なぜか x,y,z軸 回転軸 ボタンが32個 表示されるが、今回使用しているのは一部のみ
ジョイスティックを動かすとXY軸が動くことが確認できた。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F482400%2Fb2cded19-11d3-142c-dfe0-3fad6775cb71.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=fe53b987f0685f778c646710fe88937e)
4.まとめ
RP2040を使用してジョイスティックとして認識させ動作をPCに取り込むことができた。