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 に最初の 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

課題

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