【解決事例】AliExpressで購入したst7789ディスプレイの不具合を見抜いた!故障品と正常品の検証レポート

st7789ディスプレイ

今回、AliExpressで500円弱のディスプレイを2種類購入しました。

  • 1つはCSピンがなく、解像度240×240のディスプレイ(故障品)

  • もう1つはバックライトピンがなく、解像度240×320のディスプレイ(動作品)

Raspberry Pi Pico(互換品)とst7789_mpyライブラリを使用して画面を表示させることに挑戦しました。ファームウェアは、st7789_mpyで提供されているRaspberry pi pico用のものを利用しました。
今回、故障品ディスプレイで長い試行錯誤を繰り返しました。しかし、ある時、画面がわずかに点滅しているのを発見。また、汚れだと思っていた部分が実は故障により現れるドットであることに気づきました。動作品ディスプレイでは問題なく表示できたため、原因はディスプレイ自体の故障であると結論付けることができました。

トラブルシューティングの経緯

  1. 初期設定と配線の確認

    Raspberry Pi Picoの互換品とst7789_mpyライブラリを用いて、SPIの各ピン(SCK, SDA, RES, DC)の設定を徹底的に見直しました。故障品ディスプレイはCSピンがないため、CSの設定項目はコメントアウトして検証。

  2. 長時間の試行錯誤

    故障品ディスプレイは、全く動作しなかったので、何度もコードや接続を確認しました。しかし、ふとした瞬間に画面が若干点滅していることに気づき、ディスプレイ故障の可能性に気づきました。また、よく見ると汚れと思われていた部分が実際は故障によるドットであったため、ディスプレイ自体に問題があると判断。
    ※緑の枠で囲っているところにドットノイズ(汚れではありません)
    st7789故障ディスプレイ

  3. 動作品ディスプレイでの確認

    動作品のディスプレイは、バックライトピンの代わりにCSピンがあるので、バックライトピンとCSピンの設定を入れ替えとディスプレイサイズも240×240から240×320に書き換え、他は同じ設定・コードで、動作品ディスプレイを試したところ、正常に動作しました。これにより、ソフトウェア側の設定や配線に問題はなく、最初のディスプレイが故障していたと確信できました。

ファームウェア書き込みと開発環境

  • ファームウェアの書き込み
    st7789_mpyを利用するため、提供されているfirmware.uf2をThonnyを使ってRaspberry Pi Picoに書き込みました。

  • 開発環境
    Thonnyを使用してMicroPythonのコードを書き込み、ディスプレイの動作確認を行いました。

最終的なコード例

st7789_mpyのサンプルコードをベースに以下のようなコードで動作確認を行いました。

tft_config.py

from machine import Pin, SPI
import st7789

TFA = 40  # top free area when scrolling
BFA = 40  # bottom free area when scrolling

def config(rotation=0, buffer_size=0, options=0):
    return st7789.ST7789(
        SPI(0, baudrate=62500000, sck=Pin(18), mosi=Pin(19)),
        240,
        320,
        reset=Pin(21, Pin.OUT),
        cs=Pin(17, Pin.OUT),
        dc=Pin(16, Pin.OUT),
        # backlight=Pin(20, Pin.OUT),
        rotation=rotation,
        options=options,
        buffer_size=buffer_size)

main.py

import random
import utime
import st7789
import tft_config
import vga2_bold_16x32 as font

print('config')
tft = tft_config.config(0, 0, 0)

def center(text):
    length = 1 if isinstance(text, int) else len(text)
    tft.text(
        font,
        text,
        tft.width() // 2 - length // 2 * font.WIDTH,
        tft.height() // 2 - font.HEIGHT // 2,
        st7789.WHITE,
        st7789.RED)

def main():
    tft.init()
    tft.fill(st7789.WHITE)
    utime.sleep(2)
    tft.fill(st7789.RED)
    utime.sleep(2)
    center(b'\xAEHello\xAF')
    utime.sleep(2)
    tft.fill(st7789.BLACK)

    while True:
        for rotation in range(4):
            tft.rotation(rotation)
            tft.fill(0)
            col_max = tft.width() - font.WIDTH*6
            row_max = tft.height() - font.HEIGHT

            for _ in range(128):
                tft.text(
                    font,
                    b'Hello!',
                    random.randint(0, col_max),
                    random.randint(0, row_max),
                    st7789.color565(
                        random.getrandbits(8),
                        random.getrandbits(8),
                        random.getrandbits(8)),
                    st7789.color565(
                        random.getrandbits(8),
                        random.getrandbits(8),
                        random.getrandbits(8)))

このコードは、st7789_mpyのサンプルコードを元に、ディスプレイの初期化、画面の塗りつぶし、中央にテキストを表示する動作を実現しています。

  • Paspberry PI picoもどきでst7789ディスプレイ表示

st7789ディスプレイ

  • RP2040-zeroもどきでもst7789ディスプレイ表示
    RP2040-zeroもどきでst7789ディスプレイ表示

おわりに

今回の検証で、故障品ディスプレイの原因がディスプレイ自体の不具合であることが判明しました。AliExpressで安価に購入できるディスプレイですが、品質には個体差があるため、同様のプロジェクトで問題が発生した場合は、ハードウェアの故障も疑うと良いでしょう。
動作品ディスプレイで正常に動作することを確認できたので、今後も安心してプロジェクトを進められます。
皆さんの開発の参考になれば幸いです。何か質問やご意見がありましたら、ぜひコメントしてください。

2025-04-20DIY&修理

Posted by 納戸 工房