ハイハイスクールアドベンチャー_picocalc版
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| ハイハイスクールアドベンチャー_picocalc版 [2025/04/04 12:06] – [まあいろんな話] araki | ハイハイスクールアドベンチャー_picocalc版 [2025/09/18 01:32] (現在) – [あらすじ] araki | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| ====== ハイハイスクールアドベンチャー PicoCalc版 ====== | ====== ハイハイスクールアドベンチャー PicoCalc版 ====== | ||
| + | ===== あらすじ ===== | ||
| + | |||
| + | 2019年((まさかこのゲームが2019年を超えて生き残っているとは思っていなかっただろう。))神奈山県立ハイ高等学校は 地盤が弱く校舎の老朽化も進んだため、 とうとう廃校にする以外方法がなく なってしまった。 | ||
| + | |||
| + | ところで大変な情報を手に入れた。 それは、 | ||
| + | |||
| + | 「ハイ高校にATOMIC BOMBが仕掛けられている。」 | ||
| + | |||
| + | と、いうものだ。 どうやらハイ高が廃校になった時、 気が狂った理科の先生がATOMIC BOMBを 学校のどこかに仕掛けてしまったらしい。 | ||
| + | |||
| + | お願いだ。我が母校のコナゴナになった 姿を見たくはない。 早くATOMIC BOMBを取り除いてくれ……!! | ||
| + | |||
| + | 行動は英語で、“< | ||
| + | |||
| + | それでは Good Luck!!!………… | ||
| ===== 概要 ===== | ===== 概要 ===== | ||
| - | {{ : | + | おい、[[https:// |
| ……と、いうわけで、この、見るからに、[[ハイハイスクールアドベンチャー]]を移植せよ、と、いわんばかりのデバイスを見たら、正座して待機しつつ、移植する準備をするでしょう? | ……と、いうわけで、この、見るからに、[[ハイハイスクールアドベンチャー]]を移植せよ、と、いわんばかりのデバイスを見たら、正座して待機しつつ、移植する準備をするでしょう? | ||
| そして、ほぼ一日で移植しました。 | そして、ほぼ一日で移植しました。 | ||
| + | {{: | ||
| ===== 導入 ===== | ===== 導入 ===== | ||
| 行 43: | 行 58: | ||
| ハイハイスクールアドベンチャーを移植するにあたってはグラフィックス機能がキモとなる。 | ハイハイスクールアドベンチャーを移植するにあたってはグラフィックス機能がキモとなる。 | ||
| PicoCalcに組み込まれている液晶は ILI9488 で駆動されているので、LovyanGFXのパラメータだけ調整すれば制御可能である。 | PicoCalcに組み込まれている液晶は ILI9488 で駆動されているので、LovyanGFXのパラメータだけ調整すれば制御可能である。 | ||
| + | |||
| + | SPIのピンアサインと、向き、色の制御あたりができていれば問題なく動く。 | ||
| + | |||
| + | ^名前^番号^ | ||
| + | |SPI|1| | ||
| + | |PIN_SCLK|10| | ||
| + | |PIN_MOSI|11| | ||
| + | |PIN_MISO|12| | ||
| + | |PIN_CS|13| | ||
| + | |PIN_DC|14| | ||
| + | |PIN_RST|15| | ||
| + | |||
| + | なお、offset_rotationが 6で、invertを trueにする。 | ||
| + | どういう都合でかはわからないが、下端が上で、座標系は上下反転、色も反転するという状態がデフォルトになっているので、上記の設定で、左上が(0, | ||
| + | |||
| + | PicoCalcが届いた日に、LovyanGFXが動いて画面に表示ができたので、もう勝ったも同然と、移植作業を開始したのだったが、落とし穴が待っているとはこの時はまだ気づいてなかった。 | ||
| + | |||
| + | 落とし穴があったとはいえ、スムースに動かすことができたのは、LovyanGFXのおかげなので、ありがたいことに違いはない。 | ||
| + | |||
| + | {{:: | ||
| + | |||
| + | === 待っていた落とし穴 === | ||
| + | |||
| + | Arduinoフレームワークで、LovyanGFXが使えて、SDカードもSPIのピン設定を済ませれば使える上に、キーボードもPicoCalc用のFUZIXのコードからちょいと拝借すればすぐに動いてしまう。 | ||
| + | |||
| + | 実は、動くようになるまでに一日しかかからなかった。 | ||
| + | ほとんど M5Stack版と同じで済むからだ。 | ||
| + | テストプレイでゲームクリアまで行ったので、あとはコードを整理して、GitHubに置けばいいなと思っていたら、そうは問屋が卸さなかった。 | ||
| + | |||
| + | 電源を切って、入れなおすと、画面が真っ黒のまま動かないのだ。 | ||
| + | |||
| + | LovyanGFXのテスト用に書いた小さなアプリはそんなことはない。 | ||
| + | 何か触っちゃいけないところに触ってしまって、電源のOFF/ | ||
| + | |||
| + | 二日ほど調べたところで、どうもらちが明かないと、デバッグプローブを発注した。 | ||
| + | |||
| + | {{ :: | ||
| + | |||
| + | 三日目にはデバッグプローブで落ちる箇所は特定できた。 | ||
| + | |||
| + | LovyanGFX の中の Bus_SPI:: | ||
| + | 原因としては何が考えられるか? | ||
| + | |||
| + | 一番簡単なのは未定義なんだが、少なくともフラッシュ書き換え直後は動くし、テスト用のプログラムは何度でも動いたので、それはないだろうと真っ先に除外した。 | ||
| + | |||
| + | LM Studioに入れた Gemma3 12Bに聞いてみると、考えられる原因としてこんなものを挙げてきた。 | ||
| + | |||
| + | - SPI ピンの競合: | ||
| + | - SPI 周辺の初期化不足: | ||
| + | - メモリマップのアドレス誤り: | ||
| + | - SPI モードの設定ミス: | ||
| + | - LovyanGFX の設定ミス: | ||
| + | |||
| + | なるほど。 | ||
| + | そんなわけで、懸命に SPI 周りをきれいにする方法を模索して、あれこれやってみたが全く解決しない。 | ||
| + | ((AIのいうことを鵜吞みにするとは、お前はバカか?でも、らびやんさんとわたしとだったらわたしの仕業の方がずっとありそうじゃん!!)) | ||
| + | |||
| + | 結局最初に排除した「_spi_regsの未初期化」の可能性を考慮して、コードの修正を行うと、あっさり動いた。 | ||
| + | |||
| + | 結論としては、フラッシュ書き換え時に動くコードが、たまたま未初期化の _spi_regsが触る領域を作っていて、結果として、例外を出さずに動作していた。 | ||
| + | |||
| + | 電源OFF/ | ||
| + | |||
| + | <code cpp Bus_SPI.cpp.diff> | ||
| + | --- Bus_SPI.cpp.orig | ||
| + | +++ Bus_SPI.cpp 2025-04-04 16: | ||
| + | @@ -60,14 +60,14 @@ | ||
| + | | ||
| + | } | ||
| + | |||
| + | - uint32_t temp = _spi_regs-> | ||
| + | - _clkdiv_write |= temp; | ||
| + | - _clkdiv_read | ||
| + | - | ||
| + | // DCピンを出力に設定 | ||
| + | | ||
| + | | ||
| + | |||
| + | + uint32_t temp = _spi_regs-> | ||
| + | + _clkdiv_write |= temp; | ||
| + | + _clkdiv_read | ||
| + | + | ||
| + | int dma_ch = dma_claim_unused_channel(true); | ||
| + | | ||
| + | if (dma_ch >= 0) | ||
| + | </ | ||
| + | |||
| + | なお、この変更は、[[https:// | ||
| + | |||
| + | ハイハイスクールアドベンチャーも現状は developブランチを使用するようになっています。 | ||
| + | |||
| + | 素早く対応していただきらびやんさんには感謝しています。 | ||
| + | |||
| + | ==== PicoCalcについて ==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | Pico/Wは RP2040で264KB SRAM、Cortex-M0 dual core、Pico2/ | ||
| + | |||
| + | 更に RP2350はPSRAMが利用できる。 | ||
| + | PicoCalcは8MBのPSRAMを搭載しているので、これを活用するためにも 2ないしは 2Wを用意したい。 | ||
| + | |||
| + | 実際わたしは、2Wを用意して組み込んだ。 | ||
| + | |||
| + | 結果として、ハイハイスクールアドベンチャーは264KBのメモリでは動かないようなので、この選択は正解だったといえる。 | ||
| + | |||
| + | === バイナリの互換性について === | ||
| + | |||
| + | Clockwork Piが配布している PicoCalc用のファームウェアイメージは、Pico用である。 | ||
| + | つまり、Pico2用ではないのでそのまま焼いても動かない。 | ||
| + | |||
| + | Picoは、BOOTSELボタンを押しながら起動することで、内蔵フラッシュを切り離し、USBマスストレージとしてアクセス可能になる。 | ||
| + | この状態で、uf2形式のなどでファームウェアイメージをコピーするか、picotoolで書き込むことができる。 | ||
| + | |||
| + | 正しいイメージが書き込まれると制御が渡されてプログラムが動作を開始する仕組みだ。 | ||
| + | Pico2にPico用のイメージを焼いても動かない。 | ||
| + | |||
| + | なので、Pico2を入れた PicoCalcは、Pico2用にバイナリを作らないといけない。 | ||
| + | くみ上げて動作確認するにあたって、Pico用のイメージを書き込んで動かないって悩んでいたのは秘密なのだ。 | ||
| + | |||
| + | === 操作性について === | ||
| + | |||
| + | ひとたび動き出せば PicoCalcは操作しやすいデバイスだ。 | ||
| + | 4インチ320x320の液晶は、解像度こそ低いが大きく見やすい。 | ||
| + | 老害世代にはありがたい仕様だ。 | ||
| + | |||
| + | 問題はそこではない。 | ||
| + | Picoシリーズは、プログラムの書き換えにBOOTSELスイッチを押しながら起動する必要があるのだが、ケースに空いたスリットからでないとアクセスできないのでボタンが押しにくいのだ。 | ||
| + | |||
| + | また、電源ボタンはあるがリセットボタンはない。 | ||
| + | リセットは3.3V ENピンをGNDに落とせばいいので、用意できないわけではないのだから、なぜないのかは不明である。 | ||
| + | |||
| + | 開発作業を考えればあってしかるべきものだ。 | ||
| + | |||
| + | この点が改良されたモデルが出ることを期待している。 | ||
| + | |||
| + | |||
| + | ==== SDカード ==== | ||
| + | |||
| + | PicoCalcはSDカードスロットを内蔵していて、SPI接続している。 | ||
| + | 液晶とは別のバスを使っているのでコンフリクトはしていない。 | ||
| + | |||
| + | ^名前^値^ | ||
| + | |SPI|0| | ||
| + | |RX(MISO)|16| | ||
| + | |CS|17| | ||
| + | |SCK|18| | ||
| + | |TX(MOSI)|19| | ||
| + | |||
| + | 以下のコードで初期化することで、ArduinoのSDライブラリでSDHC/ | ||
| + | |||
| + | <code cpp> | ||
| + | SPI.setTX(19); | ||
| + | SPI.setSCK(18); | ||
| + | SPI.setRX(16); | ||
| + | SPI.setCS(17); | ||
| + | while (false == SD.begin(17, | ||
| + | { | ||
| + | // | ||
| + | delay(500); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== キーボード ==== | ||
| + | |||
| + | PicoCalcのキーボードはSMT32で制御されていて、PicoとはI2C接続している。 | ||
| + | キーボードへのアクセス方法については、FUZIX用のコードが参考になるだろう。 | ||
| + | |||
| + | Kernel/ | ||
| + | |||
| + | Pico側から見たとき、キーボードは I2C1に接続している。 | ||
| + | |||
| + | ^名前^値^ | ||
| + | |I2C|1| | ||
| + | |ADDRESS|0x1F| | ||
| + | |SCL|6| | ||
| + | |SDA|7| | ||
ハイハイスクールアドベンチャー_picocalc版.1743768361.txt.gz · 最終更新: by araki
