Raspberry Pi Pico W ディスプレイ表示!

初めに

どうも!みなさんこんにちは!
香月です!

今回は、「ラズパイ pico」を使ってディスプレイ
に文字を表示させていこうと思います!

この記事を読めば「Raspberry Pi Pico W」でディスプレイを使ったものを作れるようになります!

電子工作をするうえで、ディスプレイはとても便利なモジュールです。
新しいデバイスを作る際などにステータスを表示させたり、目視で確認できない情報を指示してくれます。
ディスプレイが使えるようになると、「Raspberry Pi Pico W」でできることがぐっと広がります。
そうなると、制御が必要なデバイスなどのより複雑な回路を用いた物を作ることができるようになります!

わからないことがありましたら、問い合わせページまたは公式ラインに連絡をください!
Youtubeもありますので、ぜひ見てみてください!

つかうもの

この記事で使っているものを紹介します。
*このリンクは、アフィリエイトリンクです。
こちらのリンクから購入されると、投稿主にインセンティブが発生します。
より良い記事のために、ぜひ購入する際は以下のリンクよりお願いします。。

実際に投稿主が購入したキットを紹介します。
こちらのキットは、マイコンと電子工作に必要な部品がセットになったものです。
こちら購入すればすぐに電子工作始められます!
また、公式HPでモジュール、プログラムの解説もされているので、非常におススメです。

購入はこちらをクリック!
*画像はリンク先より引用

個別で購入したい方は、以下のリンクより購入ください。

購入はこちらをクリック!
*画像はリンク先より引用

購入はこちらをクリック!
*画像はリンク先より引用

購入はこちらをクリック!
*画像はリンク先より引用

回路の解説

それでは、実際に回路についてみていきましょう!
今回は、「ラズパイ pico」とディスプレイをつなぐだけの簡単なものになっています。
↓の画像と写真参考につなげてみてください。

こちらが今回使用するLCDモジュールです。
*裏面についているものは、I2Cの通信モジュールです。
*本来16ピンのところこのモジュールを使えば4ピンでディスプレイを使うことができます!

このようにつなげられたら、プログラムを書き込んでいきます。

動かしていこう!

以下のプログラムを「Thonny」を使って、「ラズパイ pico」に書き込んでいきます。

ライブラリを使う!

今回は、ディスプレイに文字を表示するために、ライブラリというものを使います。
ライブラリを使うための下準備をします

1,「ラズパイ pico」のなかに[lib]という名前のフォルダーを作成します。
2,ライブラリのpythonファイルを作成

実際にやっていきましょう。

まずは「thonny」でファイルを開く→「RP2040 device」を選択します

その後、右クリック→新しいディレクトリの追加
*名前は「lib」にしてください。そうすることで、自動的にライブラリが読み込まれます。

あとは、この「lib」の中に以下のプログラムをコピペして、「lcd1602.py」と保存してください。

import machine
import time

class LCD():
    def __init__(self, addr=None, blen=1):
        sda = machine.Pin(6)
        scl = machine.Pin(7)
        self.bus = machine.I2C(1,sda=sda, scl=scl, freq=400000)
        #print(self.bus.scan())
        self.addr = self.scanAddress(addr)
        self.blen = blen
        self.send_command(0x33) # Must initialize to 8-line mode at first
        time.sleep(0.005)
        self.send_command(0x32) # Then initialize to 4-line mode
        time.sleep(0.005)
        self.send_command(0x28) # 2 Lines & 5*7 dots
        time.sleep(0.005)
        self.send_command(0x0C) # Enable display without cursor
        time.sleep(0.005)
        self.send_command(0x01) # Clear Screen
        self.bus.writeto(self.addr, bytearray([0x08]))

    def scanAddress(self, addr):
        devices = self.bus.scan()
        if len(devices) == 0:
            raise Exception("No LCD found")
        if addr is not None:
            if addr in devices:
                return addr
            else:
                raise Exception(f"LCD at 0x{addr:2X} not found")
        elif 0x27 in devices:
            return 0x27
        elif 0x3F in devices:
            return 0x3F
        else:
            raise Exception("No LCD found")

    def write_word(self, data):
        temp = data
        if self.blen == 1:
            temp |= 0x08
        else:
            temp &= 0xF7
        self.bus.writeto(self.addr, bytearray([temp]))
    
    def send_command(self, cmd):
        # Send bit7-4 firstly
        buf = cmd & 0xF0
        buf |= 0x04               # RS = 0, RW = 0, EN = 1
        self.write_word(buf)
        time.sleep(0.002)
        buf &= 0xFB               # Make EN = 0
        self.write_word(buf)

        # Send bit3-0 secondly
        buf = (cmd & 0x0F) << 4
        buf |= 0x04               # RS = 0, RW = 0, EN = 1
        self.write_word(buf)
        time.sleep(0.002)
        buf &= 0xFB               # Make EN = 0
        self.write_word(buf)
    
    def send_data(self, data):
        # Send bit7-4 firstly
        buf = data & 0xF0
        buf |= 0x05               # RS = 1, RW = 0, EN = 1
        self.write_word(buf)
        time.sleep(0.002)
        buf &= 0xFB               # Make EN = 0
        self.write_word(buf)

        # Send bit3-0 secondly
        buf = (data & 0x0F) << 4
        buf |= 0x05               # RS = 1, RW = 0, EN = 1
        self.write_word(buf)
        time.sleep(0.002)
        buf &= 0xFB               # Make EN = 0
        self.write_word(buf)
    
    def clear(self):
        self.send_command(0x01) # Clear Screen
        
    def openlight(self):  # Enable the backlight
        self.bus.writeto(self.addr,bytearray([0x08]))
        # self.bus.close()
    
    def write(self, x, y, str):
        if x < 0:
            x = 0
        if x > 15:
            x = 15
        if y < 0:
            y = 0
        if y > 1:
            y = 1

        # Move cursor
        addr = 0x80 + 0x40 * y + x
        self.send_command(addr)

        for chr in str:
            self.send_data(ord(chr))
    
    def message(self, text):
        #print("message: %s"%text)
        for char in text:
            if char == '\n':
                self.send_command(0xC0) # next line
            else:
                self.send_data(ord(char))

そして、「lib」ではなくデフォルトの場所に以下のプログラムをコピペして保存してください。
このプログラムは、名前は何でもよいです。

from lcd1602 import LCD
import utime

lcd = LCD()
string = " Hello!\n"
lcd.message(string)
utime.sleep(2)
string = "    Kouduki labo"
lcd.message(string)

それでは、実際に動かしていきます、、、

きちんと、文字が表示されましたね!
ということで、プログラムのstring()の中身を以下のように変更してみると、、、

from lcd1602 import LCD
import utime

lcd = LCD()
string = " 2024/03/14\n"
lcd.message(string)
utime.sleep(2)
string = "Thursday"
lcd.message(string)

これで実行すると、、、

文字が変化しました!
このように、string()の中身を変更することで、表示する文字を変更することができます。

ライブラリについて

ということで、このディスプレイを使うのに「LDC」というライブラリを使用しました。
このライブラリにはPCF8574というI2Cモジュールを使ってディスプレイに文字を表示させるプログラムが書かれています。

本来ディスプレイを表示させるのには、16ピン必要です
それが、PCF8574というモジュールを使うことで、たったの4ピンで文字を表示できるようになります。

このライブラリの詳細は、また別の記事で解説します

動かない原因

きちんとディスプレイが表示されない場合は、以下の項目をチェックしてみてください。

回路は正しいか

動かない場合は、もう一度正しいピンにつながっているかを確認してください。

ジャンパー線の断線

回路が正しい場合は、ジャンパー線を変えてみてください。

プログラム

プログラムのエラーが起きていないかを確認してください。

どうしても動かない場合

以上の項目を確認しても動かない場合は、公式ラインに連絡してください。
↓のボタンから追加してください!

友だち追加

時間のある時に1つ1つ丁寧に対応させていただきます!

さいごに

今回は、ディスプレイに文字を表示させてみました。
うまくいったでしょうか

ディスプレイに文字を表示することができるようになったら、できることが大幅に広がります。
このブログでは、ほかにも様々なディスプレイも解説していきます!

ブログの更新のお知らせは公式ラインから!

それでは、次回の記事でお会いしましょう。

Raspberry Pi Pico Wカテゴリの最新記事