📑

Arduino(1) LCD液晶に文字表示してみた

2021/07/10に公開

はじめに

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が必要。
今回実装にて使用する関数のみ簡単に説明。他関数の詳細は、以下のサイトが詳しい
http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=413

使用する関数

関数名 説明
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