Arduino(1) LCD液晶に文字表示してみた
はじめに
Arduinoを使って、何か作る為の準備として、少しずつ周辺機器をマスターしていきます。まずは表示からという事で、手元にあった「ACM1602NI-FLW-FBW」を使ってみる。
初期設定
他サイトにいくらでも情報があるのでここでは省略。
接続
ACM1602NI
pin | 内容 | 詳細 |
---|---|---|
1 | Vss | GND |
2 | Vdd | 3.3v |
3 | Vo | 輝度調整 |
4 | SCL | I2C通信用 |
5 | SDA | I2C通信用 |
6 | BL+ | バックライト電源 |
7 | BL- | バックライト電源 |
輝度調整(Vo)を未接続だと、輝度MAXらしくすべてのドットが表示されてしまい、正しく文字が表示されているか分からなくなる、当初接続しなくてもいいかと思って、ソース実装したけど指定した文字列が表示されなくて戸惑った。
ACM1602N1に添付の説明書を見ると、BL+に15[Ω]の制限抵抗を入れている事に後で気づいた…。確認時には入れてなくても点灯していたが、入れた方が安全かも。
実装
液晶とはI2Cにて通信を行うので、その為のライブラリとしてWire.hが必要。
今回実装にて使用する関数のみ簡単に説明。他関数の詳細は、以下のサイトが詳しい
使用する関数
関数名 | 説明 |
---|---|
begin() | 初期設定、引数省略でmasterとなる。slaveで使用の場合には、引数にアドレスを入れる。 |
beginTransmission() | 引数で指定したslaveのアドレスに対して通信を開始する。 |
write() | 通信電文を引数に入れて相手に送信 |
endTransmission() | 通信の終了、beginTransmissionと対になっている |
ArduinoIDEの設定
パソコンとArduinoをUSBにて接続した後に、ArduinoIDEにて、Arudinoの機種とシリアルポートを選択する。
実装
とりあえずソースコードです。中身の説明は下の方にあります。
//LCD
#include <Wire.h>
byte lcdAddress = 0x50;
char str[] = {"Hello World AMC1602"};
//-----------------------------------------------
// ACM1602NI初期化
//-----------------------------------------------
void lcdInit()
{
i2cCmdWrite(0x01); //Clear Display
delay(5);
i2cCmdWrite(0x38); //Function Set
delay(5);
i2cCmdWrite(0x0c); //Display ON/OFF Control
delay(5);
i2cCmdWrite(0x06); //Entry Mode Set
delay(5);
}
//-----------------------------------------------
// 文字列の書き出し
//-----------------------------------------------
void lcdWrite(char* str)
{
int i;
i = 0;
i2cCmdWrite(0x80); //1行目の先頭にカーソルを移動
delay(5);
for(i = 0;i < 16;i++)
{
if(*str == '\0')break;
i2cDataWrite(*str++);
delay(5);
}
i2cCmdWrite(0xc0); //2行目の先頭にカーソルを移動
delay(5);
for(i = 0;i < 16;i++)
{
if(*str == '\0')break;
i2cDataWrite(*str++);
delay(5);
}
}
//-----------------------------------------------
// I2CにてACM1602NIにコマンドを送信
//-----------------------------------------------
int i2cCmdWrite(byte cmd){
Wire.beginTransmission(lcdAddress);
Wire.write(0x00);
Wire.write(cmd);
return Wire.endTransmission();
}
//-----------------------------------------------
// I2CにてACM1602NIに表示文字を送信
//-----------------------------------------------
int i2cDataWrite(byte data){
Wire.beginTransmission(lcdAddress);
Wire.write(0x80);
Wire.write(data);
return Wire.endTransmission();
}
//-----------------------------------------------
// Main
//-----------------------------------------------
void setup() {
// put your setup code here, to run once:
int i;
//LCD
Wire.begin();
lcdInit();
lcdWrite(str);
}
void loop() {
}
結果
説明
lcdInit関数
ACM1602NIの初期設定を実施します。
ACM1602NIに添付の取説内の「11.0 DISPLAY INSTRUCTION TABLE AND DDRAM ADDRESS」に従い初期設定を行います。取説内の表の見方は、コマンド毎に決まったbit位置に「1」を立てて、それより右側に各種設定を行う感じです。コマンド種類を示すbit位置は下記の黄色の箇所。
I2CにてACM1602NIにコマンドを投げたいので、「i2cwritecmd」関数をコマンドを引数として読み出します。各コマンドの意味は以下の通り。
| 引数 | Instruction | 説明 |
| ---- | ---- | ---- | ---- |
| 0x01 | Clear Display | 最初の初期化、お約束でしょうか |
| 0x38 | Function Set | DL : データサイズ、今回は8bitなので1 |
| | | N : 行数の選択、今回は2行なので1 |
| | | F : 表示文字のサイズ、5×8 |
| 0x0c | Display ON/OFF Control | D : ここは1で |
| | | C : カーソルの表示 0で非表示、1で表示 |
| | | B : カーソルを点滅させるか 1で点滅、0で非点滅 |
| 0x06 | Entry Mode Set | I/D :
i2cCmdWrite/i2cDataWrite関数
ACM1602NIとはI2Cにて通信を行うのでWireライブラリを使用します。コマンドとして送信する場合には0x00を、データとしては0x80を送信した後に内容を送信する手順なので、最初に送信する0x00/0x80が違うだけで、他は同じ。
Discussion