Arduino Nanoで4鍵音ゲーコントローラーを作ろう！

## はじめに
この記事は[長野高専 Advent Calender 2023](https://qiita.com/advent-calendar/2023/nnct)の8日目の記事です．

こんにちは．あおみなと といいます.
みなさんは 音ゲー してますか？ してますよね！

本記事では，2023年10月下旬に行われた第58回工嶺祭にて展示した5Jのクラス展示 「JABEET MANIA」で使用したコントローラーについて紹介します．

技術記事の執筆は初めてです．よろしくお願いします．

今回作成したコントローラーが使用されている「JABEET MANIA」のソフトウェア的なことは[長野高専 Advent Calender 2023 3日目 ](https://qiita.com/Tanoren/items/75fe4b006809d8478819)の記事にて，[たのれん](https://qiita.com/Tanoren)さんが紹介しているのでそちらもぜひご覧ください！

:::note warn
なお，この記事は私個人が自主的に執筆したものであり，学校とは一切関係ありません．
この記事の内容に関しての学校などへの直接問い合わせることははご遠慮ください．
:::

## 誰お前？？？
HN : あおみなと
所属 : 長野高専 電子情報工学科 5年
やってること : 組み込み，スマホを買う，各種音ゲー，ブルーなアーカイブ
メイン音ゲー : オンゲキ (三角葵親密度1000↑)


## JABEETMANIAってなーに
画面上部より降ってくるノーツ(細長いやつ)をタイミングよく押すリズムゲームです．
4鍵音ゲーです．難易度は"Easy"から"Expert"まで4段階あります．
これ↓
![スクリーンショット 2023-12-08 112813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/9aac8359-d0ae-9448-4fe1-4b8ba5ec58db.png)

![スクリーンショット 2023-12-08 112917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/438c42a7-5157-7d95-8622-ced57a146c63.png)
(マーシャルマキシマイザー 譜面担当しました)

## 開発経緯
今年のクラス展示どうする？
↓
音ゲー作りたいなあ
↓
コントローラーどうする？
↓
俺作ろうか？

って感じで決まった気がします．多分．

## スケジュール
スケジュールはだいたい以下の通りです．
5月 音ゲー作ろうぜ！！！
6月 ハード情報収集
7月 夏バテ
8月 かぜひいた・構想練り練り・設計
9月 試作・試作機評価
10月 量産・動作検証

夏休み前はほぼ手を付けず，夏休み中は週2くらい学校に来て開発してました．（夏休み中に学校？ 妙だな...）
夏休み明けはソフト側の開発班とすり合わせつつ，ばねの重さ変えたりスイッチ変えたり，ソフトウェア側でArduinoNanoを介した入力を読み込めるかのテストを行いました．
最初の検証に使ったArduinoNanoが初期不良品で動かねえ動かねえ言ってたのはいい思い出ですね

## Arduino Nanoってなーに
[Arduino公式サイト](https://store-usa.arduino.cc/products/arduino-nano?selectedStore=us)によると，
>The Arduino Nano is a small, complete, and breadboard-friendly board based on the ATmega328 (Arduino Nano 3.x). It has more or less the same functionality of the Arduino Duemilanove, but in a different package. It lacks only a DC power jack, and works with a Mini-B USB cable instead of a standard one.

らしいです．
なるほど強そう(小並感)

今回作成したコントローラではパソコンとシリアル通信を行うために使用しています．詳しくは仕組みの章で解説します．

じゃあこれを筐体分の個数買えばいいじゃん！っていう話になりますが，なんと**このArduino Nanoくんは公式サイトで1個約4,000円します**．ﾅﾝﾀﾞｯﾃｰ

元々の計画では筐体は5個用意する予定だったのでArduino Nano代だけで20,000円となり，予算がなくなってしまいました．僕のせいです あーあ

それじゃあ困るので今回のコントローラ制作では，3個セットで3,300円程度とそこそこお手頃な互換品を使用することになりました．
↓ Arduino Nano 互換品
![スクリーンショット 2023-12-08 040351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/7f5e476c-de57-5e14-c13c-ef812d73540a.png)

これでプロジェクトを進めることができるようになりました ﾔｯﾀｰ

## 仕組み
仕組みについてです．今回の技術的要素はすべてここにあります．
まずは~~みんな嫌い~~電気回路的なお話です．
言葉で説明するより図で説明したほうがわかりやすいと思うので，概略図ですが画像をご覧ください．

![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/2e9d3757-dc2a-82e6-1a04-7d506d9b9526.png)

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/78f4b736-588d-b80c-92e8-9bfdb7881846.png)

図のように**ボタンが押されていないときはArduino Nano側に信号が流れる**ようにし，**ボタンが押された時にはGND側に短絡してArduino Nano側には信号が届かないようにする**ことでボタンが押されたかどうかを検知しています．

続いては，どうやってパソコンと通信してるかのお話です．
実はArduino Nano単体だと，送られてきた信号をソフトウェアへ入力することができません．終わった....
と，思いきやなんと通信できる方法があります．
「JABEET MANIA」はSiv3DというC++フレームワークを用いて開発しています．
そのSiv3Dでは，**Arduinoからの入力をシリアル通信として入力することができちゃいます** 神！！！！
こちらも言葉だけだとわかりづらいと思うので概略図をどうぞ
![プレゼンテーション3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/ea4310a6-4a00-7bfe-8769-81a3fd5c7b25.png)

もちろん，スイッチが押されていない時も信号をぶん投げています．

これでハードウェア側とソフトウェア側の連携ができるようになりました．やったね
Siv3Dについて詳しく知りたい方は[公式サイト](URL:https://siv3d.github.io/ja-jp/)を見てみてください．


## 設計
今回コントローラの作成にあたり，1番意識していたのは予算です．
限られた予算の中でコントローラ作成から当日の会場の装飾までしなければなりません．なんてこった！
最初期の段階では，コントローラーの筐体として木や金属フレームの筐体を検討しましたが，木は加工する人によって品質にばらつきが出ること，金属フレームは予算的に厳しいということで断念しました．
品質を担保しつつ，予算内でどうにかしようと考えた結果，ある方法にたどり着きました．
それは...
**3Dプリンターで刷ればいいじゃん！**

というわけで，3Dプリンターで刷るための設計を行いました．
ところが，設計してみたところ筐体を一気に出力すると，プリンターの出力範囲を超えてしまうことが判明しました．



>**1回で出せないなら分割すればいいじゃない**　　　　　　*イサ・イレウコ(2023-2023)*



ということで左，中央，右筐体の3分割に分けて設計し，あとで3つを繋ぎ合わせる方式としました．

設計はみんな大好きFusion360でモデリング
![スクリーンショット 2023-12-08 095544.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/8d5a8569-dbaa-d12c-b7d9-1fbcbb044086.png)

スライス

![スクリーンショット 2023-12-08 095816.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/28368830-e471-ca34-f1c4-157daa7c883d.png)

プリントして完成！！(写真はプロトタイプのものです)
![1702000644212.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/50d26ef9-7a0b-0264-944a-dca207a75091.jpeg)

## 回路構築
続いては，回路構築です．
回路はユニバーサル基板上に構築しました．最初はブレッドボード上に構築しようとしていたのですが，ブレッドボードが想定よりも厚かったため，配線などの取り回しが懸念され断念しました．
ユニバーサル基板上に構築した回路図が以下の通りです．
![JABEETMANIA回路図 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/9302118a-4c89-5743-b312-9dc975789704.png)

~~チャタリング防止回路なんかねえよ~~
スイッチ関連で必ずと言っていいほど起こるチャタリングですが，シリアル通信で1秒間に読み込みできる回数が多いため，チャタリングによる大きな影響を受けづらく必要なしと判断しました．


この回路図の通りに実装した実際の基板がこちらです．
![1702000644191.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/55a82d5a-5270-0b6a-da7f-db22656f929b.jpeg)
![1702000644188.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/ef84e345-6149-f3a7-edd2-99b33b419f4d.jpeg)


う～ん
なんかはんだ付けちょっと汚くない？

なお，回路に関しては，ソフトウェアの開発を行っている[たのれん](URL:https://qiita.com/Tanoren)さんや[BetAmoto](URL:https://qiita.com/BetAmoto)さんから助言をいただきました．感謝．

## 作成風景
作成風景が何枚かあったので写真でどうぞ

これは世にも珍しい自生するArduino Nanoくんたち
![1702000644204.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/f5dea9bb-d60b-7274-f521-5432c34b1a59.jpeg)

本体接続試験(作った回路があってるか)
![1702001958221.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/ac60e44a-8973-402f-150a-67e2859e6f60.jpeg)

ArduinoNanoシリアル通信試験(これを通れば完成！)
![1702000644197.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588612/ec6b1de8-a879-1fc8-38fa-9b75f92feff6.jpeg)




## 完成品
というわけで、完成したものがこちらになります。

動作しているのがこれ↓

https://x.com/AmotoBet/status/1712745609063788710?s=20

## おわりに
いかがでしたか？

完成した感想ですが，
### やっぱり自分の思い描いたものができると楽しい！！！！！！！
ずっと音ゲーをプレイする側として生きてきた人生でしたが，初めて開発側に回ることでいろいろな気づきや仕組みなどを考えられてとてもいい経験になったと思います．**電子工作ってこんな楽しいんだ！！** ってことが少しでも伝われば幸いです．
この場をお借りして，「JABEET MANIA」制作に携わった方全員に最大限の感謝を————

みんなも自分で音ゲーを作って**最強の音ゲーマー**，目指しませんか？？

最後までご覧いただきありがとうございました．