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