1602 LCD (HD44780 드라이버) 배경지식
예전 글에서 라즈베리파이 피코 보드에서 16×2 방식 LCD에 출력하는 자세한 과정을 소개했던 바가 있었는데,
https://blog.naver.com/mythee1/223188515992
그 당시 사용한 라이브러리와 코드들을 그대로 이용해서 ESP-32보드에서도 1602 LCD 사용이 가능하다.
참고로, 여기에 사용하는 LCD는 흔히 1602LCD라고 불리는 제품으로, 가로로 16자의 글자를 2줄씩 표시해 줄 수 있는 제품으로, 가격이 수천 원에 불과할 정도로 저렴하여 널리 사용되는 제품이다.
또한 통신 방식도 SPI 방식과 I2C 방식이 모두 있어서, 자신이 선호하는 방식을 선택할 수 있는 것 또한 장점이다.
한 가지 기억할 것은 국내에서 많이 찾아볼 수 있는 제품은 드라이버 칩셋으로 HD44780을 사용한 제품이라는 것이다.
이 LCD를 쉽게 사용하려면 HD44780 칩셋용 라이브러리 파일이 필요한데, 예전 글에서는 피코 보드용으로 Github에서 다음 라이브러리를 찾아 사용했었다. 동작 명령어가 많고 사용이 쉬운 장점 때문이었다.
이 라이브러리 파일들은 ESP32보드에서도 동일하게 사용할 수 있었다.
참고로, 해당 드라이버 파일 2개를 다음 링크로 첨부해 두었다.
ESP32 보드에 연결
내가 사용한 ESP 32 개발 보드에서 I2C 통신을 위한 SDA와 SCL은 각기 GP22와 GP21번 핀으로, 이들 핀을 LCD의 SCL과 SDA에 연결해 주어야 한다.
그리고 사용한 코드는 예전 글에서 사용한 코드를 그대로 이용하되, SDA와 SCL 핀 번호만 변경한 것이다.
코드의 내용을 간략히 소개하면, 다음과 같다.
1) 먼저, Library 사용을 선언해 준다.
import machine
from lcd_api import LcdApi –> 미리 저장해 둔 라이브러리
from pico_i2c_lcd import I2cLcd –> 미리 저장해 둔 라이브러리
2) I2C 버스용으로 사용할 2개의 핀을 선언하고, 이를 이용해 i2c 버스 사용을 선언해 준다.
sda=machine.Pin(21)
scl=machine.Pin(22)
i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000)
3) 액정의 크기와 주소를 선언해 준다.
I2C_ADDR = 0x27 –> 미리 확인해 둔 주소로 모르는 경우 i2c.scan( )으로 확인 가능
totalRows = 2 –> 2개의 행을 가짐을 선언
totalColumns = 16 –> 가로로 16자씩으로 구성됨을 선언
lcd = I2cLcd(i2c, I2C_ADDR, totalRows, totalColumns)
4) 명령어를 이용하여 출력하면 된다. 주요 lcd 명령어는 다음과 같은데, 각각의 기능은 이름에서 알 수 있다.
lcd.clear()
lcd.show_cursor()
lcd.hide_cursor()
lcd.blink_cursor_on()
lcd.blink_cursor_off()
lcd.display_on()
lcd.display_off()
lcd.backlight_off()
lcd.backlight_on()
lcd.move_to(행번호, 열 번호)
lcd.putchar(“글자”)
lcd.putstr(“문자열”)
최종적으로 사용한 코드는 다음과 같다.
import machine
import utime
from lcd_api import LcdApi
from pico_i2c_lcd import I2cLcd
utime.sleep(2)
sda=machine.Pin(21)
scl=machine.Pin(22)
i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000)
I2C_ADDR = 0x27
totalRows = 2
totalColumns = 16
lcd = I2cLcd(i2c, I2C_ADDR, totalRows, totalColumns)
lcd.putstr("Hello World!")
lcd.move_to(0,1)
lcd.putstr("I2C address"+str(i2c.scan()))
utime.sleep(1)
lcd.clear()
lcd.putstr("Let me show functions")
utime.sleep(1)
while True:
for i in range(9):
lcd.clear()
if i == 0:
print("cursor is on")
lcd.show_cursor()
lcd.putstr("Cursor is on")
if i == 1:
print("cursor is off")
lcd.hide_cursor()
lcd.putstr("Cursor is off")
if i == 2:
print("Turning blink cursor on")
lcd.blink_cursor_on()
lcd.putstr("Cursor blinking - ON")
if i == 3:
print("Turning blink cursor off")
lcd.blink_cursor_off()
lcd.putstr("Cursor blinking - OFF")
if i == 4:
print("Turning backlight off")
lcd.putstr("Next, backlight - off")
utime.sleep(1)
lcd.backlight_off()
lcd.clear()
lcd.putstr("Backlight off")
if i == 5:
print("Turning backlight on")
lcd.backlight_on()
lcd.putstr("Backlight on")
if i == 6:
lcd.putstr("Next, display - turn off.")
utime.sleep(1)
print("Turning display off")
lcd.display_off()
lcd.clear()
lcd.putstr("Display off")
if i == 7:
print("Turning display on")
lcd.display_on()
lcd.putstr("Display on")
if i == 8:
print("Move Cursor and Put a Character")
for j in range(16):
for k in range(2):
lcd.move_to(j,k)
lcd.putchar("a")
utime.sleep(0.3)
utime.sleep(1)
그런데 LCD의 전원 VCC와 GND를 ESP32 개발 보드의 VCC와 GND에 연결한 결과, 정상적으로 동작하기는 하는데, 다음과 같이 글자가 매우 흐려서 알아보기가 어려웠다.
때문에 LCD의 VCC에 연결한 전원만 ESP32 개발 보드의 VIN으로 변경한 결과,
다음과 같이 글자가 선명해졌고, 정상적으로 잘 동작하는 것을 볼 수가 있다.
위의 마이크로 파이썬 코드가 동작하는 모습은 다음과 같다.

