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
課題
上記のプログラムを完成させなさい.