はじめに書いておきますが、自分はクレーンゲームに関しては、ニューUFOキャッチャーのソニックBGMにしか思い入れがありません。
持ってる基盤も当然EPR-14124のソニックバージョンですね。
今年後半はぼんやりとクレーンゲームで何かやりたいと考えていて、完全自作クレーンかアームユニットキットを購入してオリジナルクレーン筐体を作ろうかな、などといろいろ勘考してました。
そんな折、コントローラーの乗っ取り配線はんだ付けをしている時にふと思いつきまして、クレーンゲームのBGMだけ乗っ取り配線してしまえば好きな曲を好きなだけカスタマイズできるのではと気付きました。
アームユニットキットのBGMを差し替えたり、ROMを書き換えたりとかする方法もあるのですが、もっと自由に行うにはラズパイとかでBGMを管理し、クレーンゲームの移動ボタンや掴みボタン、景品取得センサーをGPIOで監視して導通したら設定した曲を流す、という単純な仕組みです。
プロトタイプのプログラムを組むべく乗っ取りBGMプロジェクトを開始。
とはいえ浜松マルツさんが土日祝休みになっていろんなパーツを手に入れる方法がAmazonかアリエクしかない(モノタロウは個人だと買えないものが多い)ので、とりあえず手持ちを使うしかありませんでした。
今回は何となくArduino使いたかったけどあらゆるものが入手困難すぎるのもあって、その辺に転がっていたラズパイを使います。
オーバースペックですがステレオミニジャックもついてるのでちょうど良さそう。
Python3で組むことにしました。
まずはどういった管理をするか、どういう処理を行うかを検討。
ここを後から変えるのは面倒ですからクレーンゲーム実機乗っ取り、もしくはキットでも使えることを想定して思考実験を繰り返します。
⚪︎やりたいこと
・クレーンゲームBGMの乗っ取り
・好きな曲、効果音の簡単な追加管理
・選曲、タイプ別選曲、ランダム再生、再生曲のループ回数等
・音に合わせてLED変色、点滅
・ 3.5インチタッチパネルでの表示、設定
・実機電源オフ時に安全にラズパイを終了
これ以上は今回のプロジェクトとは関係ないので思いついたら別プロジェクトとして進めることになります。
最低限やりたいことに絞ります。
まずはクリックで選曲などできるようにして、スペースキーで効果音(とりあえず20秒)がなるプログラムを組みます。
・フォルダ名01〜(そのままアルバム名として表示)
・フォルダ内ファイル名BG01〜(曲名として表示)、SE01〜(効果音エラー音等)
・1曲のループ回数、SE再生時間等の設定
・タッチパネル用に表示、クリック設定
この辺をきちんと定義しておけば、マウスクリック部分を掴みボタン検知、再生時間を掴み解除の検知プログラム等に置き換えるだけで実機向けにプログラムを改変し易くなります。
最初にフォルダやファイルを確認して01から好きな番号まで順番に管理、表示、再生をするので好きな曲セットも簡単自由に追加できるようにもしています。
ニューUFOキャッチャーの音は実機基盤から録音。
煩雑な設定でいろいろ出来るようにするより、設定操作はシンプルにしたまま、好みのカスタマイズはフォルダ内の番号管理を利用して好き勝手に構成する設計です。
タッチでの設定操作はタイプを選べる程度にする方がいいと考えました。
実機の電源オンに関しては、ラズパイを使用するためスイッチング電源に5V3A以上の出力があればそのまま流用できて都合が良いです。
5Vがなくても12Vがあれば降圧モジュールからUSB-Cで起動確保できそうです。
問題は電源オフ時です。
ここからは今回とは別に、UPS(無停電電源装置)を自作できないか考えていた頃の記憶を少し引っ張り出したいと思います。
当時は三日間くらいずーっと考えて悩んで(楽しんで)ました。
最初は単純にモバイルバッテリーがUPS代わりにならないか、という考え方。
誰もが思いつくヤツですね。
多くのモバイルバッテリーは自身を充電しながら電源供給できません。
仮にパススルー機能があっても電源瞬断時、バッテリーに切り替わるまでにラグがあり、どうしてもキレてしまいます。
ん? スマホは常にできてるじゃん? と思われるかもしれませんがこれはPMIC(パワーマネジメントIC)等が充電状態に関係なく常にバッテリーから安定した電圧を供給しているからです。
じゃあモバイルバッテリーにPMICとか使ってればUPSになるんじゃね? って思いますよね。
結論を書くとモバイルバッテリーにリチウムイオンセルやPMIC付けてDC/DCコンバータで安定化させればUPSを作ることは可能です。
それって4000円くらいで売ってるラズパイUPS…。
まぁそういうことです。
家庭用100V UPSでも安いのは8000円くらいからあります。
今回は素直にUPSを購入し、GPIOで実機の電源オフを検知したら即座に安全終了するスクリプトを実行すれば良いと考えました。
監視先は、例えば直接電源ラインを見てもいいし、起動時に常灯しているLEDだったりファン等を検知しても良いと思います。
筐体によっていろいろ違うのですがその辺妄想してる時間も楽しいですね。
もう一つの方法としては、前に何かの記事で書いたラズパイのブートプロテクトをかけて電源ブツ切りしちゃうのもありだと思います。
次はLEDテープライトの導入。
ここに至るまで特に重視していなかったのですが、いざ購入しようと見てみるといろいろな仕様があり検討せざるを得ませんでした。
・ラズパイで制御しやすいWS2812B
・hdmiと同期するLEDテープライト
・マイクなどで音を拾って勝手に点滅するLED
今回の内容だとこの3つになります。
当初からLEDテープライトはラズパイで制御するつもり、というかそういうものだと思っていましたが、hdmiと同期するならプログラム必要ないじゃん! マイクで音を拾って勝手に動くならhdmiすら必要ない! ということに気づきました。
音に合わせて勝手に同期するLEDテープライトならば制御プログラムも必要ないし、独立した電源管理になるためラズパイに状態書き込みとかもする必要がなくなるのでUPSも不要ということになります。
(再起動時に前回設定が反映されることも確認)
ぶっちゃけ音を拾うマイクもそこそこ反映できればいいし電源確保だけでいいのは魅力的過ぎますね。
この時点で起動後に書き込み動作が一切ないようにメインプログラムを書き換えました。
これで終了時電源ブッチ運用でも問題無いです。
と言うわけで、今回は勝手に周りの音に同期するLEDテープライトを購入しました。
価格もめちゃ安です。
現物が届きました。
まずはLEDテープライトを開封。
安いだけあってライトの密度は低め。
電源アダプタとマイク部分、テープライトそれぞれ差し込むだけで接続完了。
マイクが音を拾うと勝手にピカピカします。
眩しくて目が死にます。
設定でスピードとか明るさとか音楽モードを選択できる感じ。
今回の用途としては100点満点ですね。
そして実際組み込んで光らせているところです。
10mはちょうど良い長さでしたが、密度はもっとあっても良かったかな。
ついでに筐体の蛍光灯を上下ともLED直管に交換しました。
明るすぎて内側に仕込んだLEDテープライトが無意味になりました。
次、osoyooの3.5インチhdmiタッチパネルです。
今回はコイツに散々苦しめられた挙句6TBのHDDを飛ばす羽目になりました。(SDカードを入れたつもりで別のHDDなどをフォーマットからのインストールでほぼ復旧不可能になります。よくある事故です)
実際このタッチパネルが動くようになるまでかなりの時間と手間が掛かりました。
プログラムの方はぶっちゃけ頑張れば一日でいけますが起動するまで、環境を整えるまで全然安定しないし言うこと聞かないしとにかくそっちに時間が掛かります。
自分は最初ジャンパーワイヤーで直接接続していました(この商品の配線仕様を信用していない)が、本来そのままラズパイのGPIOに被せて接続するタイプのタッチパネルです。
コネクタに高さがあるので接続していても余った他のGPIOにジャンパーワイヤーを挿して使うことができるだけの余裕はあります。
ファンを置くほどの隙間はありませんしパッシブではかなり発熱します。
横からファンを回して冷やすようにしないとダメっぽいですね。
付属の説明書は割と酷くて、商品レビューでタッチパネルが動かない的な人が続出するのもむべなるかな、といった構成。
何度も何度もインストールを繰り返して分かったことをメモしておきます。
同じ製品を買った人の参考になりますように。
(OSOYOO Raspberry pi HDMI 3.5インチ LCD Touch Screen)
① 説明書から飛べるホームページは2ページあります。
飛んだらまず説明通りに進めず、購入した同製品のページを探して開きます。
同じ製品で使えるめちゃ古いラズパイイメージがおすすめされているのでそれをDLして使用します。
最新版とかレガシーなんかでも普通にDLして使うと死ぬほど苦労します。
② 同じページにHDMIドライバーのアドレスがあるのでルートアカウントを有効にしてHDMIドライバーをインストール。入れたら再起動。
③ ここで初めて説明にあるページの設定通りx11にしてconfig.txtを書き換えます。
ちなみに既にx11(wayland自体ない)でconfigも書き込まれてました。
HDMI-showの仕業かも。
ちなみにもう1ページはSSHとかwifiの設定、ターミナルソフトの紹介なので見る必要ないです。
④ 説明通りドライバーとキャリブレーションファイルをインストール。
説明通りにキャリブレーションの設定を保存。
⑤ キャリブレーションアプリを起動して実際タッチします。
その結果の数値をキャリブレーションの設定を開いて書き直します。
普通にラズパイイメージをインストールするとこのキャリブレーションが設定できなくなって苦労します。
これで完了です。
分かってしまえば簡単なんですけど説明がゴミすぎて本当に苦労しました。
プログラムを組む時間の20倍くらいは無駄な環境整備に時間を費やしてしまいました。
メインのプラグラムでミュージックプレイヤーをつくり、別のプログラムで出ている音を拾いイコライザー表示するようにしました。
アルバム送り、曲送りはタッチパネル対応。
GPIOを配線監視用として用意。
短絡したら他の音が割り込みできるようにします。
(GPIO17 コイン投入音、GPIO27 powerup音)
GPIOでの配線監視にあたり、今回の実験の被験者であるSEGA ベビーUFOについても少し触れておくことにします。
残念ながらマニュアルを持っていないのでエラー表示やDIPスイッチなどはある程度推測で利用しており正確な仕様は知りません。
内部配線を確認して、テストモードで動作中にフォトインタラプタ遮蔽の有無を確かめながら検証しました。
なので、おおよそあってると思うのですが、ベビーUFOはアームについたフォトインタラプタ3つと右奥に設置されたフォトインタラプタの状態を確認して決まった動作を行います。
(写真 : ケースを剥かれたフォトインタラプタ)
まず初期位置左手前にいる場合、アーム左のフォトインタラプタが遮蔽されるようになっており、残りの3つは解放中になります。
この時はテストモードでいう1なのですが、イニシャライズ動作ではまず奥に移動します。
手前→奥→右→アーム下降上昇→手前→左→アーム下降掴み上昇が一連の動きなっており、フォトインタラプタの状態を見てこの中の適合箇所から動作を始めるようになっています。
実際のプログラムを見たわけではありませんが、どういう状態で起動してもルーチンのどこにいるのか確認するだけで即メインのループに持っていけるというのはとても簡潔で美しいですね。
自作する時の参考になります。
テストモードの場合1で右ボタンを押すと(左ボタンはモード変更ボタン、右ボタンは実行ボタン)右に移動してアーム右のフォトインタラプタに遮蔽板が刺さるとテストモード2になります。
2は左移動のモードになります。
左の遮蔽板まで移動すると1になります。
テストモード3、4が奥、手前移動。
5、6がアーム下降上昇。
7がアーム掴みモード。
8はサウンドテストになります。
(9はなさそう)
これらの動作内容を鑑みて監視作業に入るわけですが、無電圧接点の接触だけで済ませるのが一番安全で簡単なので実機の中身を見て最適な場所を探っていきます。
一応フォトカプラも用意しておきました。
まずはお馴染みコインシューター。
すぐ下にサービススイッチもありますが、コイン投入マイクロスイッチ側につけて投入音を変えられるようにしなくてはいけません。
最終的にはサービススイッチにも接続したいところですが、モードによってサービススイッチの使用方法も変わるし、こちらはいちいちならない方が良いかも。
(写真 : アーム裏 レバー付きマイクロスイッチ)
続いて景品掴み中の曲を流すタイミング。
アームが開いた瞬間から、下降→掴み→上昇→穴まで移動→アーム開く、この一連の動作中となります。
ここの判定をどこで行うか、というのが結構難しいのですが一番簡単な方法だとアームが開ききったところにマイクロスイッチがあり、押されると次の動作下降にはいります。
下まで行くとアームが閉じて掴み動作、上昇、移動して穴の上でアームが開くことでもう一度マイクロスイッチが押されます。
景品の種類によってはマイクロスイッチがチャタリングを起こす可能性も考えてプログラムを組みます。
ざっくり書くと、①コインが投入されている ②最初のマイクロスイッチオンで効果音を流す ③10秒程度GPIO監視を停止 ④マイクロスイッチオンで効果音停止
こんな感じです。
①はイニシャライズ動作の時アームの開閉処理が特殊なのでこの時は効果音を流さないようにするためコイン投入(イニシャライズ中ではない)フラグで判別するためです。
実はこれだとコインを投入したまま筐体電源を切ってから復帰した場合、残コイン分の効果音がならないという残念なバグが発動します。
ん? DIPスイッチでクレジット無限モードにしてもダメなんじゃないですか? と思った人、それも正解です。
こういうところまで対応するのがクオリティに繋がるのかもしれませんが今回は電源ブッチを想定してSDカードへの書き込みを行わないと決めたのでそのまま行ってしまいます。
②コインフラグが立っていてアームマイクロスイッチが押されたら即効果音を流して③の処理に移ります。
③景品の高さや位置に関係なく開いて下降して掴んで上昇するという一連の流れの時間は変わらないので単純なチャタリング対策です。
④あとは穴の上でアームが開いたら景品があろうがなかろうが効果音停止のタイミングです。
最後は景品取得検知です。
景品が穴を通過した時にセンサーで読み取りGET音を流します。
もともとベビーUFOには付いていない機能なので筐体にセンサーを取り付ける必要があります。
アームキットでよく見るセンサーですね。
これで1500円くらいから販売されています。
実物は22x4cmとかなり大きく、厚さも2.8cmあります。
正直ベビーUFOには大きすぎますね。
穴周りに窪みというか空間があってある程度余裕はあるのですがコレは入りません。
筐体に穴を開ける覚悟があればかなりピッタリなサイズなんですけど私にはできませんでした。
と言うわけで景品取得音は今回なしです。
(写真 : 左 ベビーUFOフォトインタラプタ 右 : Amazonで5個800円くらいのフォトインタラプタ)
交換用に買ってあるフォトインタラプタがたくさんあるので透明な蓋的なヤツを仕込み、景品がそれを押し下げたときに遮蔽できるようにすれば割と簡単に検知することもできます。
ちょっと他ごとがいろいろあり過ぎて予定通り進めることができなかったので一旦ここで切ります。
記事を分けたくなかったので残念です。
実機への接続は次の機会に行います。








