2022年5月29日日曜日

Rust初心者が、Rust+RPi PicoでST7789使用TFT LCD(Waveshare Pico LCD 1.3)を使う話



 いつの間にかひよっこ社会人になっていた中の人です。研究室とは勝手が違う中、ひたすら研修を進めています。
 さて今回は以前紹介したRust+RPi Picoのお話の続き?で、Waveshare社製Pico LCD 1.3をRust環境で使う話になります。



0.開発環境とアップデート


 以前の記事では、WSL上でクロスコンパイルをし、PowerShell環境でelf2uf2を使って最終的なバイナリを作っていたと思います。
 その後、elf2uf2-rsが登場し、.cargo/config.tomlで設定すれば、cargo runだけで.uf2への変換からボードへのアップロードも自動で行えるようになりました。らくちん。さらに、記事を書いた後環境を丸ごと吹き飛ばした関係もあり、今回はすべてPowerShell上に環境を構築しました。
 また以前の記事以降にrp2040-halのアップデート等があり、関数の書き方などが変わっています(rp-rs/sample-projectrp-rs/rp2040-project-templateの方が推奨に切り替わった)。

1.ピンアサインの確認


ピンアサイン

 今回使用するボードも以前と同じくRPi Picoを使います。そしてLCDとして、Waveshare社から発売されているPico LCD 1.3を使います。今回はSwitchScienceで購入しました。
 このLCDを制御しているST7789はSPIで通信するので、PicoのSPI1を使います。注意事項があるとすれば、本来のSPI1であればGP8/GP12のいずれかをデータ転送(Controller In Peripheral Out/Master In Slave Out)で使います。しかしST7789の場合、GP8をデータ/コマンド選択ピン、GP12はローアクティブのリセットピンとして使うので注意が必要です。同様にGP13はバックライトの制御で使うので注意してください。GP8/GP12/GP13はGPIOピンとして使います。


2.画面描画


 今回はFloyd-FishさんのSTM32向けCライブラリを参考に、レジスタの初期設定と各ピクセルの描画を行いました。データシートをよく見ずに書き始めたので、自分が分かっていないレジスタと設定値が存在しています(後から見返したらデータシートに載っていた件)。なので、ここではレジスタの設定値の話はパスします。
 全体のコードはrp-rsさんのLチカのテンプレートをベースに手を入れました。一番悩んだのがSPIやGPIOをラップした関数を作ることで、いまだにわかっていない部分がいろいろあります。が、とりあえず動いたのでここではヨシッ。関門だった初期化関数も一応かけました(この書き方が組み込みRustのお作法にかなっているのかがよくわからん)。

3.まとめ



 今回はRust+RPi PicoでTFT LCDを使う話でした。いろいろな方のコードを切ったりはったり参考に作りました。特にrp2040-halの開発元が公開しているサンプルコードは役立ちました。ちゃんとRustを触るのは初めてで困ることも多かったですが、最低限の機能を実装し、どうにかこうにか動くところまで行けました。まだ使っていないマイコンの機能もあるので、仕事が忙しくなる前にもう少し遊んでみようかと思います(UARTのポーリングし続けないと切られる問題や、GP8の切り替えがdelayを挟まないとデータ転送のタイミングとずれてくる問題)。

4.参考


開発環境周りで参考にした@ochaochaocha3さんのQiita:https://qiita.com/ochaochaocha3/items/1969d76debd6d3b42269








©2022 shts All Right Reserved.