前回紹介したAliexpressで売られている小さい液晶の使い方、Raspberry Pi Pico編です。
改めてどんな液晶か見てみます。
左が2.0インチ、右が1.54インチです。
↑2.0インチ。解像度は240x320ピクセル。袋に書いてある型番はMSP2008です。
↑1.54インチ。解像度は240x240ピクセル。袋に書いてある型番はMSP1541です。
液晶の種類はIPS液晶です。いずれもST7789というコントローラを搭載、通信方式はSPIです。
Amazonでも似たようなのが1400円くらいで売られてますが、Aliexpressだと600円ほど(2インチの場合)なので激安です。
本記事の対象の液晶モジュールの条件
- ピンが8本出ているもの(GND、VCC、SCL、SDA、RES、DC、CS、BLK)
- コントローラーがST7789である
- SPI通信で制御する
Raspberry Pi Picoで使う
Raspberry Pi Pico(以下、Pico)はマイコンなのでRaspberry PiというよりArduinoに近いのですが、GPIOが3.3VのためArduinoよりもこのディスプレイと相性がいいです。
またフラッシュメモリ内にストレージを持っており、容量の小さいものなら画像を単体で表示することができます。おすすめの組み合わせです。
※他のマイコンでやる場合の記事もあります→Raspberry Pi編 / Arduino編 / Raspberry Pi Pico編(この記事)
また、Picoはファームの入れ替えでMicroPythonとCircuitPythonのどちらも使用することができます。
ここでは標準的と思われるMicroPythonを使います。CircuitPythonを使いたい場合は、Raspberry Pi編で紹介したAdafruitのCircuitPythonライブラリがそのまま使えると思います。
ライブラリ入りのファームに入れ替える
MicroPython環境の場合は、このライブラリが使えそうです。
GitHub - russhughes/st7789_mpy: Fast MicroPython driver for ST7789 display module written in C
ライブラリ入りのファームウェアがここにあるので、Pico無印の場合は「RP2」、WIFI付きのPico Wの場合は「RP2W」ディレクトリにある「firmware.uf2」をダウンロードします。(ファイル名をクリックした先の画面で右上にダウンロードボタンがあります。)
そのあとPicoの基板上にあるBOOTSELボタンを押しながら、PCにUSB接続します。
そうするとPicoが外部ストレージとして開くので、先ほどダウンロードしたfirmware.uf2をドラッグ&ドロップします。
ファイルのコピーが終わると、Picoが自動で再起動するはずです。
配線する
液晶モジュールにはこんな感じでピンが8本あるので、それぞれしかるべきGPIOピンにつないでいきます。
PicoはRaspberry Piと比べて基板にピン名が書いてあるので楽ですね…!
ピン名 | 液晶側ピン | 用途 | |
---|---|---|---|
3V3 | - | VIN,VCC | 電源 |
GP11 | - | SDA,SDA | SPI信号用 |
GP10 | - | SCL,SCK,SCLK | SPIクロック |
GND | - | GND | GND |
GP9 | - | CS | 通信先選択 |
GP12 | - | RES,RST | リセット |
GP8 | - | DC | データ/コマンド切替 |
GP13 | - | BLK | バックライト |
液晶側ピンは製品によって表記ゆれがありそうなので、よくあるのを全部書いておきました。
下から4つは任意のGPIOピンに変更しても大丈夫です。(あとでプログラムのほうも変更する必要があります)
バックライトは制御しないのであれば省略可能です。(省略時点灯)
こんなかんじっすねー
ちなみにPicoのピン名表示は端っこの方が詰まってて対応関係を間違えやすいので注意してください。
他にもGNDピンはあるので、もっとわかりやすいところを使った方がいいかもしれん。
Thonnyで設定ファイルをアップロードする
Picoのプログラミングによく使われているエディタにThonnyとMu Editorがありますが、今回はThonnyを使います。(後述しますがMu Editorではうまくいきませんでした。)
まず設定ファイルのPythonスクリプトをPicoにアップロードします。
スクリプトは
①Thonny上に新規スクリプトを作成、中身をコピペして「ファイル>名前を付けて保存>Raspberry Pi Pico」で直接Picoのフラッシュメモリに保存
②いったんローカルでテキストファイルを作成して、Thonnyのファイルマネージャでアップロード
どちらの方法でもOKです。
これをtft_config.pyの名前で保存してください。
from machine import Pin, SPI import st7789 TFA = 0 # top free area when scrolling BFA = 0 # bottom free area when scrolling def config(rotation=0, buffer_size=0, options=0): return st7789.ST7789( SPI(1, baudrate=62500000, sck=Pin(10), mosi=Pin(11)), 240, 320, reset=Pin(12, Pin.OUT), cs=Pin(9, Pin.OUT), dc=Pin(8, Pin.OUT), backlight=Pin(13, Pin.OUT), options=options, buffer_size=buffer_size)
ここからDLしたものから、rotation(画面回転)の設定を削ったものです。
ちなみに2インチの液晶用に設定しています。他のサイズの場合は240と320の部分を液晶の解像度に合わせてください。
ファイルのアップロード方法
ここで、ちょっと脇道ですが、Thonnyを使ったPicoのフラッシュメモリへのファイルのアップロード方法を説明しておきます。(検索したけどあんまり書いてなかったので)
まずThonnyのメニューから「表示>ファイル」を選択するとファイルマネージャが出てくるので
こんな感じで、アップロードしたいファイルを選んで右クリック、「/にアップロード」を押します。そうすると下のRaspberry Pi Picoのストレージにもファイルが追加されます。
スクリプトに限らず、バイナリなど何でもアップロードできます。容量が少ないので小さいファイルしか無理ですが。
アップロードできない場合、スクリプトの動作中の可能性があるので、STOPボタンを押してみましょう。
サンプルスクリプトを動かす
いよいよサンプルスクリプトを動かしてみます。
Thonny上に新規スクリプトを作りst7789_mpy/examples/tiny_hello.py at master · russhughes/st7789_mpy · GitHubをコピペ、実行ボタンを押します。
ド派手なサンプルが表示されました!(実際には目まぐるしくアニメーションします)
今回はThonny上で実行しましたが、これをmain.pyという名前でPico上に保存すると、起動時に自動実行させることもできます。(PCにつながずバッテリで動かせます)
JPGを表示する
せっかくなので画像も表示してみたいと思います。
テスト用画像を置いておきます。右クリックで名前を付けて保存してください。
240*240の場合はこちらをどうぞ。
その後、画像をPico上にアップロードする必要があるので、上の「ファイルのアップロード方法」を参考にアップロードしてください。
画像を表示するためのスクリプトはこんな感じです。
import st7789 import tft_config tft = tft_config.config(1) def main(): tft.init() tft.jpg('240x320.jpg', 0, 0, st7789.SLOW) main()
簡単ですね!これをThonnyから実行するか、main.pyとしてアップロードして再起動させてください。
エイが笑ってる!かわいい~
補足情報
実は設定ファイルをいちいちアップロードしなくても、こんな感じにすれば1本のスクリプトで動きます。
import st7789 import tft_config from machine import Pin, SPI tft = st7789.ST7789( SPI(1, baudrate=62500000, sck=Pin(10), mosi=Pin(11)), 240, 320, reset=Pin(12, Pin.OUT), cs=Pin(9, Pin.OUT), dc=Pin(8, Pin.OUT), backlight=Pin(13, Pin.OUT) ) def main(): tft.init() tft.jpg('240x320.jpg', 0, 0, st7789.SLOW) main()
あと、トラブルシューティングをいくつか書いておきます。
・ファイルのアップロードができない……スクリプトを実行中じゃないですか?STOPボタンを押してみましょう
・OSError: [Errno 2] ENOENT が出る……ファイルがないときのエラーです。ファイルがアップロードされているか、名前が間違っていないかを確認しましょう
・RuntimeError: jpg prepare failed. が出る……画像ファイルが壊れてませんか?ローカルで表示できるか確認、確認できたら再度アップロードしてみましょう。あと間違ってPNGとかGIFとかを指定してないかも確認。
ちなみにMu Editorでもスクリプトの実行自体はできると思います。ただMu Editorのファイルマネージャではバイナリファイル(JPG)のアップロードがうまくいきませんでした。うちの環境だけかもしれないけど。
2画面にする
さて、恒例の2つ一緒につなげるパターンですが、結論からいうとうまく動きませんでした。(4/30更新)普通にできました。コード間違ってました恥ずかしー。
ピン名 | 液晶側ピン | 用途 | |
---|---|---|---|
3V3 | - | VIN,VCC | 電源 |
GP11 | - | SDA,SDA | SPI信号用 |
GP10 | - | SCL,SCK,SCLK | SPIクロック |
GND | - | GND | GND |
GP9 | - | CS | 通信先選択 |
GP12 | - | RES,RST | リセット |
GP8 | - | DC | データ/コマンド切替 |
GP13 | - | BLK | バックライト |
GP19 | - | CS | 通信先選択 |
GP20 | - | RES,RST | リセット |
GP21 | - | DC | データ/コマンド切替 |
GP22 | - | BLK | バックライト |
import st7789 import tft_config from machine import Pin, SPI spi = SPI(1, baudrate=62500000, sck=Pin(10), mosi=Pin(11)) tft1 = st7789.ST7789( spi, 240, 320, reset=Pin(12, Pin.OUT), cs=Pin(9, Pin.OUT), dc=Pin(8, Pin.OUT), backlight=Pin(13, Pin.OUT) ) tft2 = st7789.ST7789( spi, 240, 240, reset=Pin(20, Pin.OUT), cs=Pin(19, Pin.OUT), dc=Pin(21, Pin.OUT), backlight=Pin(22, Pin.OUT) ) def main(): tft1.init() tft1.jpg('240x320.jpg', 0, 0, st7789.SLOW) tft2.init() tft2.jpg('240x240.jpg', 0, 0, st7789.SLOW) main()
設定ファイルを2つにするとややこしいのでコード内に直書きしました。
こちらは液晶1に2インチ(240*320)、2に1.54インチ(240*240)を接続した例です。お手持ちの液晶に合わせて解像度等変更してください。
以上です。
安くて小さい液晶で楽しいディスプレイライフをお過ごしください。
商品リンク
高いですがAmazonにも1.54インチの方がありました。
今回直接参考にしたわけではないのですが、以前献本でいただいたPicoの本が良かったので紹介します。
とにかくいろんな部品をつないで動かすサンプルが鬼のように載っており、実践的。これからPicoでいろいろやってみたいという方には最適です。