2019年10月13日
| 【DIY】Arduinoを触ってみた
| ゆうがた |
| 登場したのは随分前らしいですが。(2005年ごろ?) 今まで気にはなっていたものの、メンドくさそうなので触らなかったArduinoですが、ちょっと作りたいものが出来たので試してみることにしました。
レースゲームをやってると、レース中に実車同様のボタン操作があったり、ゲーム内でのモード選択等、いろいろなボタン操作が必要になりますが、 最近のハンコンにはボタンがたくさん付いているので、まあまあ操作に困ることはありません。 が、ハンドルが1つだけならば良いのですが、複数持ってたりすると、ハンドルごとにボタン配置が違うため、同じ設定ボタンでも全然別の場所だったりして、覚えることができない。 ハンコンのボタンにラベルでも貼っておけばまだ良さ気ですが、基本VRしてるので、HMDを被ってるとそんなラベルも見えない。 となると、キーボードとかに割り当てておくのが無難てことになりますが、それだと雰囲気も出ないし、そもそもやはりVR中はキーボードも操作しづらい。
・・・等々の理由で、ハンコンの横に専用のコントローラを付けてる人が多いです。 ちなみにこういう製品も売っていますが、数が出ないこともあり大手メーカーではなく個人レベルみたいなメーカー製で、もちろんいい値段がする。 下の製品だと2〜3万円くらいです。
 ハンコンやHシフターとかはそれなりにメカニカルな構造が必要なため、おいそれと個人では作れませんが、こんなボタンやダイヤル程度のコントローラなんか、作れそうじゃん? そう、Arduinoとかのマイコンを使えば。 だいたい、作り方とかも最近はYouTubeとかにごまんとあるし、やってやれないことはなさそう。
 ということで、Arduinoを買ってみました。 買ったのはArduino UNO R3という製品。Amazonで1100円。 なんせ今まで情報集めをしてなかったので、Arduinoのマイコンボードなんて1種類だけだと思ってたので、気にせずテキトーに安いヤツ(中国製の互換品)を買ったわけですが。 結論から言うと、このボードではダメでした。 Arduinoには数十種類もボードがあり、一番出回っているのがこの「UNO」なのですが、コイツはUSBコントローラとしては使えない製品だったのです。 (搭載しているチップの関係で) 買ってから情報集めをしていて気づいたので、やむなく、自分の目的に使える「Arduino Leonardo」というボードを追加購入しました。Amazonで1199円。 まあどっちも別に高くないし、他の用途には使えるので返品とかはせず、何かに使うことにしました。 尚、最初に買った「UNO」も次の「Leonardo」も開発用基盤らしく、製品に組み込み向けの極小基盤のLeonardoもあったので、ついでにそっちも買っときました。(700円) 開発基盤で動作検証してから、実際の組み込みは極小基盤を使うカンジで。
 さらにボタンも要るのでこれまたAmazonで安物中国製(12個800円)も買っておきました。 ホントは秋月とかの電子部品屋に行けばもっと安くて品質の良いものもあると思いますが、通販は送料がかかるし、日本橋とか行くのメンドイし。 ただし、これらを入れるケースはちゃんとしたものは電子部品屋にしかなく、ホームセンターでは売ってませんでした。 が、電子部品屋のものも、ちょっとしたボタンボックス用には少し大きい。 良いのがないか考えていたところ、100均のプラケースに良いのがありそうと探しに行くと、程よい大きさ・厚さのがありました。もちろん110円。 ダイヤルとかは、以前フェラーリF1ハンコンを作ったときに余っているのがあるので、それを利用(といっても1個80円程度のロータリーエンコーダ)。 これで全材料がそろいました。間違えて買った部品込みでもわずか4000円弱。
 で、部品を組み立てる前に、まずはArduinoで目的の動作をするものが作れるかどうかの検証をしないといけません。 ArduinoはボードをPCにつないで、マイコンにプログラミングしてやらないと動作しません。 プログラミングするにはArduino専用の開発アプリ「Arduino IDE」(無料)を使います。
 一からプログラミングしても良いですが、アプリに入っているサンプルコードを利用すれば、よくある製品ならそのまま使えたりします。 サンプルになくても、GitHubとかを巡ると目的に合うコードを書いてる人もいたりするのでそれをダウンロードして取り込めばOK。 自分の目的はUSBコントローラなので、ジョイスティックとかのライブラリを作ってる人のコードを拝借しました。 このライブラリを使うと、アナログスティックやらハットスイッチ(十字キー)やらトリガーやらも使えますが、自分の目的には不要なので、ボタンのみが欲しい。 ボタンのみのシンプルなコードがサンプルで付いてたのですが、これは4ボタンのみ。 100均のプラケースはボタンもしくはダイヤルが12個程度配置できそうなので、12個分欲しい。 ならばということで、コードをテキトーにいじってはマイコンに書き込み、実際に動作させて(まだ物理ボタンは配線していないが)みるテストを繰り返し、 やっとボタン12個が表示されるようになりました。
 次に、実際にボタンを配線して動作確認します。 つなぎ方としては、任意のI/Oポートをプラス側、GNDをマイナス側としてボタンをつなぐだけです。 (ぶっちゃけテストレベルならボタンなんかなくても、プラス配線とマイナス配線だけでもOK) 自分的には電気回路に関してはまったくのド素人なので、複雑なことは一切できませんが(抵抗とかダイオードとかコンデンサとか何に使うかわからん)、ただのボタンなら簡単。 1個の動作はOK、2個つないでの動作も問題なしでした。
 この辺まではスムーズにいったのですが、問題が生じたのはダイヤル。 ボタンはプラスマイナスの2端子しかありませんが、ダイヤル(ロータリーエンコーダ)は3端子あります。 右回しなのか左回しなのかを取得するためにそれぞれ端子があるのです。(残り1個はGND) ということはどういうことかというと、ダイヤル1個に2つのI/Oポートが必要・・・つまりボタン9個+ダイヤル3個の構成なら、I/Oが12個では足りず15個必要。 ところがArduinoの基盤にはデジタル入出力ポートが12個しかありません。あと6ポートありますがこれはアナログ用。 ・・・なのですが、ググってみるとアナログポートはデジタルとしても使えることが分かりました!
これで一件落着、と思ったのですが、そう簡単にはいかない。 Arduino UNO、Leonardoともに、デジタルポートのピン番号は2〜13番で共通。 UNOに関しては、14〜19番がアナログポートのピン番号なので、その内の2〜16番をデジタルで使う、とコードを書くだけで良いのですが、メンドクサイことにLeonardoは違う。 Leonardoのアナログポートのピン番号はなぜか18〜23番。間が飛んでるのです。 サンプルコードではFor To文で数字を1つずつ繰り上げながら繰り返し処理をしてるので、間が飛ぶと処理ができない。 アナログポートはアナログ用のピン番号(A0〜A5)も持っていて、そっちでも指定はできるのですが、もちろんこれも同じFor To文に組み込めない。 で、いろいろ試行錯誤しましたが、結果的になんかうまくいきました(コーディングで一番ダメな回答やんけ)。
ま、ともかくプログラミングは成功したので、あとは物理配線をして組み立てるだけ。 久々のはんだ付けは少々大変でしたが(ハズキルーペが必要)、なんとかそれもでき、カーボンシートを貼ってそれっぽいものが完成しました。
 尚、最初は組み込み用の極小基盤で組み立てる予定でしたが、これまた誤算、極小基盤のほうは物理的に12ポートしかないので諦めました。 右ハンドル用Hシフターのボディに両面テープでくっつけて、あと機能ラベルも貼ったら完成。 一見、100均のプラケースとは思えないでしょ。 軽いので両面テープでも落ちないし。まあちょっとボタン押すときにペコペコへこむけど。
 尚、ボタンの動作は問題なし。 ダイヤルのほうは実はコーディングがテキトー(というかボタンと同じ動作)過ぎて、ちゃんと動作していません。 ロータリーエンコーダていうのは結構メンドクサイものらしく(これも今朝ググって知った)、チャタリング対策をしないとちゃんと使えないらしい。 現状では右にひねると左側も反応したり、どちらも反応しなかったり。 まあダイヤルは雰囲気で付けただけなので(全部ボタンだとちょっとダサい)、別にいいです。 その内、チャタリング対策もしてみます。 | | | |
|