I2C (Arduino IDE + ESP ボードマネージャ)

はじめに

教育ボードに搭載されている液晶ディスプレイ (LCD) を使う.

プログラムの書き方

Arduino IDE のWire Library を参照して欲しい.

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

プログラムの分割

教育ボードに搭載された LCD を扱うためのプログラムのソースは長いので, ファイルの分割を行う.

右上の ▼ アイコンを押せば, タブとして新たなファイルが追加される. 新たなタブのファイル名に拡張子を付けずに保存すると, 拡張子は .ino となる. .ino の場合には, #include は特に必要無い. .ino 同士は一緒にコンパイルされる.

プログラムの作成

LCD に最初の 10 秒間 "Hello!! from ESP" と表示させ, その後になんらかの文字列を繰り返し表示させるようにする.

lcd.ino

LCD 用のプログラム. データシートとプログラム中の注釈を参照のこと.

1  /*
2   * LCD AQM0802A-RN-GBW
3   * 
4   * データシート: http://akizukidenshi.com/download/ds/xiamen/AQM0802.pdf
5   */
6 
7  #define lcd_address ****      //LCD AQM0802 の I2C アドレスの指定
8 
9 
10 int lcd_cmd(byte cmd) {
11     Wire.beginTransmission(lcd_address);   //スレーブアドレスの指定. LCDのI2Cアドレス(7ビット) を指定し, LCDとの通信を開始. Wire.beginTransmission関数の引数は7ビットなので引数にRTCのI2Cアドレスを与えれば良い.
12     Wire.write( **** );                      //コントロールバイトの指定. コマンドを送る1つ送る場合は....
13     Wire.write( cmd );                       //コマンド (8bit)
14     return Wire.endTransmission();         //送信終了
15 }
16  
17 int lcd_data(byte data) {
18     Wire.beginTransmission(lcd_address);   //スレーブアドレスの指定. LCDのI2Cアドレス(7ビット)を指定し, RTCとの通信を開始. 
19     Wire.write( **** );                      //液晶に表示させるデータを 1 つ送る場合は....
20     Wire.write(data);                      //データバイト. 英数字の場合はアスキーコードに同じ. 
21     return Wire.endTransmission();         //送信終了
22 }
23 
24 void lcd_clear() {
25     lcd_cmd(****);                         //Clear Display
26 }
27  
28 void lcd_home0() {
29     lcd_cmd(****);                         //Return Home
30 }
31 
32 void lcd_home1() {
33     lcd_cursor(0,1);                  //2行目の先頭にカーソル移動(詳細はlcd_cursor関数のコメント参照)
34 }
35 
36 void lcd_cursor(int x, int y){
37     //カーソル移動.コマンド8ビットのうち,8ビット目は常に1, 残り7ビットは液晶のDDRAMアドレス. 
38     //DDRアドレスは, 1行目は 0x00 ~ 0x07, 2行目は 0x40~0x47. 
39     //0x80とDDRAMアドレスの OR を取ることでコマンドを生成している.
40     byte ca = (x + y * 0x40) | (0x80); 
41     lcd_cmd(ca);
42 }
43 
44 void lcd_init() {
45     //初期化はデータシートの「初期設定例」をコピー.
46     delay(200);
47     lcd_cmd(****); delay(****);        //Function set
48     .... 
       ....
56 }
57  
57  
58 void lcd_print( String pdata) {
59     //引数で与えられた文字列の表示
60     int n = pdata.length(); 
61     for (int i = 0; i < n; i = i + 1) {
62         lcd_data(pdata.charAt(i));        //英数字を書くためのデータ = ascii 
63     delay(1);
64     }
65 }

メイン関数

1  #include<Wire.h>
2 
3  const int PIN_SDA = 21;  //I2CのGPIO(SDA)ピン
4  const int PIN_SCL = 22;  //I2CのGPIO(SCL)ピン
5  ....  //必要な変数を定義
   ....
8     
9  void setup() {
10  //I2C初期化
11   Wire.begin(PIN_SDA, PIN_SCL);
12 
13   //LCD 初期化 
14   lcd_init();
15 
16   // 1 行目にカーソル移動 (1文字 字下げ)
17   lcd_cursor(1, 0);
18   // 1 行目の先頭に移動
19   //lcd_home0();
20 
21   // 1 行目に表示
22   lcd_print("Hello!!");
23 
24   // 2 行目にカーソル移動 (2文字 字下げ)
25   //lcd_cursor(2, 1);
26   // 2 行目の先頭に移動
27   lcd_home1();
28     
29   // 2 行目に表示
30   lcd_print("from ESP");
31 
32   //10秒待つ 
33   delay(10000);
34 
38 }
39 
40 void loop() {
41  
43   sec += 1
47 
48   .....
     .....
56 }

課題

上記のプログラムを完成させること.