ラズパイでi2Cを使えるようになるために、この前Arduinoで使ったLCDをRaspberry Piでも使ってみることにしました。

 今回は前回と同じくモジュール付きのLCDを使いました。型番はFC-113というものでした。調べたところ、ラズパイでこのLCDを使うためのサンプルプログラムが公開されており、それを参考にすることにしました。

1. 配線
 ラズパイのピンアサインを公式サイトで調べ、GND,VCC,SDA,SCLをLCDの対応するピンとつなぎます。

2. i2cを有効にする
 Terminalで下記のコマンドを実行します。
$ sudo raspi-config
そうすると、画面が切り替わるので、Interfacing Option -> I2C -> Enable I2C -> Finish という風に進みます。
 ラズパイが再起動したらconfig fileを編集します。そのためにまず、Terminalで下記のコマンドをっ実行します。
$ sudo nano /etc/modules
モジュールファイルに下記の二つの分を追加しっます。
i2c-bcm2708
i2c-dev
Ctrl+Xを押して決定し、Yを押すと保存されます。

3. ライブラリのインストール
 Terminalで下記のコマンドを実行します。
sudo apt-get update
$ sudo apt-get install -y python-smbus i2c-tools
$ sudo reboot
三つ目のコマンドは再起動させるものなので、それが完了したら
Terminalで下記のコマンドを実行します。
$ lsmod | grep i2c_
i2c_bum2708がリストに追加されていればセットアップが完了しています。もしなかったら2と3を繰り返します。

4.  アドレスの確認
 Terminalで下記のコマンドを実行します。
$ sudo i2cdetect -y 1
or
$ sudo i2cdetect -y 0
 今回自分は3fと出ました。これが、後に書くプログラムの五行目にかかわってきます。

5. プログラム

import smbus

import time


# Define some device parameters

I2C_ADDR  = 0x3f # I2C device address, if any error, change this address to 0x27

LCD_WIDTH = 16   # Maximum characters per line


# Define some device constants

LCD_CHR = 1 # Mode - Sending data

LCD_CMD = 0 # Mode - Sending command


LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line

LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line

LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line

LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line


LCD_BACKLIGHT  = 0x08 # On

#LCD_BACKLIGHT = 0x00  # Off


ENABLE = 0b00000100 # Enable bit


# Timing constants

E_PULSE = 0.0005

E_DELAY = 0.0005


#Open I2C interface

#bus = smbus.SMBus(0)  # Rev 1 Pi uses 0

bus = smbus.SMBus(1) # Rev 2 Pi uses 1


def lcd_init():

 # Initialise display

 lcd_byte(0x33,LCD_CMD) # 110011 Initialise

 lcd_byte(0x32,LCD_CMD) # 110010 Initialise

 lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction

 lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off

 lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size

 lcd_byte(0x01,LCD_CMD) # 000001 Clear display

 time.sleep(E_DELAY)


def lcd_byte(bits, mode):

 # Send byte to data pins

 # bits = the data

 # mode = 1 for data

 #       0 for command


 bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT

 bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT


 # High bits

 bus.write_byte(I2C_ADDR, bits_high)

 lcd_toggle_enable(bits_high)


 # Low bits

 bus.write_byte(I2C_ADDR, bits_low)

 lcd_toggle_enable(bits_low)


def lcd_toggle_enable(bits):

 # Toggle enable

 time.sleep(E_DELAY)

 bus.write_byte(I2C_ADDR, (bits | ENABLE))

 time.sleep(E_PULSE)

 bus.write_byte(I2C_ADDR,(bits & ~ENABLE))

 time.sleep(E_DELAY)


def lcd_string(message,line):

 # Send string to display


 message = message.ljust(LCD_WIDTH," ")


 lcd_byte(line, LCD_CMD)


 for i in range(LCD_WIDTH):

   lcd_byte(ord(message[i]),LCD_CHR)


def main():

 # Main program block


 # Initialise display

 lcd_init()


 while True:


   # Send some test

   lcd_string("Created by ",LCD_LINE_1)

   lcd_string("Chisao_62 ",LCD_LINE_2)


   time.sleep(3)

 

   # Send some more text

   lcd_string("Hello World ",LCD_LINE_1)

   lcd_string("Raspberry Pi ",LCD_LINE_2)


   time.sleep(3)


if __name__ == '__main__':


 try:

   main()

 except KeyboardInterrupt:

   pass

 finally:

   lcd_byte(0x01, LCD_CMD)


最終的にこのようなプログラムとなりました。これを実行した結果下のように動きました。


 ラズベリーパイ関係のことはまだまだできないことが多いので、いろいろやっていこうと思います。それではまた今度