ゆる〜く電子工作

電子工作の備忘録メインで ゆる〜くいきます

Arduino:I2C経由で1602LCDを動かしてみる

今回とりあげる、I2C通信式のLCDパネルは、こんな感じです↓

f:id:milelife:20170411145420j:plain

 
液晶パネルは通常の16桁×2行の1602パネル(緑色モジュール)が元になります。
これ自体は 4bit/ 8bit パラレル通信式モジュールなのですが、外部(Arduinoなど)との接続ラインが電源含め8本以上必要と、とても多くなってしまいます。
そこで「パラレル⇔I2C変換モジュール(黒色)」により、接続ラインを電源含め4本に削減することができます。
以下、Arduinoにて、I2C_LCDモジュールを制御するための方法を示していきます。
 
 Step 1  必要なライブラリーのダウンロード
このモジュール用に作られた LCD Library を、下記からダウンロードします。
 
zipファイルはとりあえずダウンロードフォルダなどに保存しておいてください。
 次に、保存した新ライブラリーを、Arduino IDEにインストールします。
zipファイルの取得、およびインストールの手順は、以下のページをご参照ください。

milelife.hatenadiary.com

 

 Step 2  ArduinoUNOとLCDモジュールとの配線
ジャンパー線(メス⇔オス)で次のように配線します。
LCD> <Arduino UNO>
 GND ----- GND
 VCC ----- 5V
 SDA ----- A4 or SDA(UNO r3の場合、AREFの隣り)
 SCL ----- A5 or SCL (UNO r3の場合、SDAの隣り)
I2C信号線(SDA, SCL)の外部抵抗によるプルアップは特に必要ありません
 
 Step 3  LCDのコントラスト調整
配線をすませ、Arduino側のUSBケーブルを接続(電源ON)しますと、LCDのバックライトが明るくなります。
LCD文字のコントラストは「パラレル⇔I2C変換モジュール」上にある半固定抵抗にて調整します。
大体半分程度に合わせておいて、あとで微調整します。
 
Step 4  LCDモジュールの I2Cアドレスを見つけ出す
 一般的に、各I2Cデバイスには固有のI2Cアドレスが指定されており、このアドレスを使って(Arduinoなどの)I2Cマスター側は、特定のI2Cスレーブ・デバイスとの通信を確立します。I2C_LCDモジュールはI2Cスレーブ・デバイスとなります。
 LCDモジュールのI2Cアドレスは、多くの場合、デフォルトで0x27, 0x3F などが割り振られています。またモジュールのジャンパ・パターンの設定によってI2Cアドレスをある程度変更できるようになっています。これらはパラレル⇔I2C変換モジュール」を構成する主要ICの仕様です。
 ここでは、LCDモジュールのI2Cアドレスがわからない場合でも、そのアドレスを探し出せる方法をご紹介します。以下のI2C_scanというコードがよく知られています。
 
I2C_scan
/* this program is to detect IC2 device connected to Arduino
*/
#include <Wire.h>

void setup()
{
Wire.begin();

Serial.begin(9600);
Serial.println("\nI2C Scanner");
}


void loop()
{
byte error, address;
int nDevices;

Serial.println("Scanning...");

nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();

if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");

nDevices++;
}
else if (error==4)
{
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");

delay(5000); // wait 5 seconds for next scan
}

今回取り上げたLCDモジュールのI2Cアドレスは 0x3Fでした。

f:id:milelife:20170412055443p:plain

 
Step 5  Hello World サンプルスケッチを実行
それでは準備が整いましたので、いよいよ"Hello World!" の実行です。
Arduino-LiquidCrystal-I2C-library-masterのサンプル HelloWorldを開きます。

f:id:milelife:20170412055852j:plain

 

ここで、I2Cアドレスを修正します。Step 4で取得した 0x3Fを代入します。

 

<変更前>

f:id:milelife:20170412060543j:plain

 <変更後>

f:id:milelife:20170412062138j:plain

 できました!

f:id:milelife:20170412061627j:plain

 

補足

上記ライブラリーで使える関数の一部を挙げておきます

lcd.clear :画面クリア
lcd.setCursor( , ) :指定位置にカーソルをセット
lcd.noBacklight :バックライトをOFF
lcd.backlight :バックライトをON
lcd.createChar :カスタムキャラクター(絵文字)の作成
lcd.print :数値、文字列の表示

 

適宜更新します。