Raspberry Pi Picoで遊んでみた
この記事は Raspberry Pi Advent Calender 25日目の記事です。
完走おめでとう!
…????
(注意:記事中の画像はだいたい再現写真なのですでにパーツがついていたりします)
あらすじ
青年にはRaspberry Pi Picoがわからぬ。しかし、青年の手元には日本橋のデジットで「アマゾンより安いやん!」と衝動買いしたRaspberry Pi Picoが半年以上袋も開けぬまま確かにそこにあった。
ある日青年は、何年も前にリチウムイオン仕様に魔改造したゲームボーイポケットを、久々にテトリスを遊ぼうと取り出した。
しかし、たった2年も前には美しい灰色の反射板が見えていた液晶は、真ん中から画面の殆どが真っ黒に染まってしまっていたのだ。
青年は激怒した。必ず、邪智暴虐のビネガーシンドロームをこの世から消し去らねばならぬと決意した。
一寸落ち着いたあと、青年は気づいた。ビネガーシンドロームを撲滅するのは良いが、自分はまずは目の前のゲームボーイで遊びたいのである。そこでふと、青年の頭に思い浮かんだのは前述のRaspberry Pi Picoだ。Cortex-M0+@133MHzの性能、PIOやDMAを駆使すれば、ゲームボーイの小さな画面などあれよあれよとキャプチャできてしまうのではないか…?
善は急げである。部品箱を漁りやや袋の黄色くなったPicoを取り出した青年は、ボードマネージャでパッケージを更新しないとPIOが使えないのも忘れたままに、Arduino IDEを立ち上げ、100均のMicroUSBケーブルでPicoをPCにつなぎ始めた―
TL;DR
ゲームボーイの液晶をRaspberry Pi Picoでキャプチャしようとしてみた(未完)
ゲームボーイの液晶
ご存知の通り(?)160x144ピクセルのSTN液晶。実は一時期は160x160のパネルが使われている時期があったらしい。
仕様の詳細解説はちゃんとしたサイトに譲るとして、実はただの2ビットSPI(5V TTL、立ち下がりで取り込み。今回は適当にGPIOに直結しちゃいましたが、いいこはまねしないでね)。周波数はだいたい4MHzぐらいらしく、並のマイコンではちょっとキャプチャは厳しいかなー?という感じ。でもRaspberry Pi PicoのPOWERならなんとかしてくれるはず!
分解
リチウムイオン化があまりにも雑な様子
裏蓋はなくしました。
邪智暴虐のビネガーシンドロームの様子
Yネジはとうに捨てているのでイオシスの500円ドライバーでさくっと分解。
邪魔な線を剥ぎ取って基板を見るとダイオードが飛んでいたので直しました。
フラックスきちゃねー!
土曜日に滋賀のトリプルツーで買ってきたLM317で3.1Vを作って電源ON!
動作OK!
液晶コネクタ、初代ゲームボーイと同じかな?と思ったらそもそもピン数から違うっぽい?
と、思いつつ剥いていくと液晶の裏に超丁寧な大量のテストポイントが!
やっぱ俺達の任天堂!スゲー!
丸裸基板 with テトリス
接続
さっきから見えちゃってますが、こんな感じでそこらに転がってたモーターのUEWでさくっと。
接続は以下の通り。よいこのみんなはレベル変換をはさもうね
ST → GP2
D0 → GP3
D1 → GP4
CP → GP5
S → GP6
CPL → GP7
プログラミング
まずは「GPIOでなんとかなったら嬉しいな?」ということでgpio_getを使った雑でGO(digitalReadでは速度がたりなさそうなので)、とやったら普通に取れてしまいました。流石にCPUパワーの暴力。
…あれ?PIOいらなくね?
せっかくラズピコなんだからPIO使いたいだろ!
というわけでPIO編開幕です。
PIO
Arduino IDEでPIO使えるんかいな?と思ったらこういうブログがあり自分で適当にアセンブリしちゃえばいいそうで。
自分はこうやってスケッチと同フォルダにバッチファイルを用意しちゃいました。
新しめのバインディングじゃないとpioasmが入ってないらしいので注意!
pico-sdkのサンプルにちょいちょいと書き足して2-bit SPIなPIOを作成。
フレーム頭でFIFOのクリアさえやれば問題なく動いてくれました。
PCに送信
fpsを測定したところ30fpsで、40byte x 144line x 30Hzが1.3Mbpsぐらいなので2MbpsでUARTを立ち上げてフレームを生で送信、PC側では適当にSDLにでも表示するのを組んだら映りました。
が、結構横にぶれたりする。よくよく考えたらVBLANKの間に送るのは無理がありすぎるな?
まてよ?そういえばPicoには2つコアがあったな?
マルチコア編
Picoのマルチコアは結構かんたん。
こんな感じで適当に関数を呼ぶだけ。今回は送信とフレームキャプチャでコアを分けようという魂胆だ。
が、実際動かしてみると何故かサブコア側の処理が動かなかったり、送信側をサブコアに持っていこうとするとクラッシュしたっぽい挙動(USBでUARTとして認識しない)をしたりとよくわからんねえなと言う感じに。
アクセスかぶるのがだめなのかな?とスクラッチパッド経由で送受信しようとしても駄目・・・
と、このあたりでやる気WDTが作動してしまったのであえなく終了。
VGA出力とか手を変えていつかやってみようと思います。尻切れトンボですまん!
あとがきと言う名の駄文
いやあ、滑り込みアウト!でもなんとかなった(当社比)!
そんな今日はDanceDanceRevolution EXTREME 20周年!普段から音ゲーをやってる自分には知らん宗教の記念日なんかよりよっぽど大事な日です。
そのDDRや同じコナミの音ゲー、IIDXの専用コントローラーの基板やらPS系専用コントローラーの変換機をRPi Picoで作る予定があるので、その際はまたブログで書こうと思います!(CH552Gとかになるかも)乞うご期待