하드웨어 설계/라즈베리파이 및 아두이노

라즈베리파이 - 2*16 LCD 에 Hello World 띄워보자

가카리 2014. 6. 3. 11:17
반응형

 

위는 제가 사용하는 LCD입니다.


그리고 다음은 Pin 연결 방법입니다.


? LCD Pin #1 VSS 또는 그라운드 <-> GND

? LCD Pin #2 파워 서플라이<-> +5V

? LCD Pin #3 LCD 밝기<-> 가변저항 ( LCD Pin #3은 글자의 밝기를 조절하는 Pin입니다. 가변저항 없이 GND에 연결하니 최대 밝기로 글자가 나타납니다.)

? LCD Pin #4 레지스터 선택<-> GPIO Pin #25 wiringPi 6

? LCD Pin #5 리드라이트 컨트롤 버스<-> GND

? LCD Pin #6 인풋 레지스터에 쓰기가 가능하게 함<-> GPIO Pin #24 wiringPi 5

? LCD Pin #7 ~ #10 은 연결하지 않음 ( 8개 Line으로 제어할 때 사용되는 Pin 입니다.)

? LCD Pin # 데이터 11 <-> GPIO Pin #23 wiringPi 4

? LCD Pin # 데이터 12 <-> GPIO Pin #17 wiringPi 0

? LCD Pin # 데이터 13 <-> GPIO Pin #21(Rev B. : gpio 27) wiringPi 2

? LCD Pin # 데이터 14 <-> GPIO Pin #22 wiringPi 3

? LCD Pin # 백라이트 15 <-> +5V

? LCD Pin # 백라이트 그라운드 16 <-> GND

Register select (RS)핀 : 이 핀은 출력중인 data가 LCD 메모리에서 어디로 가야 할지를 결정한다. 2가지 장소가 있다. data register와 instruction(명령) register가 있다. data register는 화면으로 갈 정보를 담아두는 장소이고 instruction register는 LCD controller가 담에 할 일에 대한 지침,명령을 찾는 장소이다.

Read/Write (R/W) pin : 말 그대로 입력인지 출력인지를 결정하는 핀이다.

Enable pin : 문자그대로 레지스터에 쓰기가 가능하게 하는 핀이다.

 

8 data pins (D0 -D7) : 쓰기를 할때 레지스터에 입력하고 있는 것은 이 핀들의 상태 즉, HIGH or LOW이다. 읽기를 할때는  이 핀들의 값 즉(high,low) 이다.

 

Display constrast pin (Vo), power supply pins (+5V and Gnd) and LED Backlight (Bklt+ and BKlt-) :

LCD에 대한 전원 입력 핀이고, 대조도를 조절하는 핀 그리고 LED 백라이트를 키고 껴는 핀이다.



LCD 라이브러리 참조 https://projects.drogon.net/raspberry-pi/wiringpi/lcd-library/


LCD Library


Part of wiringPi is a library to allow access to parallel interface LCD displays (Those that use the popular Hitachi HD44780U or compatible controllers)



Two LCD displays connected to a Raspberry Pi


LCD Connected to Pi in 4-bit mode

LCD connected to Pi in 8-bit mode


LCD 8-bit 모드로 Pi로 연결 방법

  라이브러리는 사용하는 것이 간단하다. 하지만 LCD를 전선 연결 시키는 것은 약간 복잡할 수도 있다. 그리고 이것은 LCD 하나 말고 여러 개를 연결 시키는 것도 가능하다.

8비트 모드에서는 10개의 GPIO 핀이 필요하고 각 추가적인 LCD마다 단지 한 개의 핀이 더 필요하다. 그래서 17개의 GPIO 핀이면 최대 8개의 LCD를 연결 할  수 있다.

만약 4비트 인터페이스 모드를 사용한다면 12개의 LCD를 연결 할 수 있다. 근데 와이어링이 상당히 복잡해 질 것이다.

  LCD 디스플레이는 5V 또는 3.3V로 할 수 있다. 그러나 만약 우리가 5V 디스플레이를 사용하면 우리는 라즈베리파이의 데이터를 디스플레이에 출력 할 수 없다. 그래서 5V는 쓰지않는 것을 추천한다.

 그리고 항상 디스플레이에 있는 R/W 핀을 그라운드에 연결해야한다 이유는 디스플레이를 read-only로 하기 위해서이다.


LCD 라이브러리를 사용하기 위해서 다음의 include를 반드시 해야한다.


#include <wiringPi.h>

#include <lcd.h>


  첫 번째 wiringPi를 초기화 해야 한다. 그리고 LCD 라이브러리는 pinMode 함수를 부를 것이다. 그러나 이거는 만약에 이미 gpio 프로그램을 사용하고 wiringPiSetupSys() 메카니즘을 사용하면 pinMode 함수를 부를 필요가 없다.


? int  lcdInit (int rows, int cols, int bits, int rs, int strb,
        int d0, int d1, int d2, int d3, int d4, int d5, int d6, int d7) ;


  이것은 주요한 초기화 함수 이다. 어떤 LCD 함수를 사용하기 전에 반드시 호출해야한다.


  rows와 cols는 디스플레이의 행과 열의 수이다.(예를 들어 2, 16, 4, 20). Bits는 인터페이스의 비트수이다. (4 또는 8). rs와 strb는 디스플레이 RS pin 숫자와 strb는 Strobe (E) 핀의 숫자이다. (Strobe 는 E 라고도 함 data enable) . 라즈베리파이의 d0~d7은 data핀을 뜻한다. 4비트 모드를 쓰면 오직 d0~d3까지만 쓸 수 있다.

  핀 숫자는 GPIO 핀 숫자에 맞는 wiringPi 핀 숫자를 의미한다. 이것은 wiringPiSetup 함수를 사용해서 그렇다.

  리턴 값은 ‘handle’이고 추후에 모든 LCD 라이브러리에 관련된 call에 사용된다.  만약 -1이면 잘못 파라미터가 쓰여진 것이다.








4비트짜리 인터페이스를 쓰는 LCD의 예제이다.


fd = lcdInit (2, 16, 4,  11,10 , 0,1,2,3,0,0,0,0) ;


8비트짜리 인터페이스를 쓰는 LCD의 예제이다.

fd = lcdInit (2, 16, 8,  11,10 , 0,1,2,3,4,5,6,7) ;


? lcdHome (int handle)

? lcdClear (int handle)


These home the cursor and clear the screen respectively.

? lcdPosition (int handle, int x, int y)

Set the position of the cursor for subsequent text entry.

? lcdPutchar (int handle, uint8_t data)

? lcdPuts (int handle, char *string)

? lcdPrintf (int handle, char *message, …)



이러한 싱글 ASCII 캐릭터 출력, 스트링, 또는 포맷이 있는 스트링은 일반적인 printf 포맷팅 명령어를 사용할 수 있다.

지금까지 인풋 커서 조절과 스크롤링 디스플레이를 위한 데이터 래핑은 다루지 않았다. 이것은 디스플레이를 다루기 위해서 알아야할 것이다.


이것은 wiringPi안에 있는 예제를 참조하면 된다.


만약 2번째 3번째 디스플레이가 있으면 전선 연결시 E pin만 제외하고 병렬로 연결해야한다. 각각 디스플레이는 E핀은 다른 GPIO 핀에 연결해줘야한다.


LCD_test.c 파일


#include <stdio.h>
#include <wiringPi.h>
#include <lcd.h>


int main (void)
{
   
int disp1;

   
if (wiringPiSetup () == -1)
   
return 1;
 
    disp1 = lcdInit (
2, 16, 4, 6, 5, 4, 0, 2, 3, 0, 0, 0, 0);
    sleep (
1);

    lcdPosition (disp1,
0, 0);
    lcdPuts (disp1,
"Hello World");

    lcdPosition (disp1,
0, 1);
   
//lcdPuts (disp1, "01010101");
    lcdPrintf(disp1, "good job");
   


   
return 0 ;
}



라즈비안에서 컴파일 방법은 다음과 같다.


gcc -o LCD_test LCD_test.c -lwiringPi -lwiringPiDev



그리고 실행 방법


sudo ./LCD_test















잘 뜨죠?






전체 연결도입니다. 다음에는 늘솜 커넥터를 써야겠네요.







반응형