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