1.1.7 I2C LCD1602

前書き

LCD1602は文字型液晶ディスプレイで、32(16 * 2)文字を同時に表示できる。

部品

_images/list_i2c_lcd.png

原理

I2C LCD1602

ご存知のように、LCDやその他のディスプレイはマンマシンの相互作用を大幅に強化するが、共通の弱点を共有している。 それらがコントローラーに接続されると、外部ポートがあまりないコントローラーの複数のIOが占用される。 また、コントローラーの他の機能も制限される。したがって、この問題を解決するために、I2Cバスを備えたLCD1602が開発された。

_images/i2c_lcd.png

I2C通信

I2C(アイ・スクエアド・シー)バスは、一つマスターデバイス(または複数のマスターデバイス)と単一または複数のスレーブデバイス間の通信用の非常に強力なバスである。

I2Cメインコントローラーを使用して、IOエクスパンダー、各種センサー、EEPROM、ADC/DACなどを制御できる。 これらはすべて、ホストの2つのピン、シリアルデータ(SDA1)ラインとシリアルクロックライン(SCL1)によってのみ制御される。

回路図

T-Board Name

physical

SDA1

Pin 3

SCL1

Pin 5

_images/schematic_i2c_lcd.png

実験手順

ステップ1: 回路を作る。

_images/image96.png

ステップ2: I2Cをセットアップします( I2C構成 。I2Cを設定している場合は、このステップをスキップしてください。)

C言語ユーザー向け

ステップ3: ディレクトリを変更する。

cd /home/pi/davinci-kit-for-raspberry-pi/c/1.1.7/

ステップ4: コンパイルする。

gcc 1.1.7_Lcd1602.c -lwiringPi

ステップ5: 実行する。

sudo ./a.out

コードの実行後、LCDに「Greetings」、「SunFounderから」が表示される。

注釈

コードと配線に問題がないのに LCD に内容が表示されない場合は、背面のポテンショメータをひねってみてください。

コード

#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <string.h>

int LCDAddr = 0x27;
int BLEN = 1;
int fd;

void write_word(int data){
    int temp = data;
    if ( BLEN == 1 )
        temp |= 0x08;
    else
        temp &= 0xF7;
    wiringPiI2CWrite(fd, temp);
}

void send_command(int comm){
    int buf;
    // Send bit7-4 firstly
    buf = comm & 0xF0;
    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Make EN = 0
    write_word(buf);

    // Send bit3-0 secondly
    buf = (comm & 0x0F) << 4;
    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Make EN = 0
    write_word(buf);
}

void send_data(int data){
    int buf;
    // Send bit7-4 firstly
    buf = data & 0xF0;
    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Make EN = 0
    write_word(buf);

    // Send bit3-0 secondly
    buf = (data & 0x0F) << 4;
    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Make EN = 0
    write_word(buf);
}

void init(){
    send_command(0x33);     // Must initialize to 8-line mode at first
    delay(5);
    send_command(0x32);     // Then initialize to 4-line mode
    delay(5);
    send_command(0x28);     // 2 Lines & 5*7 dots
    delay(5);
    send_command(0x0C);     // Enable display without cursor
    delay(5);
    send_command(0x01);     // Clear Screen
    wiringPiI2CWrite(fd, 0x08);
}

void clear(){
    send_command(0x01);     //clear Screen
}

void write(int x, int y, char data[]){
    int addr, i;
    int tmp;
    if (x < 0)  x = 0;
    if (x > 15) x = 15;
    if (y < 0)  y = 0;
    if (y > 1)  y = 1;

    // Move cursor
    addr = 0x80 + 0x40 * y + x;
    send_command(addr);

    tmp = strlen(data);
    for (i = 0; i < tmp; i++){
        send_data(data[i]);
    }
}


void main(){
    fd = wiringPiI2CSetup(LCDAddr);
    init();
    write(0, 0, "Greetings!");
    write(1, 1, "From SunFounder");
}

コードの説明

void write_word(int data){……}
void send_command(int comm){……}
void send_data(int data){……}
void init(){……}
void clear(){……}
void write(int x, int y, char data[]){……}

これらの関数は、I2C LCD1602オープンソースコードを制御するために使用される。 これにより、I2C LCD1602を簡単に使用できる。 これらの関数の中で、 init() は初期化に使用され、 clear() は画面の消去に使用され、 write() は表示内容の書き込みに使用され、 他の関数は上記の関数をサポートする。

fd = wiringPiI2CSetup(LCDAddr);

この関数は指定されたデバイスシンボルでI2Cシステムを初期化する。関数のプロトタイプ:

int wiringPiI2CSetup(int devId);

パラメーターdevIdはI2Cデバイスのアドレスであり、i2cdetectコマンド(付録を参照)で見つけることができ、I2C LCD1602のdevIdは通常0x27である。

void write(int x, int y, char data[]){}

この関数では、 data[] はLCDにプリントされる文字であり、パラメーターxとyはプリントの位置を決定する(行y + 1、列x + 1はプリントされる文字の開始位置である)。

Python言語ユーザー向け

ステップ3: ディレクトリを変更する。

cd /home/pi/davinci-kit-for-raspberry-pi/python/

ステップ4: 実行。

sudo python3 1.1.7_Lcd1602.py

コードの実行後、LCDに「Greetings」、「SunFounderから」が表示される。

注釈

  • FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1' というエラーが発生した場合は、 I2C構成 を参照して I2C を有効にする必要があります。

  • ModuleNotFoundError: No module named 'smbus2' エラーが発生した場合は、 sudo pip3 install smbus2 を実行してください。

  • OSError: [Errno 121] Remote I/O というエラーが発生した場合は、モジュールの配線が間違っているか、モジュールが破損しています。

  • コードと配線に問題がないのに LCD に内容が表示されない場合は、背面のポテンショメータをひねってみてください。

コード

注釈

以下のコードを 変更/リセット/コピー/実行/停止 できます。 ただし、その前に、 davinci-kit-for-raspberry-pi/python のようなソースコードパスに移動する必要があります。

import LCD1602
import time

def setup():
    LCD1602.init(0x27, 1)   # init(slave address, background light)
    LCD1602.write(0, 0, 'Greetings!!')
    LCD1602.write(1, 1, 'from SunFounder')
    time.sleep(2)

def destroy():
    LCD1602.clear()

if __name__ == "__main__":
    try:
        setup()
    except KeyboardInterrupt:
        destroy()

コードの説明

import LCD1602

このファイルはI2C LCD1602を制御するためのオープンソースファイルである。I2C LCD1602を簡単に使用できる。

LCD1602.init(0x27, 1)

この関数は指定されたデバイスシンボルでI2Cシステムを初期化する。最初のパラメーターはI2Cデバイスのアドレスで、i2cdetectコマンドで検出できる(詳細については付録を参照してください)。I2C LCD1602のアドレスは通常0x27である。

LCD1602.write(0, 0, 'Greetings!!')

コードの実行後、LCDに「Greetings」、「SunFounderから」が表示される。

現象画像

_images/image97.jpeg