I2C (MicroPython + Jupyter)

はじめに

教育ボードに搭載されている液晶ディスプレイ (LCD) とリアルタイムクロック (RTC) を使う.

プログラムの書き方

MicroPython のリファレンスのI2C bus を参照する.

I2C で LCD や RTC と通信する際は, i2c.readfrom や i2c.writeto の引数を通信相手先の都合に合わせる必要がある. そのためには各機器のデータシートを確認せねばならない.

以下,マニュアルから主な使い方を抜粋する.

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" と表示させ, その後に時刻を表示させるようにする. <URL:micropython-i2c-sample.ipynb> から以下のサンプルのソースをダウンロードできる.

1  from time import sleep
2  from machine import I2C, Pin
3
4  lcd_address = 0x3e
5  rtc_address = 0x32
6
7  def lcd_cmd(i2c, cmd):
8      buf = bytearray(2)
9      buf[0] = 0x00
10     buf[1] = cmd
11     i2c.writeto(lcd_address, buf)
12
13 def lcd_data(i2c, data):
14     # 自分で書く
15
16 def lcd_clear(i2c):
17     # 自分で書く
18
19 def lcd_home0(i2c):
20     # 自分で書く
21
22 def lcd_home1(i2c):
23     # 自分で書く
24
25 def lcd_cursor(i2c, x, y):
26     # 自分で書く
27
28 def lcd_init(i2c):
29     sleep(0.2)
30     for cmd in (0x38, 0x39, 0x14, 0x70, 0x56, 0x6C):
31         lcd_cmd( i2c, cmd)
32     sleep(0.3)
33     #初期化の後半は自分で書く
34
35 def lcd_print(i2c, data):
36     for i in range(len(data)):
37         lcd_data(i2c, ord(data[i]))
38
39 def rtc2_init(i2c):
40     # 自分で書く
41
42 def rtc2_set(i2c):
43     # 自分で書く
44
45 def rtc2_get(i2c, tt):
46     # 読み込みは自分で書く
47     buf = ...
48
49     # 読み込んだデータをハッシュに代入
50     tt['year'] = buf[7]
51     tt['mon']  = buf[6]
52     tt['mday'] = buf[5]
53     tt['hour'] = buf[3] & 0x3F
54     tt['min']  = buf[2]
55     tt['sec']  = buf[1]
56
57 #####
58 #####
59 #####
60
61 #i2C初期化
62 i2c = I2C( scl=Pin(22), sda=Pin(21), freq=400*1000)  #freq はデフォルト値
63
64 # 変数初期化
65 msg1 = 'Hello!'
66 msg2 = 'from ESP'
67
68 # LCD 初期化
69 lcd_init(i2c)
70
71 # msg1, msg2 を LCD に表示
72 # 自分で書くこと
73
74 # wait
75 sleep(5)
76
77 # RTC 初期化
78 rtc2_init(i2c)
79
80 # 時刻の入力
81 rtc2_set(i2c)
82
83 #繰り返しに時刻を表示させる
84 while True:
85     tt = {}
86     rtc2_get(i2c, tt)
87     time0 = '%02x-%02x-%02x' % (tt['year'], tt['mon'], tt['mday'] )
88     time1 = '%02x:%02x:%02x' % (tt['hour'], tt['min'], tt['sec'] )
89     # msg1, msg2 を LCD に表示
90     # 自分で書くこと

課題

上記のプログラムを完成させなさい.