ボクタイシリーズでハードウェアチートするハードウェアを作った

2024/4/5

ボクタイシリーズの太陽センサーを操作するハードウェアを作りました。紫外線をぶち当てるだけで中身をいじったり、メモリをいじったりしているわけではないので多分セーフ(?)

ボクタイシリーズ

ボクらの太陽、縮めてボクタイシリーズをご存知でしょうか?


公式サイト から引用

太陽少年ジャンゴと言われたらピンとくる人もいるかも知れません。昔コロコロコミックで漫画もやってたので

ゲームボーイアドバンス(GBA)向けのゲームで3作品出ていて、DS でも1作品出ています。
実はメタルギアシリーズや、最近だと DEATH STRANDING で有名な小島秀夫氏が監督・プロデュースしているゲームだったりします。

で、このゲーム当時にしても今にしても珍しく、現実の太陽光を使ってゲーム内のギミックを解いたり、敵を倒したり、エネルギーを貯めたり、そういうことをする斬新なゲームなのです。

太陽センサー

このゲームのカセット(死語)には太陽センサーがついています。これに太陽光が当たることで太陽を検知してゲーム内になんらかの影響を与えます。

赤丸の中の黒い部分が太陽センサーです。

で、こいつは太陽光の何を検知しているかというとズバリ紫外線です。

センサーの詳細?

こちらのサイト によると浜松ホトニクス製 G5842 半導体UVセンサというものを使っているらしい。
これは適当にググったりしてデータシートをみてみると370nmあたりがピークらしい。

というわけで適当にそのあたりの波長が出せる紫外線LEDを買ってきてぶち当てれば多分反応するというわけです。

ゲームプレイにあたって

紫外線をぶち当てれば良いということはわかりましたが、ボクらの太陽シリーズではあえて太陽光を当てないようにしたり、太陽光が強すぎると逆に突破できないギミックもあります。

また子どもの熱中症対策の為なのか、長時間強い太陽光がセンサーにあたっていると太陽銃(主人公が使う武器)がオーバーヒートして使えなくなるという仕様があります。
つまり強い紫外線を当て続けるだけではダメで、操作できるようにする必要があります。

レッツ電子工作

結論: https://github.com/SeeLog/boktai_solar_control_device

Warning

紫外線LEDは使い方を誤ると危険です。
視力にダメージを負ったり、皮膚にダメージを負ったり、オゾンが発生して中毒になる危険性があります。
気をつけろ!ていうか真似すんな!

お買い物

  • XIAO RP2040
  • MCP4726
  • 紫外線LED
    • 370nm あたりのものが多分いい
    • 秋月電子通商さんだと I-13023(OSV2YL5111A) あたりが良いかも(直リンだめらしいのでググって)
  • ロータリーエンコーダー
    • 秋月さんなら P-05773 を使うと光るのでおもろいよ
  • 75Ωの抵抗
    • 5V駆動っぽいマイコンで今回の紫外線LEDだと30mAがマックス
    • LED のデータシート によるとVf(電圧降下)は3.4くらいらしい(20mA時)
    • 計算サイト で適当に計算して80Ωと出たが、ピッタシのものがなかったので75Ωでいいでしょの精神
    • ミスると LED 爆発するから気をつけて
  • 1kΩの抵抗
    • ロータリーエンコーダーのプッシュボタンとロータリーエンコーダーについてる LED への過電流防止
    • 別に1kΩじゃなくてもいいけど怪我しないようにね

全部そのへんに売ってるし、一般家庭にはストックがあるはずです

回路

こんな感じでつなぎます(雑)

プログラム

Golang の練習がてら Golang で書きましたが、めんどかったので普通に C++ とか使ったほうが多分良いです

https://github.com/SeeLog/boktai_solar_control_device/blob/main/main.go
https://github.com/SeeLog/boktai_solar_control_device/blob/main/rotary_encoder.go

イキってジェネリクスにしてるけどあんま意味ないやつ
1/**
2 * Add two values and return the result and overflow flag
3 */
4func add[T Integer](a T, b T) (T, bool) {
5 sum := a + b
6 overflow := (a > 0 && b > 0 && sum < 0) || (a < 0 && b < 0 && sum > 0)
7 return sum, overflow
8}

上はどうでも良くて下のコードが多分肝の部分。

I2C でデータを送ってアナログに変換するのですが、書き込み先のアドレスがググると 0x60 と出てくるのでそれを真似しましょう。

12bit のやつなので 12bit 送ります。
16bit の値の上位 8bit と 0x0F で AND を取れば 4bit 取り出せます。
そしたらもとの下位 8bit も 0xFF と AND を取って取り出します。
先頭の 0x00 はなにか忘れた!おまじないです

MCP4726の制御
1// I2C で 12bit の値を DAC に送る
2// 0x60: MCP4726 の I2C アドレス
3wErr := i2c.WriteRegister(0x60, 0, []byte{0x00, byte((value >> 8) & 0x0F), byte(value & 0xFF)})
4if wErr != nil {
5 println(wErr.Error())
6}

5V * (送った値) / 0x0FFF くらいの電圧が出力として多分出されます。

ロータリーエンコーダーの制御は結構めんどくさいので割愛。
コードパクっていってください。

ケース

LED を固定できないと意味ないんすよね、ぶっちゃけ
といわけでちょうどいいところに穴が空いたケースを作りました

https://github.com/SeeLog/boktai_solar_control_device/blob/main/boktai_solar.stl

3D モデリングもド素人ですが、こんなのを作ってみたのでみんなのお家にある 3D プリンターで印刷しよう!

こんな感じにぶっ刺しておけば収まりのいい位置に紫外線を照射できるはずです!
上部から漏れる光が嫌だったら適当に練り消しとかで蓋をしておくと良いと思います。

裏側にも穴が空いていますが、それは僕の改造済み GBA 本体から映像出力を PC へ送るための穴です。

いらなかったら自分で蓋をしよう!

遊ぼう!

バッチバチのゲージ MAX です。
真似すんなよ!

カテゴリー
プログラミング言語
フレームワーク/ライブラリ
ハードウェア
その他技術系
雑記