以前、RaspberryPi Picoに320x240ドットの液晶を取り付けてさんざん遊びまくった!
今回はソレを超えるサイズの液晶をRaspberryPi Picoに取り付けてみた。
サイズ的には480x320ドットと、前回よりも一回り大きい。
多分、Pico専用として売られているものでは最大サイズなんじゃない??
2つを比べてみると、↑こんな感じ!
ひっくり返すとこんな感じにPicoがついてる。
Picoの大きさから、なんとなくなサイズ感が分かるだろうか(^^;
Picoに取り付けてると言うよりは、もはやPicoがついてる感じ。
前回はあお氏(@hd61yukimizake)と一緒にドライバの解析改良に勤しんで、最終的にはかなりの速度が出るようになっていた。しかし毎回巻き込むわけにはいかないので、今回はひとりで踏ん張ってみる!(^^;;
表示、SDカード、タッチパネル
Waveshare社から用意されているサンプルは、CMakeを基本とした開発環境用のモノとなっている。これをArduinoIDE環境で使えるように変更していかないといけない。
今回はきちんとサンプルコードを探したので、比較的簡単に画像を表示させる事が出来た!
表示させるだけだったらそこまで難しくない。
プログラムの移植を始めて、30分後には絵が出た感じだ!
だけど……恐ろしく表示が遅い(T-T)
画像データは(まだこの段階でSDカードが使えないので)Flashメモリに入れてある。アクセス速度はそこまで遅いはずがないんだけど、サンプルコードを実行すると表示し終わるまでに約1秒掛かる。
画像をメモリに置いてあるのに1秒って…orz
さすがにこのままではちょっとアレなので高速化する事に(^^)
転送するビット幅を8bit→16bitに変更、2バイトずつ転送していたのをまとめて転送するように変更、そしてSPIの周波数を60MHzまで上げてみた。
この変更で、全画面表示に掛かる時間が0.1秒(100ms)ほどとなった。
さらなる高速化をするためにはDMAを利用するなどの工夫が必要かも?
全画面描き替え速くなったよ!
— PocketGriffon (@GriffonPocket) 2022年3月18日
958ms → 90msと10倍以上速くなったので、これなら何か作れるかな(^-^)#RaspberryPi #Pico pic.twitter.com/GgfhDG2Qng
前回使っていた液晶(320x240ドット)と、今回の液晶(480x320ドット)で、実はピンの配置が全く同じだと気がついた。ということは、SDカードとタッチパネルのプログラムがそのまま使えるのでは???
そう思って移植したのだが、どうやらSPIの競合?が起こるらしくて、動作コアを別にした瞬間に問題出まくりとなった(T-T) うーん、回避するコードを入れてみるが、もう少し素直な(ちゃんとした)方法がある気がしてならない。
それでもSDとLCDで同時アクセスしないようにしたらすこぶる安定した!
そしてタッチパネルについてはキャリブレーションしないといけないのか、まーったく安定しない…。全体的に不安定になってしまうため、今回は使用を諦めた(T-T)
何かを動かしてみたいけれども…
一通りの機能を確認出来たので、せっかくだから何か作ってみたい!
いろいろと検討してみたけれど…画面サイズの480x320というのが意外に難しい!(@_@;
例えばPC-8801やPC-9801を動かしてみたいと思えば、横640ドットのサイズを480ドットに縮める必要がある。それって横4ドットを3ドッドに縮めないといけない。
さらに縦については5ドットを4ドットに縮めないといけない。
これは……どう考えても簡単じゃないのでは??(T-T)
他にもPC-6001とかMSXとかレトロマシンを検討してみても、やっぱり画面サイズがしっくり来ない。大きな画面も良し悪しだと思い知らされた(ToT)
CP/M-80を動かしてみた!
もはやワンパターンすぎて飽きてきてる思うけれども…今回もCP/M80を動かしてみた!
せっかくの大きな液晶なので、PC-9801フォントを使ってお気に入り画面にしたい。
ただ…98のANKフォントは8x16ドットサイズと素直に表示すれば60x20キャラクタとなり、480x320ドット液晶とは相性がよろしくない。
まず画面に25行を表示させるためには、縦12ドットのフォントを用意する必要がある。キレイに表示させるために、小文字のgやyなどを少し修正した。これで縦方向はキレイに12ドットに収まった!
横方向については横6ドットの80桁表示と、8ドットの60桁表示をサポートした。
こんな感じでどうだろうか?(^-^)
CP/Mということで、キー入力は絶対にやってみたいと思い検討してたのだが…PicoのUSBホスト機能を使おうとすると、標準のUSB端子以外から電源を入れないといけないらしい。
……どうやって?(^-^;;;
GPIOのピンから電源入れるとかするらしいんだけど、よくわからん(T-T)
そんな事を検討している流れから、そういえばArduinoIDEのシリアルモニタから文字を入力出来る事を思い出した!
これでリアルタイムではないにしてもキーが入力出来れば…目的は果たせそうだ。
Serial.read()という関数を使えば文字取得が出来る。
これを利用してCP/Mへ文字を入れる事が出来るようになった!
ちなみにここに漢字を入力してみると、プログラム側にutf-8コードが渡る。
何かに楽しいことに使えないかなぁ…とワクワクしちゃう!(^-^)
おわりに
もはや……何度めのCP/M80移植??(^-^;;
何度も移植はしているけれども、移植するたびに対象マシンの制限などを考えて実装していくのが楽しい。メモリ、画像、ストレージその他考えないといけないことはたくさんある(^^)
私的には大好きなスタートレックが動くマシンが増えていくのが楽しくて仕方ない(^-^)
RaspberryPi Picoと大型液晶で遊ぶCP/M80エミュレータ。
— PocketGriffon (@GriffonPocket) 2022年3月19日
キー入力はシリアルモニタから打ち込んでます。BASICを起動したりゲームを動かしたり。途中でフォントサイズを切り替えてます。
安定して動くようになってきた!(^_^)#RaspberryPi pic.twitter.com/HS2hKrLRgs
液晶は単純に大きければいいってワケじゃないんだな…と思いしった!
メモリ、速度、そもそものドット数とやはりバランスは大事だ。
また何か良さげな活用方法が見つかったら試したいと思う。
ではまた次回!(^-^)ノ