본문 바로가기
모두의 라즈베리파이/LCD-디스플레이

[라즈베리파이 마스터 되기] 초보자를 위한 파이썬 1602A LCD 활용법 완전 정복

by 로니킴 2024. 4. 10.


라즈베리 파이와 파이썬을 사용해 1602A LCD를 쉽게 제어하는 방법을 초보자도 이해할 수 있도록 설명합니다. 시작부터 동작까지, 모든 과정을 설명하여 누구나 라즈베리파이를 이용한 lcd 제어를 마스터할 수 있습니다.

 

 

목차

     

     

     


    초보자를 위한 파이썬 1602A LCD 활용법 완전 정복

    이 장에서는 라즈베리 파이와 파이썬을 활용하여 1602A LCD를 쉽게 제어하는 방법에 대해 초보자도 이해할 수 있도록 자세히 설명합니다. 시작부터 동작까지, 하드웨어 연결부터 소프트웨어 코딩까지 모든 과정을 단계별로 설명하여, 독자 여러분이 라즈베리파이를 이용한 LCD 제어 기술을 완전히 마스터할 수 있도록 돕습니다. 본 장의 목표는 독자가 라즈베리파이의 기본적인 사용법을 넘어, 실제 프로젝트에 적용할 수 있는 실용적인 기술을 습득하는 것입니다.

    초보자를 위한 파이썬 1602A LCD 활용법 완전 정복

     

     

     


    (1) 1602A I2C LCD 란?

    1602A LCD는 16열과 2행으로 구성된 문자 LCD 디스플레이입니다. I2C 인터페이스를 통해 라즈베리파이와 연결되어, 복잡한 배선 없이 데이터 통신이 가능합니다. 이 디스플레이는 날짜, 시간, 온도 등 다양한 정보를 사용자에게 표시하기 위한 프로젝트에 사용될 수 있습니다.

    1602A I2C LCD 란?

     

     


    (2) 1602A I2C LCD 동작 원리

    LCD는 I2C, 즉 Inter-Integrated Circuit 통신 프로토콜을 사용하여 데이터를 전송합니다. I2C 통신은 두 개의 핀, 즉 데이터를 전송하는 SDA와 클록 신호를 제공하는 SCL을 통해 이루어집니다. 이 방식을 통해 라즈베리파이는 단지 두 개의 핀만을 사용하여 LCD와 통신할 수 있으며, 이는 GPIO 핀의 효율적인 사용을 가능하게 합니다.

     

    [상세]

    라즈베리파이 4에서의 I2C 통신 방식은 두 개의 장치 간의 시리얼 데이터 전송을 가능하게 하는 프로토콜입니다. I2C는 "Inter-Integrated Circuit"의 약자로, 소수의 핀을 사용하여 여러 장치를 연결하고 통신할 수 있게 설계된 저속의 통신 방식입니다. 라즈베리파이에서 I2C 통신을 사용하는 것은 센서, 디스플레이, 저장 장치 등 다양한 외부 장치와의 데이터 교환을 위한 효율적인 방법을 제공합니다.

     

     

    I2C 통신의 기본 원리

     

    I2C 통신은 두 개의 신호 라인, SDA (Serial Data Line)와 SCL (Serial Clock Line)을 사용합니다. 

    • SDA 라인은 데이터 전송에 사용되며,
    • SCL 라인은 클록 신호를 전송하는 데 사용됩니다.

    이 두 라인은 모든 I2C 호환 장치에 연결되어 있으며, 각 장치는 고유한 주소를 가지고 있어 통신 중에 구별될 수 있습니다.

     

     

    라즈베리파이 4에서 I2C 활성화하기

     

    라즈베리파이 4에서 I2C를 사용하기 전에, 먼저 I2C 인터페이스를 활성화할 수 있는 있으며,  raspi-config 도구를 사용하여 쉽게 설정할 수 있습니다.

    1602A I2C LCD I2C 활성화하기

    1. 터미널을 열고 sudo raspi-config 명령어를 입력합니다.
    2. Interface Options > I2C를 선택하여 I2C 인터페이스를 활성화합니다.
    3. 변경 사항을 저장하고 재부팅합니다.

     

     


     

    I2C 장치 주소 찾기

     

    I2C 장치와 통신하기 위해서는 해당 장치의 I2C 주소를 알아야 합니다.

    1602A I2C LCD i2c 장치 주소 찾기 (0x27)

     

    라즈베리파이에서는 i2 cdetect 명령어를 사용하여 시스템에 연결된 모든 I2C 장치의 주소를 스캔하고 표시할 수 있습니다. 

    sudo apt-get install i2c-tools
    i2cdetect -y 1

     

    이 명령은 7비트 주소를 가진 모든 I2C 장치를 검색하고, 연결된 장치의 주소를 표시합니다.

     

     

     

    파이썬을 사용한 I2C 통신

     

    라즈베리파이에서 파이썬을 사용하여 I2C 장치와 통신하려면, smbus 라이브러리를 사용할 수 있습니다.

     

    1602A I2C LCD smbus 라이브러리 설치하기

     

     

     

     

     

     

    이 라이브러리를 사용하면 파이썬 스크립트 내에서 I2C 장치를 쉽게 제어할 수 있습니다.

    import smbus
    
    bus = smbus.SMBus(1) # 1은 I2C 버스 번호를 나타냅니다.
    address = 0xXX # 'XX'는 I2C 장치의 주소입니다.
    
    # 장치로부터 단일 바이트 읽기
    data = bus.read_byte(address)
    
    # 장치에 단일 바이트 쓰기
    bus.write_byte(address, 0x01)

     

     

    주의사항

     

    • I2C 통신 시 전기적 호환성을 고려해야 합니다. 라즈베리파이는 3.3V 로직 레벨을 사용하지만, 일부 I2C 장치는 5V에서 동작할 수 있습니다. 이 경우 레벨 쉬프터를 사용하여 두 장치 간의 호환성을 보장해야 합니다.
    • I2C 버스에 여러 장치를 연결할 때는 각 장치가 고유한 I2C 주소를 가지고 있어야 합니다. 동일한 주소를 가진 장치가 두 개 이상 있으면 데이터 충돌이 발생할 수 있습니다. 만약 여러 개의 같은 종류의 장치를 연결해야 하는 경우, 장치가 주소를 변경할 수 있는 기능을 지원하는지 확인하거나, 추가적인 하드웨어적인 솔루션을 고려해야 합니다.

     

    고급 I2C 통신 기능

     

    I2C 통신 프로토콜은 단순한 바이트 전송 이상의 기능을 제공합니다. 예를 들어, write_i2c_block_data와 read_i2c_block_data 함수를 사용하면 여러 바이트의 데이터를 한 번에 전송하거나 수신할 수 있습니다. 이 기능은 데이터 패킷을 전송할 때 매우 유용합니다.

     

    python Copy code # 여러 바이트 데이터 쓰기 data = [0x01, 0x02, 0x03] # 전송할 데이터 bus.write_i2c_block_data(address, 0x00, data) # 여러 바이트 데이터 읽기 data_received = bus.read_i2c_block_data(address, 0x00, 3) # 3 바이트 읽기

    # 여러 바이트 데이터 쓰기
    data = [0x01, 0x02, 0x03] # 전송할 데이터
    bus.write_i2c_block_data(address, 0x00, data)
    
    # 여러 바이트 데이터 읽기
    data_received = bus.read_i2c_block_data(address, 0x00, 3) # 3 바이트 읽기

     

     

    I2C 통신의 장점과 단점

     

    장점:

    • 간결한 연결: 모든 I2C 호환 장치는 단지 두 개의 신호 라인(SDA와 SCL)만 사용하여 통신할 수 있으므로, 회로 설계가 간단하고, 필요한 핀의 수가 적습니다.
    • 유연성: 한 I2C 버스에 여러 장치를 연결할 수 있으며, 각 장치는 고유한 주소를 통해 구별됩니다.
    • 확장성: I2C 통신은 장치 간에 복잡한 데이터 구조를 전송할 수 있는 기능을 포함하고 있어, 다양한 응용 프로그램에 적용할 수 있습니다.

     

    단점:

    • 속도 제한: I2C는 상대적으로 낮은 데이터 전송 속도를 가지고 있어, 고속 데이터 전송이 필요한 응용 프로그램에는 적합하지 않을 수 있습니다.
    • 거리 제한: I2C 통신은 비교적 짧은 거리에서만 안정적으로 동작합니다. 장치 간 거리가 멀어지면 데이터 전송 오류의 가능성이 증가합니다.
    • 주소 충돌: 사용 가능한 I2C 주소의 수가 제한되어 있어, 많은 수의 장치를 동일한 I2C 버스에 연결할 경우 주소가 부족할 수 있습니다.

     

    라즈베리파이 4에서의 I2C 통신은 다양한 외부 장치를 효과적으로 연결하고 제어할 수 있는 강력한 방법을 제공합니다. I2C는 그 구현의 단순성과 확장성 때문에 많은 프로젝트와 응용 프로그램에서 선호되는 통신 프로토콜입니다. 그러나 그 사용 시 고려해야 할 제한 사항들도 있으므로, 프로젝트의 요구 사항과 통신 환경을 잘 이해하고 적절한 설계 결정을 내리는 것이 중요합니다.

     


     

    (3) 1602A I2C LCD 구입하기

    1602A I2C LCD 모듈은 알리익스프레스, 네이버 쇼핑몰, 아마존 등 온라인 플랫폼에서 손쉽게 구입할 수 있습니다. 구입 시, 제품의 호환성, 품질, 그리고 배송 옵션을 꼼꼼히 확인하는 것이 중요합니다. 구입 후에는 제품에 포함된 문서를 참조하여 기본적인 사양과 기능을 확인하세요.

    1602A I2C LCD 모듈

     

     

    구입 주소 : 라즈베리파이 GPIO 확장 보드

    구입 주소 : 3.3v - 5 Level 컨버터

     

     

    1602A I2C LCD 모듈 구성


    라즈베리파이는 강력한 싱글 보드 컴퓨터로서, 다양한 확장보드와 함께 사용될 때 그 활용도가 대폭 증가합니다. 이 중 GP IO 센서 확장보드와 3.3볼트에서 5볼트로의 레벨 컨버터는 라즈베리파이 프로젝트의 범위를 넓혀주는 필수적인 도구입니다.

    • GP IO 센서 확장보드는 라즈베리파이의 기본적인 GP IO 핀 수를 확장해, 동시에 여러 센서나 장치를 연결할 수 있게 해줍니다. 이 보드는 모듈 지원을 통해 센서, 릴레이, 모터 등을 직접 연결할 수 있는 인터페이스를 제공하고, 일부는 전원 관리, 아날로그-디지털 변환 기능까지 내장하고 있어 복잡한 프로젝트를 간단하게 구현할 수 있도록 돕습니다. 예를 들어, 환경 모니터링 시스템을 구축할 때 여러 가지 환경 센서를 한 번에 연결하여 데이터를 수집하고 분석할 수 있습니다.
    • 3.3볼트에서 5볼트로의 레벨 컨버터는 라즈베리파이와 5볼트를 사용하는 장치 간의 전압 차이를 조절해줍니다. 라즈베리파이의 GP IO핀은 3.3볼트로 작동하지만 많은 전자 부품과 센서는 5볼트에서 동작하기 때문에, 이러한 컨버터없이는 라즈베리파이를 손상시킬 위험이 있습니다. 레벨 컨버터는 양방향으로 데이터 신호를 변환할 수 있어, 양쪽 장치 간의 안전하고 원활한 통신을 보장합니다. 예를 들어, 높은 전압을 요구하는 모터나 조명 시스템을 제어할 때 필수적입니다. 이 두 확장 도구를 사용하기 위해서는 몇 가지 주의해야 할 점이 있습니다. 먼저, 확장보드와 레벨 컨버터를 라즈베리파이에 연결할 때는 핀 배열을 정확하게 확인하고 연결해야 합니다. 잘못된 연결은 부품 손상을 초래할 수 있습니다. 또한, 전력 관리에 주의를 기울여야 하며, 모든 전자 부품을 다룰 때는 정전기로부터 보호하기 위한 조치를 취하는 것이 좋습니다.

     

    라즈베리파이와 이러한 확장보드를 사용함으로써, 개인의 취미 프로젝트부터 복잡한 산업 자동화 프로젝트에 이르기까지 다양한 분야에서 큰 성과를 낼 수 있습니다.

     


     

    (4) 1602A I2C LCD 하드웨어 연결하기

    라즈베리파이와 LCD 모듈을 연결하기 위해서는 먼저 GPIO 핀과 I2C 인터페이스를 정확히 연결해야 합니다. 라즈베리파이의 GPIO 핀 중 I2C 통신에 사용되는 SDA와 SCL 핀에 LCD 모듈의 해당 핀을 연결합니다. 이후, LCD 모듈의 VCC와 GND 핀을 라즈베리파이의 전원과 접지에 연결하여 전원 공급을 완료합니다.

     

    1602A I2C LCD 하드웨어 구성도

     

    정확한 핀 번호와 연결 방식은 라즈베리파이 및 LCD 모듈의 문서를 참조하세요.

    1602 I2C LCD 확장 GPIO 보드를 사용한 배선 연결

     

    라즈베리 파이 4와 1602A LCD 디스플레이를 I2C 인터페이스를 통해 연결하는 방법을 기반으로 연결도를 그리겠습니다.

    이 설정에서는 1602A LCD에 I2C 인터페이스 모듈이 장착되어 있다고 가정하며, 연결은 다음과 같습니다:

    이 구성은 라즈베리 파이 4의 I2C 통신을 사용하여 1602A LCD 디스플레이와 통신합니다. 라즈베리 파이의 GPIO 2와 GPIO 3 핀은 I2C 통신을 위한 표준 SDA(데이터)와 SCL(클럭) 핀입니다.

     

    1602A I2C LCD 하드웨어 연결도

     

    다음은 연결 방법에 대한 단계별 지침입니다:

     

    1. 센서 확장 보드와 라즈베리 파이 연결:

    • 라즈베리 파이의 GPIO 포트에 센서 확장 보드를 연결합니다.

    2. GPIO 핀 식별 및 준비:

    • 라즈베리 파이에서 I2C 통신에 사용되는 SCL과 SDA 핀을 식별합니다.
    • 라즈베리 파이에서 5V와 3.3V 전원 핀을 식별합니다.

    3. 레벨 컨버터와의 연결:

    • 레벨 컨버터의 LV(Low Voltage) 부분을 라즈베리 파이의 3.3V 핀에 연결합니다.
    • 레벨 컨버터의 HV(High Voltage) 부분을 라즈베리 파이의 5V 핀에 연결합니다.
    • 레벨 컨버터의 GND를 라즈베리 파이의 GND 핀에 연결합니다.

    4. 레벨 컨버터를 통한 I2C 연결:

    • 레벨 컨버터의 LV3 핀을 라즈베리 파이의 SDA 핀에 연결합니다.
    • 레벨 컨버터의 LV4 핀을 라즈베리 파이의 SCL 핀에 연결합니다.
    • 레벨 컨버터의 HV3 핀을 LCD1602의 SDA 핀에 연결합니다.
    • 레벨 컨버터의 HV4 핀을 LCD1602의 SCL 핀에 연결합니다.

    5. LCD 전원 연결:

    • LCD의 VCC 핀을 레벨 컨버터의 HV(High Voltage) 측 5V에 연결합니다.
    • LCD의 GND 핀을 레벨 컨버터의 GND에 연결합니다.

     

     


     

    (5) 1602A I2C LCD 소프트웨어 코딩하기

    하드웨어 연결이 완료되면, 파이썬을 사용하여 소프트웨어 코딩을 시작할 수 있습니다. 라이브러리를 설치하고, I2C 주소를 확인한 다음, 간단한 명령어로 텍스트 메시지를 LCD에 표시하는 코드를 작성합니다. 이 과정을 통해 기본적인 출력부터 복잡한 데이터 표시까지 다양한 프로그래밍 기술을 익힐 수 있습니다.

     

    1602A I2C LCD 소프트웨어 코딩하기

     

    파이썬 코드는 다음과 같습니다. 이 코드는 I2C를 통해 라즈베리 파이에서 1602A LCD를 제어하는 기본적인 예제입니다. 여기서 LCD_ADDR는 실제 사용하는 LCD 모듈의 I2C 주소로 변경해야 하며, 이 주소는 i2cdetect 명령어를 사용하여 확인할 수 있습니다. 주석에 설명된 대로 각 함수와 변수가 어떤 역할을 하는지 확인해 보시면 좋을 것입니다.

    import smbus
    import time
    
    class LCD1602:
        def __init__(self, pi_rev=2, i2c_addr=0x27, backlight=True):
            self.addr = i2c_addr  # I2C 주소
            self.width = 16  # 한 줄에 표시 가능한 최대 문자 수
            self.backlight = 0x08 if backlight else 0x00
            self.bus = smbus.SMBus(1 if pi_rev == 2 else 0)
            self.init_display()
    
        def init_display(self):
            """LCD 디스플레이 초기화"""
            for cmd in [0x33, 0x32, 0x06, 0x0C, 0x28, 0x01]:
                self.send(cmd, cmd_type='cmd')
            time.sleep(0.5)  # 초기화 후 잠시 대기
    
        def send(self, data, cmd_type='data'):
            """데이터 또는 명령어를 LCD로 전송"""
            mode = 0x00 if cmd_type == 'cmd' else 0x01
            high_bits, low_bits = mode | (data & 0xF0) | self.backlight, mode | ((data << 4) & 0xF0) | self.backlight
            for bits in [high_bits, low_bits]:
                self.bus.write_byte(self.addr, bits)
                self.toggle(bits)
    
        def toggle(self, bits):
            """Enable 비트 토글"""
            self.bus.write_byte(self.addr, bits | 0x04)
            time.sleep(0.001)
            self.bus.write_byte(self.addr, bits & ~0x04)
            time.sleep(0.001)
    
        def display(self, text, line=1):
            """텍스트를 지정된 줄에 표시"""
            line_addr = {1: 0x80, 2: 0xC0}.get(line, 0x80)
            self.send(line_addr, 'cmd')
            for char in text.ljust(self.width, " "):
                self.send(ord(char), 'data')
    
        def clear(self):
            """디스플레이 클리어"""
            self.send(0x01, 'cmd')
    
    if __name__ == '__main__':
        lcd = LCD1602()
        lcd.display("Hello World!", 1)
        lcd.display("steamedu123.com", 2)

     

    1602A LCD 디스플레이에 "Hello World!"와 "steamedu123.com"라는 문자열을 각각 첫 번째 줄과 두 번째 줄에 출력합니다. 이 코드는 기본적인 출력만을 다루고 있으므로, 더 복잡한 기능(예를 들어, 스크롤링 텍스트)을 구현하려면 추가적인 함수를 정의해야 할 수도 있습니다.

     

    https://www.youtube.com/watch?v=OfAYfp6Y7X4

     

     

    [주요 기능과 동작 방식]

    • 이 클래스는 I2C 통신을 통해 LCD1602 디스플레이와 상호작용합니다. I2C 주소, 백라이트 설정, 텍스트 출력 줄 등을 설정할 수 있습니다.
    • 초기화 과정에서는 LCD를 올바르게 사용하기 위한 여러 설정 명령을 전송합니다.텍스트 출력 시에는 문자열을 LCD의 너비에 맞게 조절하고, 각 문자를 개별적으로 LCD로 전송합니다. 이때 문자를 전송하기 전에 해당 줄의 시작 주소를 설정하는 명령을 먼저 보냅니다.
    • send 메서드는 LCD로 데이터나 명령어를 전송하는 핵심 기능을 담당합니다. 이 메서드는 먼저 데이터를 고/저 비트로 나누어 처리하고, 각 비트를 LCD로 전송한 후 Enable 신호를 토글 하여 LCD가 데이터를 처리하도록 합니다.
    • toggle 메서드는 LCD에 데이터나 명령어를 받았음을 알리기 위해 Enable 비트를 토글하는 과정을 담당합니다. 이 과정은 데이터 전송의 정확성을 보장하는 데 중요합니다.

     

     

    [함수 구성]

    • 클래스 정의와 초기화 : __init__ LCD1602 디스플레이를 사용하기 위한 초기 설정을 합니다. I2C 주소, 한 줄에 표시할 수 있는 문자의 최대 수, 백라이트의 켜짐/꺼짐 상태 등을 설정합니다. 또한, smbus.SMBus 객체를 생성하여 I2C 통신을 위한 준비를 합니다.
    • 디스플레이 초기화 : init_display(self) LCD 디스플레이를 초기화하는 과정입니다. 여러 초기화 명령을 순차적으로 LCD에 전송합니다. 이 과정을 통해 LCD는 데이터를 받을 준비가 됩니다.
    • 데이터 및 명령어 전송 : send(self, data, cmd_type) LCD로 데이터나 명령어를 전송하는 메서드입니다. cmd_type 인자를 통해 데이터 전송 모드와 명령 전송 모드를 구분합니다. 4비트 고정밀 데이터 전송 방식을 사용하여 데이터의 상위 4비트와 하위 4비트를 순차적으로 전송합니다.
    • Enable 비트 토글 : toggle(self, bits) 데이터나 명령어 전송 후, LCD가 이를 처리할 수 있도록 Enable 비트를 토글 합니다. 이 과정은 데이터가 정상적으로 수신됐음을 LCD에 알려줍니다.
    • 텍스트 출력 : display(self, text, line=1) 지정된 줄에 텍스트를 출력합니다. 첫 번째 줄과 두 번째 줄의 시작 주소는 각각 0x80과 0xC0입니다. 이 주소를 사용해 특정 줄에 문자열을 출력할 수 있도록 설정합니다. 문자열이 LCD의 너비보다 짧을 경우, 남은 공간은 공백으로 채워집니다. 각 문자를 하나씩 LCD로 전송하여 텍스트를 표시합니다.
    • 화면 지우기 : clear(self) LCD 화면을 지우는 명령입니다. 화면을 초기화하고 모든 출력을 제거합니다.
    • 메인 섹션에서는 LCD1602 클래스의 인스턴스를 생성하고, 첫 번째 줄에 "Hello World!", 두 번째 줄에 "steamedu123.com"을 출력하는 예제를 보여줍니다.

     

    이 예제 코드는 1602A LCD 디스플레이를 사용하여 라즈베리 파이에서 간단한 메시지를 출력하는 기본적인 방법을 보여줍니다. 특정 프로젝트의 요구 사항에 맞게 코드를 수정하고 확장할 수 있습니다. LCD 디스플레이를 사용하는 프로젝트에서는 텍스트 출력 외에도 다양한 사용자 인터페이스 요소를 구현할 수 있으며, 이를 통해 사용자와의 상호작용이나 상태 표시 등 다양한 기능을 제공할 수 있습니다.

     

     

     


     

    (6) 1602A I2C LCD 동작확인

    하드웨어 연결이 완료되면, 파이썬을 사용하여 소프트웨어 코딩을 시작할 수 있습니다. 라이브러리를 설치하고, I2C 주소를 확인한 다음, 간단한 명령어로 텍스트 메시지를 LCD에 표시하는 코드를 작성할 수 있습니다.

    1602A I2C LCD 동작확인

     

     


     

    (7) 마무리

    1602A I2C LCD를 연결하고, 간단한 코딩으로 실습할 수 있습니다. 이 장을 통해 라즈베리파이와 1602A LCD를 사용한 프로젝트 구현의 기초를 마련하였기를 바랍니다. 이번 실습을 통해 배운 지식을 바탕으로, 더 복잡한 프로젝트에 도전해 보시기 바랍니다. 예를 들어, 날씨 정보를 실시간으로 표시하거나, 사용자의 입력에 따라 다른 메시지를 표시하는 인터랙티브 한 시스템을 개발할 수 있습니다. 또한, 이 장에서 배운 기본 원리를 응용하여 다양한 센서와 연동하는 프로젝트를 시도해 보세요

     

     

     

     

     

     

    반응형


    댓글