יום רביעי, 9 באוקטובר 2013

תצוגת LCD בתקן HD44780 ע"י Raspberry Pi

כבר כמה זמן שאני "חם" על תצוגת LCD קטנה כדי שאוכל לחבר אותה ל- Raspberry Pi ולהציג מידע פשוט ממנו. כל מכשיר שאני רואה עם תצוגה כזו צריך לחשוש ממני...
אחרי שתצוגה אחת שכזו אכזבה אותי ופשוט לא עבדה, בסופו של דבר נפל לידי מכשיר פקס ישן (שזוגתי מצאה לי בשוק "קח-תן") עם תצוגת LCD בעלת שורה אחת של 16 ספרות. מצאתי הסבר פשוט ומעולה באתר rpiblog.com, שהסביר איך לחבר, ובאופן מפתיע זה עבד די בנסיון הראשון!



שנצלול לפרטים?

מסתבר שרוב התצוגות הללו משתמשות בתקן אחיד שנקרא HD44780. כיוון שכך, אותו קוד שפרסם Rahul Kar בבלוג המוזכר לעיל, עובד עם תצוגת אחרות. היו שני הבדלים שנדרשתי לתת עליהם את הדעת:
  1. פין 3, שאחראי על ה- contrast של התצוגה - ראול חיבר אותה ישר ל-GND. אצלי זה יצא חזק מדי והיה קשה לראות מה כתוב. אני השתמשתי בנגד של (10kΩ) אוהם.
  2. התצוגה שלי היתה בעלת שורה אחת של 16 תווים, אבל התנהגה כתצוגה של 2 שורות של 8 תווים כ"א. כלומר, הדפסה של
1234567890123456
היתה מציגה "12345678" על המסך. אבל הדפסה של
12345678\n90123456
היתה נותנת את התוצאה המתבקשת, "1234567890123456" על המסך.

אני מצרף את הקוד של ראול עם שינויים קטנים שלי. קודם כל הוספתי את ניקוי ה- GPIO בסוף (בהמלצת אחד המגיבים). בנוסף, שיניתי את שורת ההדפסה כך שהיא תדפיס את שני הארגומנטים משורת הפקודה ישירות.

#!/usr/bin/python

import RPi.GPIO as GPIO
import sys
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.001)
        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(sys.argv[1] +"\n"+sys.argv[2])

הרצה:
sudo python lcd.py first second

על המסך אמורות הופיע שתי המילים first ו- second, אחת בכל שורה (או במקרה שלי, באותה שורה).

אין תגובות:

הוסף רשומת תגובה