マウスホイールを使ってレトロゲーム機を作った話
ぼくのなつやすみのこうさく。
…的な何か。を、壊れたマウスから「ホイール」部分を取り出して簡単なゲーム機を作りました。。。いかにも、なつやすみ中遊び呆けていて、最終日になって慌ててやっつけで作ったような感じです(笑)
使用マイコンは Seeeduino XIAO。Cortex-M0+ の省電力マイコンなので乾電池でも余裕で動くことでしょう。
事の発端
知人のマウスが動かなくなってしまい、「捨てる」と言うので、サルベージした。
USB + 光学マウスで、ホイールも付いていたものの、かなり年季が入っていたものである。
(注記)わざわざこんな書き方をしても、若い方には通じないかもしれません。かつてマウスというものは「ボール」が入っていて(今で言うトラックボールが下側に入っている感じ)、「PS/2インターフェイス」で動くものだったからです。左右ボタンの間のスクロールホイールというものもありませんでした。
ヒューマンインターフェイスというものは、得てして原始的な作りだったりするのだ。
マウスホイールのしくみ
よく知られている話ですが、マウスホイールは電子工作erにとっては、もっとも身近な「ロータリーエンコーダ」ということになります。
だからマウスが壊れて使い物にならなくなったら、捨てる前に、マウスホイールだけでも部品取りしておきましょう(笑)
ロータリーエンコーダは基本的に3本の信号線が出てるものですが、どうやって回転方向を検知しているのか。ということについてはググる先生に聞いて下さい。
さらに、このマウスホイールを押し込むとスイッチが押下される仕組みにもなっているので、スイッチも部品取りしておきます。
レトロゲーム機を作ろう!
このマウスホイールを使って、片手で操作できる&乾電池で動くゲーム機を作ってみることにしました。
ゲームはキャラクターを左右に動かすだけ、あとはせいぜいボタン押下でショットを放つ程度…なので、インベーダーゲームのような単純なものに限られるかもしれませんが(^_^;
そこで、マウスホイールの他に以下のものを用意しておく。
-
マイコン:Seeeduino XIAO(Cortex-M0+)
従来の Arduino Uno などが積んでいるような ATMEGA328P マイコンと比較すると、圧倒的大容量のメモリを積んでいたりします。そして省電力でコンパクト、Arduinoでサクっと開発できる。しかも安い!(←ここ重要)。とても扱いやすいマイコンボードです。秋月あたりで580円くらいで売っている。 -
TFT-LCDモジュール
AliExpress でセールの時とかにいろんなサイズをいくつか買っておくと良い。大抵はSPI通信でサクっと制御できたりする。今回、筆者が使ったのは 1.44inch の 解像度 240x240 IPS 液晶でコントローラに ST7789v2 を積んだモジュールだ。Ali だとアホのように安い値段で売っている。
あとは電池ボックスとか、ユニバーサルとか、ピンソケットやらケーブルなどの細々としたもの。
それらを適当に配線。手書き(!)の回路図で十分である(!?)。
筆者が使用した ST7789 LCDモジュールは CS 信号が無い。BLKにPWMパルスを送り込めば明るさを調整できるのだけど、その必要がなければ特にNCでも構わない。電源+四本の信号があれば良いのでとても扱いが楽である。
また乾電池から電源を取るので、おまじない的にショットキーバリアダイオードをかましておいた。
こうしてユニバーサル上で組みあげたのがコレ。
ファームウェアの作成
Seeeduino XIAO はサクッと Arduino で開発できて、ファームも USB ケーブル一本あればアップロードできるので、たいへん便利ですね。環境セットアップなどはググる先生に聞くべし。
LCDの制御
ST7789 は SPI 通信で手軽に扱えます。 github に Arduino_ST7789_Fast という便利なライブラリがあるので、拝借して、ありがたく活用させていただきましょう。
COMPATIBILITY_MODE および CS_ALWAYS_LOW を定義しておくのと、TFT_DC および TFT_RST で使用するピンの番号をきちんと定義すれば、Seeeduino XIAO でも問題なく動きます。
ロータリーエンコーダの検知
基本的に、Common(GND) 以外の2本の信号線の変化を割り込みで検知してマウスホイールの回転方向を検知することになります。
Arduino では、setup() あたりでこんな感じで割り込みハンドラを定義しておけますね。
pinMode(RIN_A, INPUT_PULLUP);
pinMode(RIN_B, INPUT_PULLUP);attachInterrupt(RIN_A, ENC_READ, CHANGE);
attachInterrupt(RIN_B, ENC_READ, CHANGE);
割り込みハンドラ内で、どうやって回転方向を検知するかは、「ロータリーエンコーダ Arduino」でググるとザクザクと出てくるので、そういったソースを参考に作りましょう!
ここまで出来たら!
あとは「左右にキャラクタを動かして、ショットを撃つ」的なゲームでも作りましょう~。
筐体を作ろう!
電子工作の一番の悩みって、結局筐体(ケース)なんですよね…。
ちょうどいいケースが無かったりするので、100均でタッパーとか買って、カッターで穴開けて使ったりするものです。
ただ、最近は3Dプリンターで作る方も増えましたね。
しかし、筆者は3Dプリンターというものを持っていない(あっても使えないだろう)ので、今回はセリアで売っている PPシートを使いました。こいつを適当に切り開いて、折って接着剤でくっつけたり、半田ごてでプラスチック溶接をやったりして箱型にしたものです。
PPシートはアクリルカッターのようなものでいくらか溝を掘ってから、ゆっくり曲げていくと綺麗に折れます。「ゆっくり」じゃなくて、焦って グッ と曲げると折れてしまいます(´;ω;`)
そんなわけで完成!
動画は こちら。
乾電池でも動くおもちゃってなんかいいですよね。
今後の課題
Seeeduino XIAO は DAC も付いているようなので、圧電ブザーを付けて音が鳴るようにしたい…(えっ、付いていなかったの!?)
[了]
投稿者の人気記事
-
phillowcompiler
さんが
2021/02/26
に
編集
をしました。
(メッセージ: 初版)
-
phillowcompiler
さんが
2021/02/26
に
編集
をしました。
-
phillowcompiler
さんが
2021/02/26
に
編集
をしました。
ログインしてコメントを投稿する