I2C (MicroPython + Jupyter)
はじめに
教育ボードに搭載されている液晶ディスプレイ (LCD) とリアルタイムクロック (RTC) を使う.
プログラムの書き方
MicroPython のリファレンスのI2C bus を参照する.
I2C で LCD や RTC と通信する際は, i2c.readfrom や i2c.writeto の引数を通信相手先の都合に合わせる必要がある. そのためには各機器のデータシートを確認せねばならない.
- 液晶ディスプレイ(LCD) AQM0802A-RN-GBW
- リアルタイムクロック (RTC) RC-8035SA 日本語, 英語
以下,マニュアルから主な使い方を抜粋する.
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 # 自分で書くこと
課題
上記のプログラムを完成させなさい.