JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

Raspberry Pi Pico CircuitPython I2C LCD1602表示テスト

2022-04-28 07:32:41 | Raspberry Pi Pico
 Raspberry Pi Pico + CircuitPython + MuIDE環境で、I2Cインターフェース付きLCD1602の表示テストをします。

 電子工作において、LCD1602表示器は、まだまだ重要な表示パーツです。最近は、I2Cインターフェース付きのものが多く使われています。

 Raspberry Pi Pico + MicroPythonでの表示テストは既にこのブログに記事を書きました。記事はこちら

 今回は、CIrcuitPythonでの表示テストです。スクリプトはMicroPythonのものをCircuitPython用に書き換えて利用します。

 回路図です。
 I2Cは、SCL=GP15,SDA=GP14とし、I2Cの電圧レベル変換用にPCA9306モジュールを使っています。(このモジュールを使わず、直接LCD1602をPicoに接続しても使えますが、安全のため電圧変換モジュールを使用しています。)

 スクリプトです。
 1行目に「Hello World!」を表示し、2行目に数字を0からカウントアップして表示します。
-------------------------------------------------------------------------
"""
Raspberry Pi Pico CircuitPython I2C LCD1602 test
2022.4.28
JH7UBC Keiji Hata
"""

from board import *
import busio
from time import sleep

i2c=busio.I2C(GP15,GP14)

LCD_addr=0x27
LCD_EN=0x04 #LCD Enable
LCD_BL=0x08 #Back Light
CMD=0x00 #command mode
CHR=0x01 #character mode
LINE1=0x80 #Line1 top address
LINE2=0xC0 #Line2 top address

buf=bytearray(2)

while not i2c.try_lock():
         pass

def LCD_write(bits,mode):
     #High 4bits
     data=(bits & 0xF0)|mode
     buf[0]=data|LCD_EN|LCD_BL
     buf[1]=data|LCD_BL
     i2c.writeto(LCD_addr,buf)
     sleep(0.0001)#wait 100us
     #Low 4bits
     data=((bits<<4)&0xF0)|mode
     buf[0]=data|LCD_EN|LCD_BL
     buf[1]=data|LCD_BL
     i2c.writeto(LCD_addr,buf)
     sleep(0.0001)#wait 100us

def LCD_init():
     LCD_write(0x33,CMD)#8bit mode 0x03を2回送る
     LCD_write(0x32,CMD)#8bit mode,4bit mode 0x02を送る
     LCD_write(0x06,CMD)#Entry modeセット
     LCD_write(0x0C,CMD)#表示ON,カーソルOFF,カーソル点滅OFF
     LCD_write(0x28,CMD)#2桁表示,7ドットモード
     LCD_write(0x01,CMD)#Display clear
     sleep(0.002)#waite 2ms

def LCD_clear():
     LCD_write(0x01,CMD)
     sleep(0.002)#waite 2ms

def LCD_home():
     LCD_write(0x02,CMD)
     sleep(0.002)#waite 2ms

def LCD_cursor(x,y):
     if y==0:
         LCD_write(LINE1+x,CMD)
     if y==1:
        LCD_write(LINE2+x,CMD)

def LCD_print(str):
     for c in str:
        LCD_write(ord(c),CHR)

LCD_init()

LCD_clear()
LCD_home()
LCD_cursor(1,0)
LCD_print("Hello World!")
count=0

while True:
     LCD_cursor(1,1)
     LCD_print(str(count))
     count=count+1
     sleep(1)

-------------------------------------------------------------------------
 基本的にMicroPythonのスクリプトと同じなのですが、importの部分をCircuitPythonに合わせて実行すると
「RuntimeError: Function requires lock」というエラーが出てしまいました。
 どうやらCircuitPythonでは、
while not i2c.try_lock():
         pass
という文を入れて、I2C回路接続をロックすることが必要なようです。
これを入れて無事スクリプトが動き、文字がLCD1602に表示されました。
 
ブレッドボードです。


最新の画像もっと見る

コメントを投稿