マイコンあそび。

2000円未満で買える!格安中華オシロDSO138miniが結構遊べた件(5)〜ゲーム作成編〜

2020年1月13日  2020年1月13日 
このシリーズの過去の記事一覧
(1)(2)(3)(4)
JYETech DSO138mini という格安(aliexpressでは2000円未満で買える)の中華オシロ工作キットがある。



とりあえずハンダ付けの練習としてはもってこいのキットですし、完成したあともオシロとして波形確認くらいには使える…使えるのですが……精度についてはお察しのとおり(笑)

し・か・し!

じつはこれ、 STM32F103320x240の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 は以下のとおり。
[env:genericSTM32F103C8]
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の接続ピン関係は以下のとおり。

信号名CPU(STM32F103)
CSPC13
RSPC14
WRPC15
RDPB8
DB10-17PB0-7
RESETPB9
実に13本の信号を潤沢に使っているのであるw

先にも触れたとおりLCDを制御するコマンドは、ILI9341と同じコマンド形態です。
ILI9341のようなイマドキ?のLCDコントローラだと、コードレジスタみたいなのを読むと「0x9341」とか出てきて型番チェックできるのですが、このLCDコントローラ(ST7787)に、そんな殊勝な機能は無い

ですから汎用性、移植性は考えずに、つらつらとコードを書いちゃいましょう。どうせそんなに大それたことはやっていませんので(!?)

とりあえずILI9341系のLCDコントローラは以下のコマンドだけ覚えておけば、なんとかなります。

コマンド機能
11Hソフトリセット
21Hインバーター設定
3AHカラーbit設定
36HLCD方向設定
29HLCD ON
2AH描画エリア設定(X)
2BH描画エリア設定(Y)
2CHカラーデータ書込み
11H〜29Hが初期設定で、2A〜2CHが描画処理コマンドですね。

ガンマ値?何それ?おいしいの?といった感じですが…(^_^;
n個の単語だけで成り立つ英会話的ですね。

より具体的な設定の仕方については、データシートを参照されたし。

…というわけで、2A〜2CHコマンドを使って、LCDのVRAMエリアにガシガシとRGB565データを書き込んでいくワケなのですが、どうしても2CHコマンドを発行したときにLCDが消えてしまったり。
…ああ、これもうアカン と諦めかけて回路図を見直したら、

!!!

はっはっは… 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の出力とボタン入力さえなんとかなれば、なんとかなりますので…。

え?サウンド?…なにそれ?(ぁ
ー記事をシェアするー
B!
タグ

コメント

Translate

テキスト大文字のデフォルトサイズ変更

人気の投稿