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に表示されました。
ブレッドボードです。