2000円未満で買える!格安中華オシロDSO138miniが結構遊べた件(5)〜ゲーム作成編〜
とりあえずハンダ付けの練習としてはもってこいのキットですし、完成したあともオシロとして波形確認くらいには使える…使えるのですが……精度についてはお察しのとおり(笑)
し・か・し!
じつはこれ、 STM32F103 と 320x240のTFT LCD を積んだマイコンボードという別の顔を持っていましてですね(むしろこれが本来の姿だったりしてw)。ちゃんとbootloaderを突っ込めば Arduino として動くのです(^^;
DSO138miniをArduino化する記事についてはこちら
Arduinoでプログラミングできるのなら、LCDやボタンもくっついているワケですし、まずはサクっとゲームでも作ってみようか!ということになりますよね!?
さっそくチャレンジしてみちゃいましょう!
まずはソース!
御託はいいから、ソース出せ! …というわけでhttps://github.com/phillowcompiler/DSO138mini_Sketches
↑ここです↑ インベーダーゲームをアップしています。
そして、今後 DSO138miniでゲームを作ろう! という物好きな人のために、少しだけ解説したいと思います。需要あんの?…などと聞いてはいけない。
DSO138miniをPlatformIOで開発する
Arduino-IDEで開発できないことも無いのですが、アホの子のようにビルドが遅いので却下却下です!令和時代ですから、PlatformIO を使いましょう(関連性は不明)
STM32F103 を PlatformIO で開発したり、USBでスケッチを書き込む手順についてはこちらの記事を参照してください。
そしてDSO138mini をArduinoで開発してゆくための platform.ini は以下のとおり。
platform = ststm32
board = genericSTM32F103C8
framework = arduino
board_build.core = maple
upload_protocol = dfu
そして、まずは適当にLEDでもチカらせてやってください。
詳細については前の記事を参照されたし。
※DSO138miniは、PA15がLEDです。でも、PA15はデバッグモードを解除しないと、GPIOとして扱えない ので、setup()内あたりで、 afio_cfg_debug_ports(AFIO_DEBUG_NONE); にしておく必要がある。
※あとは…loop内にLチカ制御のソースくらい自力で書きましょうw
※(未確認)Linuxの場合はスケッチ書込みでコケるかもしれません…。うまくリセットかけられれば…なんとかなるかも…(無責任)
LCDパネルをコントロールする
前の記事でも少し書いたとおり、このボードは S95417 という素性のわからないLCDを積んでいます。怪しげな中華LCDについては右に出る者はいない。と言われている[要出典・誰によって?]ねむいさんのブログによるとLCDコントローラは ST7787 とのこと。これまた情報が少ないワケですが、データシートを拾って読む限りでは基本的にはILI9341と同じようなコマンド体系で動くようだ。
そして、パラレル接続になっている(イマドキ珍しい…)
しかし、先人達の苦労がgithubには蓄積されていましてですね。ちゃんと参考になるソースがあったりするんですね…
Adafruit_TFTLCD_8bit_STM32
↑のソースを参考にLCDを叩いていくことにする。パラレル接続LCDの場合は、8bitのデータ信号とラッチ信号(WR信号、あるいはRD信号)が同期されるという点に留意すれば、やっていることはそれほど難しいことではない。
なお、マイコンとLCDの接続ピン関係は以下のとおり。
先にも触れたとおりLCDを制御するコマンドは、ILI9341と同じコマンド形態です。
ILI9341のようなイマドキ?のLCDコントローラだと、コードレジスタみたいなのを読むと「0x9341」とか出てきて型番チェックできるのですが、このLCDコントローラ(ST7787)に、そんな殊勝な機能は無いw
ですから汎用性、移植性は考えずに、つらつらとコードを書いちゃいましょう。どうせそんなに大それたことはやっていませんので(!?)
とりあえずILI9341系のLCDコントローラは以下のコマンドだけ覚えておけば、なんとかなります。
ガンマ値?何それ?おいしいの?といった感じですが…(^_^;
n個の単語だけで成り立つ英会話的ですね。
…というわけで、2A〜2CHコマンドを使って、LCDのVRAMエリアにガシガシとRGB565データを書き込んでいくワケなのですが、どうしても2CHコマンドを発行したときにLCDが消えてしまったり。
…ああ、これもうアカン と諦めかけて回路図を見直したら、肝心のLCDはMemoryWriteで死んでしまうorz。コピー対策のカスタマイズ品かしら… pic.twitter.com/GP3dA1md0Z— 疲労こんぱいら (@phillowcompiler) October 15, 2019
!!! |
はっはっは… JP2ジャンパーのハンダを付けたまま でした…orz
当然、「2CHコマンド」を発行しても、BIT2がGNDに落とされるので、「28H(LCD OFF)」が発行されてしまうというわけですね…
解決してしまえば、なんてことはない。こういう所でつまづいてしまうものなのです;;;;
こんなわけでLCDにビットマップを表示させられるようになれば、あとはもう大丈夫。
ラインストライプ処理について
ここは知っている人には、つまらない余談です。ゲームを作るときには、ストライプ処理というのがセオリーとして出てきます。
画面にたくさんのキャラクターを描くときに、一個一個LCDに出力していったのでは大変トロかったり、背景がうまく透過されなかったりしてしまうことを防ぐための処理ですね。
詳しくはぐぐればザクザクと出てくるのですが、ザックリ言うと、まずメモリ(SRAM)上にガシガシと絵を描いて重ね合わせて、全てのキャラクターを描き終わったあとにメモリからLCDにガツンと一発で出力する処理のことです(余計わからんw)
もちろんこういった処理にはメモリ容量が必要になる。積んでいるLCD解像度が320x240の16bitカラー(2バイト)なので、単純計算して320 x 240 x 2 = 153,600バイトのメモリが必要なわけだ。
しかし、STM32F103C8は20KBのメモリしかない。
ぜんっぜん足りませんね。。。
そこで、1行ずつのデータを次々と(240行ぶん)LCDに出力して重ね合わせてゆく…。といった処理で対応しています。1行だけなら320 x 2 = 640バイトのメモリで済みますからね。
ボタン
DSO138mini にはよく目立つボタンが4つある。回路図。
PB4〜7と連動する。つまり、LCDと共用なんですね〜。ですから、LCD出力中はボタン状態をセンス(ポート入力モード)することができないということを覚えておきましょう。
最後に
…あとは、ソースを見ながら適当にwゲームというのはLCDの出力とボタン入力さえなんとかなれば、なんとかなりますので…。
え?サウンド?…なにそれ?(ぁ
コメント
コメントを投稿