כבר כמה זמן שאני "חם" על תצוגת LCD קטנה כדי שאוכל לחבר אותה ל- Raspberry Pi ולהציג מידע פשוט ממנו. כל מכשיר שאני רואה עם תצוגה כזו צריך לחשוש ממני...
היתה נותנת את התוצאה המתבקשת, "1234567890123456" על המסך.
הרצה:
אחרי שתצוגה אחת שכזו אכזבה אותי ופשוט לא עבדה, בסופו של דבר נפל לידי מכשיר פקס ישן (שזוגתי מצאה לי בשוק "קח-תן") עם תצוגת LCD בעלת שורה אחת של 16 ספרות. מצאתי הסבר פשוט ומעולה באתר rpiblog.com, שהסביר איך לחבר, ובאופן מפתיע זה עבד די בנסיון הראשון!
שנצלול לפרטים?
מסתבר שרוב התצוגות הללו משתמשות בתקן אחיד שנקרא HD44780. כיוון שכך, אותו קוד שפרסם Rahul Kar בבלוג המוזכר לעיל, עובד עם תצוגת אחרות. היו שני הבדלים שנדרשתי לתת עליהם את הדעת:
- פין 3, שאחראי על ה- contrast של התצוגה - ראול חיבר אותה ישר ל-GND. אצלי זה יצא חזק מדי והיה קשה לראות מה כתוב. אני השתמשתי בנגד של (10kΩ) אוהם.
- התצוגה שלי היתה בעלת שורה אחת של 16 תווים, אבל התנהגה כתצוגה של 2 שורות של 8 תווים כ"א. כלומר, הדפסה של
1234567890123456
היתה מציגה "12345678" על המסך. אבל הדפסה של
12345678\n90123456
אני מצרף את הקוד של ראול עם שינויים קטנים שלי. קודם כל הוספתי את ניקוי ה- 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, אחת בכל שורה (או במקרה שלי, באותה שורה).

אין תגובות:
הוסף רשומת תגובה