I2C (mruby/c)
はじめに
教育ボードに搭載されている液晶ディスプレイ (LCD) とリアルタイムクロック (RTC) を使う. 下記で述べるように, プログラムを穴埋め形式にしているので, データシートから必要な情報を読み取って それを埋めることを試みて欲しい.
プロジェクトの準備
基本的に ESP-IDF 環境と同じなので, ESP-IDF 環境がインストールされているディレクトリ (ここでは $HOME/esp) 以下にプロジェクト用のディレクトリを作る.
$ cd ~/esp $ git clone https://github.com/gfd-dennou-club/iotex-esp32-mrubyc.git mrubyc-04-i2c $ cd mrubyc-04-i2c
make menuconfig で “IoTeX ESP32 mrubyc Configuration” から I2C の項目にのみチェック入れる.
$ make menuconfig
書き方
iotex-esp32-mrubyc のI2Cを参照.
プログラムの作成
LCD に最初の 10 秒間 "Hello!! from ESP" と表示させ, その後に時刻を表示させるようにする.
プログラムの中身については, データシートとプログラム中の注釈を参照のこと. なお, プログラムに対する詳細なコメントは Arduino IDE 版に付けたので, そちらも参照して欲しい.
- 液晶ディスプレイ(LCD) AQM0802A-RN-GBW
- リアルタイムクロック (RTC) RC-8035SA 日本語, 英語
プログラムの作成
LCD に最初の 5 秒間 "Hello!! from ESP" と表示させ, その後に時刻を表示させるようにする. <URL:mrubyc-i2c-sample.rb> から以下のサンプルのソースをダウンロードできる.
1 # coding: utf-8
2
3 @lcd_address = 0x3e
4 @rtc_address = 0x32
5
6 def lcd_cmd(i2c, cmd)
7 i2c.write(@lcd_address, [0x00, cmd])
8 end
9
10 def lcd_data(i2c, data)
11 #自分で書く
12 end
13
14 def lcd_clear(i2c)
15 #自分で書く
16 end
17
18 def lcd_home0(i2c)
19 #自分で書く
20 end
21
22 def lcd_home1(i2c)
23 #自分で書く
24 end
25
26 def lcd_cursor(i2c, x, y)
27 #自分で書く
28 end
29
30 def lcd_init(i2c)
31 sleep 0.2
32 [0x38, 0x39, 0x14, 0x70, 0x56, 0x6c].each do |cmd|
33 lcd_cmd(i2c, cmd)
34 end
35 sleep(0.3)
36 #初期化の後半は自分で書く
37 sleep(0.1)
38 end
39
40 def lcd_print(i2c, data)
41 data.length.times do |n|
42 lcd_data(i2c, data[n].ord)
43 end
44 end
45
46 def rtc2_init(i2c)
47 #自分で書く
48 end
49
50 def rtc2_set(i2c)
51 #自分で書く
52 end
53
54 def rtc2_get(i2c, tt)
55 # 読み込みは自分で書く
56 buf = ... # 8 バイト分読み込み
57
58 #読み込んだデータをハッシュに代入
59 tt['year'] = buf[7]
60 tt['mon'] = buf[6]
61 tt['mday'] = buf[5]
62 tt['hour'] = buf[3] & 0x3f
63 tt['min'] = buf[2]
64 tt['sec'] = buf[1]
65 end
66
67
68 #I2C 初期化
69 i2c = I2C.new(22, 21)
70
71 # LCD 初期化
72 lcd_init(i2c)
73
74 # LCD に "Hello World" 表示
75 # 自分で書くこと
76
77
78 sleep(5)
79
80 # RTC 初期化. 時刻設定
81 rtc2_init(i2c)
82
83 # 時刻の初期化 (2021/04/30 23:59:50 にすること)
84 rtc2_set(i2c)
85
86 while true
87 # 時刻表示
88 tt = {} #ハッシュ
89 rtc2_get(i2c, tt)
90
91 time0 = sprintf("%02x-%02x-%02x", tt['year'], tt['mon'], tt['mday'])
92 time1 = sprintf("%02x:%02x:%02x", tt['hour'], tt['min'], tt['sec'])
93
94 # time0, time1 を LCD に表示する部分は自分で書くこと
95
96 sleep(1)
97 end
コンパイルと実行
コンパイルと実行を行う.
$ make $ make flash monitor
課題
上記のプログラムを完成させなさい.