ゲーム用カスタムArduinoジョイスティックハンドルの製作
部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| ロータリーポテンショメーター(10kΩ) | 1 |
| ブレッドボード | 1 |
必要な工具
- レーザーカッター(筐体カット用)
- 3Dプリンター(パーツ造形用、任意)
- Arduino Materia 101(または同等の開発環境)
使用ソフトウェア
- Arduino IDE
プロジェクト概要
レーシングゲーム用のステアリングコントローラーをArduino UNOで自作しました。市販のハンコンは高価なため、ポテンショメーター1個でステアリング角を検出し、ArduinoをUSBジョイスティック(HIDデバイス)として認識させる方式を採用。SteamでXbox 360コントローラーとして認識させるためにx360ceを併用します。
Arduinoをジョイスティック化する手順
1. UnoJoyライブラリの導入
- 最新版のUnoJoyをダウンロード
- 同梱の
InstallUnoJoyDrivers.batを実行してドライバーインストール - Atmel FLIPツールをインストール(ファームウェア書き込み用)
2. ファームウェア書き込み(DFUモード)
- Arduino UNOのUSBコネクタ横、6ピンヘッダーの先端側2ピン(GNDとHWB)をショートさせてDFUモードに入る
TurnIntoAJoystick.batを実行してジョイスティック用ファームウェアを書き込み- Arduinoを再接続すると「USBジョイスティック」として認識される
- 元に戻す場合は
TurnIntoAnArduino.batを実行
※ この操作は安全かつ可逆的ですが、自己責任で行ってください。
コントローラー回路

ポテンショメーターをアナログピンA0に接続(VCC-A0-GND)。UnoJoyライブラリのUnoJoy.hをスケッチフォルダにコピーしてインクルードします。
Steamで使用する設定
- x360ceをダウンロード(ゲームのビット数に合わせて32bit/64bit版)
- ゲームの実行ファイル(.exe)と同じフォルダに
x360ce.exeをコピー x360ce.exeを実行し、USBジョイスティックをXbox 360コントローラーとしてマッピング- Steamでゲームを起動すればハンコンとして認識
ソースコード
/* Arduino USB Joystick HID demo */
/* Author: Darran Hunt, Updated by RICLAMER 25/03/2014 */
/* UNO: 6軸13ボタン、MEGA: 8軸40ボタン対応 */
#undef DEBUG
#define NUM_BUTTONS 40
#define NUM_AXES 8
typedef struct joyReport_t {
int16_t axis[NUM_AXES];
uint8_t button[(NUM_BUTTONS + 7) / 8];
} joyReport_t;
joyReport_t joyReport;
uint8_t btn[12];
int fulloff = 0;
void setup() {
for (int portId = 2; portId < 13; portId++) {
pinMode(portId, INPUT_PULLUP);
}
Serial.begin(115200);
delay(200);
for (uint8_t ind = 0; ind < 8; ind++) joyReport.axis[ind] = ind * 1000;
for (uint8_t ind = 0; ind < sizeof(joyReport.button); ind++) joyReport.button[ind] = 0;
}
void sendJoyReport(struct joyReport_t *report) {
#ifndef DEBUG
Serial.write((uint8_t *)report, sizeof(joyReport_t));
#else
// デバッグ出力省略
#endif
}
void setButton(joyReport_t *joy, uint8_t button) {
uint8_t index = button / 8;
uint8_t bit = button - 8 * index;
joy->button[index] |= 1 << bit;
}
void clearButton(joyReport_t *joy, uint8_t button) {
uint8_t index = button / 8;
uint8_t bit = button - 8 * index;
joy->button[index] &= ~(1 << bit);
}
void loop() {
// ボタン読み取り (Digital 2-13 → Button 17-28)
for (int bt = 1; bt < 13; bt++) btn[bt] = digitalRead(bt + 1);
for (int on = 1; on < 13; on++) {
if (btn[on] == LOW) setButton(&joyReport, on + 16);
if (btn[on] == HIGH) clearButton(&joyReport, on + 16);
}
// アナログ軸読み取り (A0のみ使用: ステアリング = X軸)
for (uint8_t axis = 0; axis < 2; axis++) {
joyReport.axis[axis] = map(analogRead(axis), 350, 700, -32768, 32767);
}
// 未使用軸は0固定
joyReport.axis[2] = 0;
joyReport.axis[3] = 0;
joyReport.axis[4] = 0;
joyReport.axis[5] = 0;
joyReport.axis[6] = 0;
joyReport.axis[7] = 0;
sendJoyReport(&joyReport);
delay(35);
}
CADデータ
volante_iDt4RqmPLZ.dwg(AutoCAD)volante_idt4rqmplz_hakHRvVNYD.dxf(DXF)
レーザーカッター用の筐体設計ファイルです。
回路図

まとめ
低コストでレーシングハンコンを自作できるプロジェクトです。ポテンショメーター1つという最小構成ながら、UnoJoyとx360ceの組み合わせでSteamゲームで実用的に動作します。筐体設計を工夫すれば、ペダルやシフターの追加も可能です。ご質問や改善案があればYouTubeコメント欄やこちらまでお気軽にどうぞ。
製造プロセス
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- 古いラジコンカーをXboxコントローラーで操作可能に - ArduinoとUSBホストシールドで実現
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- Arduinoとジョイスティックでインタラクティブゲーム – LEDフィードバック付き
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduino駆動3Dプリントロボットアームの製作:ステップバイステップガイド
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- 非接触温度スクリーニングゲート:Arduino MKR1000で迅速・高精度な検温
- Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
- ArduinoとTEA5767で作る高性能FMラジオ受信機
- Arduino 101で作る万歩計:DHT11温湿度センサー&LCD表示付き