আমি কীভাবে এইচডি 44780 ভিত্তিক এলসিডি সংযোগ করতে পারি?


13

এই প্রশ্নটি প্রসারিত । আমি জিপিআইও পিন এবং বিভিন্ন ট্রেডঅফগুলিতে এইচডি 44780 হুক করার জন্য কয়েকটি ভিন্ন উপায়ে দেখছি।

এখানে আমার "ওয়ার্ল্ড ক্লক" আইসিসি ব্যবহার করে আরপিআই চালাচ্ছে আইপিএর মাধ্যমে আরপিআই 3 এইচডি 44780 প্রদর্শন করে

এ পর্যন্ত আমি শুধু একটা 6 GPIO পিনের অনুরূপ ব্যবহার কাজ পেয়েছেন Adafruit এ টিউটোরিয়াল এবং I²C একটি ব্যবহার সংস্করণ MCP23017

আমি কাজ করতে চাই এমন অন্যান্য ধারণাগুলি হ'ল:

  • একটি CD4094 ব্যবহার করে

6 GPIO পিন সংস্করণ সহজ, কিন্তু ব্যবহার 6 মূল্যবান GPIO পিনের
CD4094 সংস্করণ খুব সস্তা এবং শুধুমাত্র 2 GPIO পিনের প্রয়োজন I²C সংস্করণ শুধুমাত্র সামান্য আরো ব্যয়বহুল, কিন্তু একটি একক MCP23017 6 প্রদর্শন পর্যন্ত চালাতে পারেন এবং ভাগ I²C অন্যান্য ডিভাইস সহ

অন্য কেউ চেষ্টা করার জন্য অন্যান্য বিকল্পের কথা চিন্তা করতে পারে?


এটি দেখুন: schnatterente.net/technik/… এটি রাস্পবেরি পাই + এইচডি 44780 প্রদর্শনের জন্য একটি দুর্দান্ত শীতল আরএসএস রিডার! :)

উত্তর:


5

6 জিপিআইও পিন

আমি বর্তমানে যে কোডটি ব্যবহার করছি তা এখানে। এখনও পর্যন্ত জিপিআইও কাজ করছে। এ লুক test_gpioফাংশন যা GPIO পিনের যা এলসিডি মডিউল উপর পিনের সাথে সংযুক্ত / পরিবর্তন দেখতে।

import time
import RPi.GPIO as GPIO

class LCD_GPIO(object):
    # Timing constants
    E_PULSE = 0.00005
    E_DELAY = 0.00005
    def __init__(self, RS, E, D4, D5, D6, D7):
        self.RS = RS
        self.E = E
        self.D4 = D4
        self.D5 = D5
        self.D6 = D6
        self.D7 = D7

        GPIO.setmode(GPIO.BCM)        # Use BCM GPIO numbers
        GPIO.setup(self.E, GPIO.OUT)  # E
        GPIO.setup(self.RS, GPIO.OUT) # RS
        GPIO.setup(self.D4, GPIO.OUT) # DB4
        GPIO.setup(self.D5, GPIO.OUT) # DB5
        GPIO.setup(self.D6, GPIO.OUT) # DB6
        GPIO.setup(self.D7, GPIO.OUT) # DB7

    def lcd_byte(self, data, mode):
        GPIO.output(self.RS, mode)

        for bits in (data>>4, data):
            GPIO.output(self.D4, bits&0x01)
            GPIO.output(self.D5, bits&0x02)
            GPIO.output(self.D6, bits&0x04)
            GPIO.output(self.D7, bits&0x08)

            # Toggle E
            time.sleep(self.E_DELAY)
            GPIO.output(self.E, True)
            time.sleep(self.E_PULSE)
            GPIO.output(self.E, False)
            time.sleep(self.E_DELAY)


class LCD_23017(object):
    pass

class LCD_4094(object):
    pass    

class HD47780(object):
    LCD_CHR = True
    LCD_CMD = False
    # Base addresses for lines on a 20x4 display
    LCD_BASE = 0x80, 0xC0, 0x94, 0xD4

    def __init__(self, driver, rows=2, width=16):
        self.rows = rows
        self.width = width
        self.driver = driver
        self.lcd_init()

    def lcd_init(self):
        # Initialise display
        lcd_byte = self.driver.lcd_byte
        for i in 0x33, 0x32, 0x28, 0x0C, 0x06, 0x01:
            lcd_byte(i, self.LCD_CMD)


    def lcd_string(self, message):
        # Send string to display
        lcd_byte = self.driver.lcd_byte
        lcd_byte(self.LCD_BASE[0], self.LCD_CMD)
        for i in bytearray(message.ljust(self.width)):
            lcd_byte(i, self.LCD_CHR)

def test_gpio():
    driver = LCD_GPIO(RS=7, E=8, D4=25, D5=24, D6=23, D7=18)
    lcd = HD47780(driver=driver, rows=4, width=20)
    lcd.lcd_string("Welcome gnibbler")


def main():
    test_gpio()

if __name__ == "__main__":
    main()

5

I²C

এটি হুক আপ মোটামুটি সোজা। আমি যে বিশেষ প্রদর্শনটি ব্যবহার করছি তার বিপরীতে পিন (ভি ) এর স্থলভাগের সাথে সংযুক্ত হওয়া দরকার। সাধারণত আপনি ভি এস এস এবং ভিসি সিসির মধ্যে ভোল্টেজ সেট করার জন্য এটি কোনও পোটেনিওমিটারের সাথে সংযুক্ত করবেন

আমার প্রদর্শনগুলিতে ব্যাকলাইট নেই, তাই আমি স্কিম্যাটিকের উপর বিশৃঙ্খলা হ্রাস করতে এগুলি সংযুক্ত করি নি। আপনার যদি ব্যাকলাইট থাকে তবে অবশ্যই অবশ্যই এটি স্বাভাবিক উপায়ে সংযুক্ত করা উচিত

আপনি MCP23017 এর প্রতিটি বন্দরের সমান্তরালে 3 টি পর্যন্ত ডিসপ্লেতে সংযোগ করতে পারেন। পার্থক্য হ'ল প্রতিটি প্রদর্শন থেকে সক্ষম পিনটি পৃথক পিনের সাথে সংযোগ স্থাপন করতে হবে (GPB1-GPB3)

এমসিপি 23017 এর মাধ্যমে রাস্পবেরি পাই গাড়ি চালনা HD44780

#!/usr/bin/env python
"""World Clock Demo
   It should be fairly obvious how to change this code to work for other timezones"""
import time

class LCD_23017(object):
    # Timing constants
    E_PULSE = 0.00005
    E_DELAY = 0.00005
    def __init__(self, bus, addr, port, rs, en):
        self.bus = bus
        self.addr = addr
        self.rs = rs
        self.en = en

        self.DIRECTION = 0x00 if port == 'A' else 0x01
        self.DATA = 0x12 if port == 'A' else 0x13

        self.bus.write_byte_data(addr, self.DIRECTION, 0x00)

    def lcd_byte(self, data, rs):
        rs <<= self.rs
        en = 1 << self.en
        for nybble in (data&0xf0, data<<4):
            self.bus.write_byte_data(self.addr, self.DATA, nybble | rs)
            time.sleep(self.E_DELAY)
            self.bus.write_byte_data(self.addr, self.DATA, nybble | rs | en)
            time.sleep(self.E_PULSE)
            self.bus.write_byte_data(self.addr, self.DATA, nybble | rs)


class HD47780(object):
    LCD_CHR = True
    LCD_CMD = False
    # Base addresses for lines on a 20x4 display
    LCD_BASE = 0x80, 0xC0, 0x94, 0xD4

    def __init__(self, driver, rows=2, width=16):
        self.rows = rows
        self.width = width
        self.driver = driver
        self.lcd_init()

    def lcd_init(self):
        # Initialise display
        lcd_byte = self.driver.lcd_byte
        for i in 0x33, 0x32, 0x28, 0x0C, 0x06, 0x01:
            lcd_byte(i, self.LCD_CMD)

    def lcd_string(self, message, line=0):
        # Send string to display
        lcd_byte = self.driver.lcd_byte
        lcd_byte(self.LCD_BASE[line], self.LCD_CMD)
        for i in bytearray(message.ljust(self.width)):
            lcd_byte(i, self.LCD_CHR)


def test_i2c():
    from datetime import datetime
    import pytz
    import smbus

    ## For Rev1.0 Raspberry Pi
    driver1 = LCD_23017(bus=smbus.SMBus(0), addr=0x27, port='B', rs=0, en=1)
    driver2 = LCD_23017(bus=smbus.SMBus(0), addr=0x27, port='B', rs=0, en=2)
    driver3 = LCD_23017(bus=smbus.SMBus(0), addr=0x27, port='B', rs=0, en=3)

    ## For Rev2.0 Raspberry Pi
    #driver1 = LCD_23017(bus=smbus.SMBus(1), addr=0x27, port='B', rs=0, en=1)
    #driver2 = LCD_23017(bus=smbus.SMBus(1), addr=0x27, port='B', rs=0, en=2)
    #driver3 = LCD_23017(bus=smbus.SMBus(1), addr=0x27, port='B', rs=0, en=3)


    lcd1 = HD47780(driver=driver1, rows=2, width=16)
    lcd2 = HD47780(driver=driver2, rows=2, width=16)
    lcd3 = HD47780(driver=driver3, rows=2, width=16)
    lcd1.lcd_string("    New York")
    lcd2.lcd_string("     London")
    lcd3.lcd_string("    Melbourne")
    new_york_tz = pytz.timezone("America/New_York")
    london_tz = pytz.timezone("Europe/London")
    melbourne_tz = pytz.timezone("Australia/Melbourne")
    while True:
        time.sleep(1-time.time()%1)  # Wait until the next second
        lcd1.lcd_string(datetime.now(new_york_tz).ctime()[3:], line=1)
        lcd2.lcd_string(datetime.now(london_tz).ctime()[3:], line=1)
        lcd3.lcd_string(datetime.now(melbourne_tz).ctime()[3:], line=1)

def main():
    test_i2c()

if __name__ == "__main__":
    main()

ধন্যবাদ। এটি কাজ করে !. এই দুর্দান্ত পোস্টটি আমাকে অনেক সাহায্য করে। নতুনদের জন্য কেবল আমার মতামত (আমার মতো)। আপনি যদি রাস্পবেরি রেভ 2 ব্যবহার করেন তবে কোডে বাস = এসএমবিএস.এসএমবাস (0) এর পরিবর্তে বাস = এসএমএস.এসএমবাস (1) ব্যবহার করুন। এই কমান্ডটি চালিয়ে অ্যাড্রেস নির্ধারণ করা যায়: "sudo i2cdetect -y 1" (রাস্পবেরি রেভ .1 এর জন্য 0 এর পরিবর্তে 0 ব্যবহার করুন)। আমার ক্ষেত্রে 0x27 এর পরিবর্তে 0x20 ছিল। অনেক ধন্যবাদ.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.