I2C (MicroPython + Thonny)
はじめに
教育ボードに搭載されている液晶ディスプレイ (LCD) とリアルタイムクロック (RTC) を使う.
プログラムの書き方
MicroPython のリファレンスのI2C bus を参照する.
I2C で LCD や RTC と通信する際は, i2c.readfrom や i2c.writeto の引数を通信相手先の都合に合わせる必要がある. そのためには各機器のデータシートを確認せねばならない.
- 液晶ディスプレイ(LCD) AQM0802A-RN-GBW
- リアルタイムクロック (RTC) RC-8035SA 日本語, 英語
以下,Micropython のマニュアルから主な使い方を抜粋する.
from machine import Pin, I2C i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000) # 初期化.scl と sda のピン番号,および周波数を指定する. i2c.readfrom(0x3a, 4) # アドレス 0x3a のデバイスから 4 バイト読み込み i2c.writeto(0x3a, '12') # アドレス 0x3a のデバイスに '12' を書き込み buf = bytearray(10) # 10バイトのバッファを作成 buf[0] = 0x00 # 1バイト目 .... i2c.writeto(0x3a, buf) # 与えたバッファをスレーブに書き込み
プログラムの作成
LCD に最初の 5 秒間 "Hello!! from ESP" と表示させ, その後に時刻を表示させるようにする.
from time import sleep
from machine import I2C, Pin
lcd_address = 0x3e
rtc_address = 0x32
def lcd_cmd(i2c, cmd):
buf = bytearray(2)
buf[0] = 0x00
buf[1] = cmd
i2c.writeto(lcd_address, buf)
def lcd_data(i2c, data):
# 自分で書く. LCD に 1 文字表示させるための関数.
def lcd_clear(i2c):
# 自分で書く.LCD の文字をクリアするための関数
def lcd_home0(i2c):
# 自分で書く.LCD のカーソルを 1 行目の先頭にもっていくための関数.
def lcd_home1(i2c):
# 自分で書く.LCD のカーソルを 2 行目の先頭にもっていくための関数.
def lcd_cursor(i2c, x, y):
# 自分で書く.LCD のカーソルを y 行目の x 番目にもっていくための関数.
def lcd_init(i2c):
# LCD の初期化
sleep(0.2)
for cmd in (0x38, 0x39, 0x14, 0x70, 0x56, 0x6C):
lcd_cmd( i2c, cmd)
sleep(0.3)
#初期化の後半は自分で書く
def lcd_print(i2c, data):
# LCD に data (文字長 > 1) を表示するための関数
for i in range(len(data)):
lcd_data(i2c, ord(data[i]))
def rtc2_init(i2c):
# 自分で書く.RTC の初期化.
def rtc2_set(i2c):
# 自分で書く.RTC に適当な時刻を設定するための関数
def rtc2_get(i2c, tt):
# 読み込みは自分で書く.RTC から時刻を取得するための関数
buf = ...
# 読み込んだデータをハッシュに代入
tt['year'] = buf[7]
tt['mon'] = buf[6]
tt['mday'] = buf[5]
tt['hour'] = buf[3] & 0x3F
tt['min'] = buf[2]
tt['sec'] = buf[1]
#####
#####
#####
#i2C初期化
i2c = I2C( scl=Pin(22), sda=Pin(21), freq=400*1000) #freq はデフォルト値
# 変数初期化
msg1 = 'Hello!'
msg2 = 'from ESP'
# LCD 初期化
lcd_init(i2c)
# msg1, msg2 を LCD に表示
# 自分で書くこと
# wait
sleep(5)
# RTC 初期化
rtc2_init(i2c)
# 時刻の入力
rtc2_set(i2c)
#繰り返しに時刻を表示させる
while True:
tt = {}
rtc2_get(i2c, tt)
time0 = '%02x-%02x-%02x' % (tt['year'], tt['mon'], tt['mday'] )
time1 = '%02x:%02x:%02x' % (tt['hour'], tt['min'], tt['sec'] )
# msg1, msg2 を LCD に表示
# 自分で書くこと
課題
上記のプログラムを完成させなさい.