ラズベリーパイにLCDモジュールが刺さった ノ巻

先日入手したRaspberryPI(ラズベリーパイ)のGPIOに何かつないでみようということで、16文字x2行のLCDモジュールを買ってきた。秋月にキットがあったが、同じ値段なのにバックライト付きでより一般的(?)なものが良さそうだったので、aitendo.ccに行ってUSBシリアル変換のついでにSC162Cを買ってきた。500円。
どういうものかというとこちらとかに詳しいので、簡単に説明するとLCDモジュールの中の人(マイコン)に出力したい文字に対応したコマンドを送るとそれがLCD上に表示される感じ。難しいことは中の人がやってくれるので、繋ぐだけ。しかも普通は4ビットモードで使うので、配線も少なめ。
最初は7セグを使おうと思っていが、数字しか出ないし(強引にアルファベットを出すのも興味はあるがw)、配線が複雑で4ケタにした場合は時分割で順繰りに出力し続けてやらないといけないので、プログラムもできることの割に複雑になる。それに対してLEDモジュールのほうはこちらから拾ってきたコードであっさり動作した。端子の配線は手持ちのSC162Cとは左右の配置が逆のようだったが、類似のモジュールなら中のマイコンはHD44780の互換になっているので基本は同じなのでどうにかなる。

プログラムのほうは標準で入っていないライブラリを、以下の手順でインストールしてやる必要がある。GPIOもドライバではなくPythonでスクリプト感覚でできてしまうのがRaspberryPi流のようだ。

[GPIOライブラリのインストール]
$sudo apt-get update
$sudo apt-get install python-dev
$sudo apt-get install python-rpi.gpio
あとは、コードの最後に「GPIO.cleanup()」をつけてやらないと、GPIOが握られっぱなしになるようだ。
ほかに1文字目が出ていなかったので、ウエイトを「sleep(0.001)」から「sleep(0.01)」に変更してやった。
(iPhone 4S)


端子の接続が見づらかったので、ここにも残しておく。

[端子接続]
 LCD Pin     Pi Pin
VSS  01  <------>  GPIO-06(Ground)
VDD  02  <------>  GPIO-02(5V Power)
Vo   03  <------>  GPIO-06(Ground)
RS   04  <------>  GPIO-26(GPIO 7)
R/W  05  <------>  GPIO-06(Ground)
E    06  <------>  GPIO-24(GPIO 8)
DB0   07
DB1  08
DB2  09
DB3  10
DB4  11  <------>  GPIO-22(GPIO 25)
DB5  12  <------>  GPIO-18(GPIO 24)
DB6  13  <------>  GPIO-16(GPIO 23)
DB7  14  <------>  GPIO-12(GPIO 18)
[サンプルコード]
#!/usr/bin/python

import RPi.GPIO as GPIO
from time import sleep
class HD44780:

  def __init__(self, pin_rs=7, pin_e=8, pins_db=[25, 24, 23, 18]):

    self.pin_rs=pin_rs
    self.pin_e=pin_e
    self.pins_db=pins_db

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(self.pin_e, GPIO.OUT)
    GPIO.setup(self.pin_rs, GPIO.OUT)
    for pin in self.pins_db:
      GPIO.setup(pin, GPIO.OUT)

    self.clear()

  def clear(self):
    """ Blank / Reset LCD """

    self.cmd(0x33) # $33 8-bit mode
    self.cmd(0x32) # $32 8-bit mode
    self.cmd(0x28) # $28 8-bit mode
    self.cmd(0x0C) # $0C 8-bit mode
    self.cmd(0x06) # $06 8-bit mode
    self.cmd(0x01) # $01 8-bit mode

  def cmd(self, bits, char_mode=False):
    """ Send command to LCD """

    sleep(0.01)
    bits=bin(bits)[2:].zfill(8)

    GPIO.output(self.pin_rs, char_mode)

    for pin in self.pins_db:
      GPIO.output(pin, False)

    for i in range(4):
      if bits[i] == "1":
        GPIO.output(self.pins_db[::-1][i], True)

    GPIO.output(self.pin_e, True)
    GPIO.output(self.pin_e, False)

    for pin in self.pins_db:
      GPIO.output(pin, False)

    for i in range(4,8):
      if bits[i] == "1":
        GPIO.output(self.pins_db[::-1][i-4], True)


    GPIO.output(self.pin_e, True)
    GPIO.output(self.pin_e, False)

  def message(self, text):
    """ Send string to LCD. Newline wraps to second line"""

    for char in text:
      if char == '\n':
        self.cmd(0xC0) # next line
      else:
        self.cmd(ord(char),True)

if __name__ == '__main__':

  lcd = HD44780()
  lcd.message("Raspberry Pi\n Take a byte!")
  GPIO.cleanup()

コメント

このブログの人気の投稿

退役iPod ClassicとRockbox化による再生 ノ巻

ジャンクなiPod miniをGetして、SDをCF変換アダプタ経由で換装してゼロスピンドル化 ノ巻

BOSE AW-1修理とラジオノイズ ノ巻