今回は、つい先日スイッチサイエンスから発売になったWaveshare RP2040-LCD-0.96を入手したので、これを使ってプログラミングしてみた!
見た感じはRaspberryPi Picoに小型の液晶が載った感じで、メーカーとしては「Pico-like」ということでPicoっぽいモノ(つまり互換品)となっている。
チップにRP2040が使われている事から、使う側からしたらPicoそのものな感じで、違いを見つける方が大変かもしれない…?
LCDが載ってる分、少しだけ重要があるが、誤差の範囲だ(^^)
いや、そんな違いはどーでも良くて(^^;;
使い方はRaspberryPi Picoと全く同じで、bootボタンを押しながらUSBを挿せばホストマシンにドライブとして見えてプログラムを送り込める。
ちなみにUSBポートはTYPE-Cだ。
Waveshare機にはリセットボタンがついており、これがとても便利!
RESET押す→BOOTを押す→RESETを離す、とすればプログラムを送り込む状態になる。いちいちUSBを引っこ抜いたり、USBの電源を操作したりしなくても済むので、私は毎回活用している!(^-^)
LCDに表示させてみたいんだ!
さて、普通に使う分にはRaspberryPi Picoと同じだけど、せっかく液晶が取り付けられているのだから、これを積極的に使っていきたい!
そうしないと単なるお荷物LCDだ(ToT)
この液晶パネル、Sitronnix社のST7735Sというらしい。
↑リンクの資料にST7735SのPDFへのリンクが貼られていた。
これを参考にしながらLCD制御プログラムを書いていくんだが…パワーオンシーケンスがまとまって書かれてなくて、とても苦労する!(TOT)
しかも初期化の順番なども分からず、こりはどーしたら良いのか…またしても枕を涙で塗らすのか…orz
何時間か格闘したのちに「サンプルがあったらいいのになぁ…」とふと思う。
あれ…そういえばサンプルあるはずだよね…無いなんてことある?
そう思って探してみたところ………
あああああぁぁぁ…(断末魔
↑上リンクのResourcesタブにDemo Codesというのがあった(T-T)
またしても気が付かなかったよ!!(ToT)
この中に含まれているLCD_0in96ほにゃららというファイルを見ていけば、LCDの制御方法が書かれている。ファイルはLCD以外のハードも扱おうとしているため少し大きいけれど、液晶部分だけを抜き出して自分用に書き直した。
そういえばArduino系のLCDはSPI0に繋がってる事が多い気がするけれど、RaspberryPi PicoではSPI1に接続されているケースが多いような気がする。SPIのポートなんて意識しないと気が付けないYo!(ToT)
元のサンプルがすでにハードウェアSPIを使うようになっていたが、もう少しだけ最適化して速度を出せるように改良。
イッパツでこの絵が出たときは本当に嬉しかった!(^-^)
速度的には160x80xRGB565=25KBを転送するのに3.8msと結構速い。理論的には秒間250回以上も書き換えが出来る!
スクロールさせてみる
無事に静止画は表示出来たので、次は大きなマップをスクロールさせてみる実験をしてみる。
実験の目的としては、常時フレームバッファを書き換えつつLCDへ転送を繰り返すのに、どのくらいの時間が掛かるのか…という、まぁ良くやる感じの事をしてみたいだけだ(^^;;
手元にXevi○usのマップデータがあったので、これを活用してみる。面倒だったので無圧縮で全データをFlashROMに入れておこうと思ったら、4MBもあって入らなかった…汗
仕方ないので、横160ドットの範囲のみ切り出してROMに載せる。
これだけでも640KBの容量があった!
Waveshare RP2040-LCD-0.96 で見慣れたマップをスクロールさせてみた!
— PocketGriffon (@GriffonPocket) 2022年3月17日
これでウェイト無しのフルスピード。秒間100回以上描き替えできてるよ!
マップ表示の縦横を間違えた感があるけどまぁ良いか(^_^; pic.twitter.com/4aQ38dUfzj
最適化も何もしていない状態だけど、かなり速く動く事が分かった。
フレームバッファ自体が小さい事(25KB)などもあるんだろうけど、毎回表示用のマップデータをFlashROMから引っ張ってきてるのに、この速度で動くんだ…と関心(^-^)
ポリゴンぐりぐり
前にSMART Response XEでポリゴンを動かそうと頑張った事があった。
このプログラムの元は、1992年に某アセンブラで書かれたもので、それを2003年頃にC言語で書き直していた。
これをSMART Response XEへ移植しようとしたのだが、CPUのアーキテクチャが違ってて簡単には移植できず諦めていた。
今回のPicoは32bit ARMだし、きっとうまくいくはず…と思い、頑張って移植してみた。
1992年当時のプログラミングレベルで書かれているので、とっても素直な3Dエンジンとなっている。久しぶりに見たらクォータニオンでなくて回転行列で書かれてた!(^^;; そんな時代か!!
PicoでOpenGLなどが使えたら超簡単なのに…と思いながらも頑張って移植w
とっても基本に忠実に書かれていたプログラムなので、移植もその流れで直線描画→三角形描画→多角形描画→3D2D変換みたいな感じで進めていった。
上の写真はポリゴンを描画出来るようになった時に撮影したものだが、速度が速すぎてシャッター速度がついていけてない??
こちらが3D→2D変換処理を入れる前の三角形描画処理。速すぎて何やってるのか分からないレベル(・_・;
— PocketGriffon (@GriffonPocket) 2022年3月18日
RaspberryPi Pico、私の中ですごく速いイメージができつつある…(^^; pic.twitter.com/RaHagsWZhX
クリッピングしつつ描画してこれだけの速度が出ると、いろいろと期待してしまう(^^;
Waveshare RP2040-LCD-0.96 でポリゴン描画してみた!
— PocketGriffon (@GriffonPocket) 2022年3月17日
最適化してないけど結構速い(^^)
こういうちまちまとした実験が楽しいなぁ!\(^o^)/ pic.twitter.com/1aHXHxEq5R
最終的に出来上がったのがコレ。
めちゃ速い三角形描画処理からみたら、だいぶ遅くなってる…。3D演算を最適化していないので、多分処理が重いんだと思われる(T-T)
最適化してみようとソースを見たら、当時の苦労が忍ばれて涙が頬をつたっちゃいそうだったので、今回は辞めておいた(^^;;
夢が広がるけど…
そういえばDMAを使った最適化をまだやってなかったな…と思い、フレームバッファの消去をDMA化してみたところ、速度が2倍になった!
こんな感じに、Picoでの最適化はまだまだ道が残されていそう。
究極を言えばCPUコアが1つ空いたままになってる(^^;;
液晶がついたPicoということで、本来の用途はべつのところにあるんだろうけれども、これはこれで本当に面白いマシンだと思う(^^)
使ってみた感じ、Picoとの違いは分からなかった。世にたくさんあるPico用プログラムがそのまま動かせる魅力も大きい!
個人的な欲を言えば、LCDのドット数が160x100あればPC-8001が動かせたのになぁ…とは思う。もっともPicoのパワーだったらラクに実機同等の速度で動いちゃいそうだけど(^^)
ではまた次回!(^-^)ノ