Hitachi HD44780 호환 LCD를 라즈베리파이3에 연결해서 문자 출력하는 테스트를 진행했습니다.


포스팅 작성시 다음 사이트를 참고하였습니다.

http://wiringpi.com/dev-lib/lcd-library




1. 라즈베리파이3와 캐릭터 LCD를 다음과 같이 연결합니다.


LCD  1번핀(VSS) --- RPI3  6번핀(ground), 가변저항의 왼쪽 다리

LCD  2번핀(VDD) --- RPI3  2번핀(+5V), 가변저항의 오른쪽 다리

LCD  3번핀(VE, VO) --- 가변저항의 가운데 다리

LCD  4번핀(RS) --- RPI3 26번핀(GPIO 7)

LCD  5번핀(RW) --- RPI3 14번핀(ground)

LCD  6번핀(EN,E) --- RPI3 24번핀(GPIO 8)


LCD 11번핀(D4) --- RPI3 11번핀(GPIO 17)

LCD 12번핀(D5) --- RPI3 12번핀(GPIO 18)

LCD 13번핀(D6) --- RPI3 13번핀(GPIO 27)

LCD 14번핀(D7) --- RPI3 15번핀(GPIO 22)

LCD 15번핀(LED+) --- RPI3   4번핀(+5V)

LCD 16번핀(LED-)  --- RPI3 34번핀(ground)


가변저항의 나머지 두다리는 각각 +5V와 ground에 연결합니다.






2. 기존에 설치된 패키지를 제거합니다.

1
2
$ sudo apt-get purge wiringpi
$ hash -r
cs



3. WiringPi 라이브리러를 다운로드 받아 설치합니다.

1
2
3
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build
cs



4. 예제 코드를 컴파일하여 실행합니다.

1
2
$ gcc lcd2.c -o lcd2 -lwiringPi -lwiringPiDev
$ ./lcd2
cs


캐릭터 LCD의 첫번째 줄에는 문자열이 스크롤되고 두번째 줄에는 현재시간이 계속 갱신됩니다.... 혹 안보이거나 흰색사각형들만 보인다면 가변저항을 조정해보세요..




본 포스팅에서 사용한 코드입니다.  git로 다운로드 받은 wiringPi 디렉토리내에 존재하는 examples 디렉토리내에  wiringPi 예제들이 존재합니다. 그 중에 lcd.c를 수정하여 사용하였습니다.


코드에서 사용한 RPI3 GPIO에 대응하는 wiringPi Pin은 아래 사이트에 나와있습니다.

https://projects.drogon.net/raspberry-pi/wiringpi/pins/


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
 
#include <unistd.h>
#include <string.h>
#include <time.h>
 
#include <wiringPi.h>
#include <lcd.h>
 
#ifndef TRUE
#  define       TRUE    (1==1)
#  define       FALSE   (1==2)
#endif
 
 
// Global lcd handle:
 
static int lcdHandle ;
 
 
/*
 * scrollMessage:
 *********************************************************************************
 */
 
static const char *message =
  "                    "
  "Wiring Pi by Gordon Henderson. HTTP://WIRINGPI.COM/"
  "                    " ;
 
void scrollMessage (int line, int width)
{
  char buf [32] ;
  static int position = 0 ;
  static int timer = 0 ;
 
  if (millis () < timer)
    return ;
 
  timer = millis () + 200 ;
 
  strncpy (buf, &message [position], width) ;
  buf [width] = 0 ;
  lcdPosition (lcdHandle, 0, line) ;
  lcdPuts     (lcdHandle, buf) ;
 
  if (++position == (strlen (message) - width))
    position = 0 ;
}
 
 
/*
 * waitForEnter:
 *********************************************************************************
 */
 
static void waitForEnter (void)
{
  printf ("Press ENTER to continue: ") ;
  (void)fgetc (stdin) ;
}
 
 
/*
 * The works
 *********************************************************************************
 */
 
int main (int argc, char *argv[])
{
  int i ;
  int lcd ;
  int bits, rows, cols ;
 
  struct tm *t ;
  time_t tim ;
 
  char buf [32] ;
 
  bits = 4;//GPIO 4개 핀 이용
  cols = 16;//1602
  rows = 2;
 
 
  wiringPiSetup () ;
 
  //RPI3 GPIO 7 --- LCD RS  pin --- wiringPi Pin 11
  //RPI3 GPIO 8 --- LCD  E  pin --- wiringPi Pin 10
  //RPI3 GPIO 17 --- LCD D4  pin --- wiringPi Pin 0
  //RPI3 GPIO 18 --- LCD D5  pin --- wiringPi Pin 1
  //RPI3 GPIO 27 --- LCD D6  pin --- wiringPi Pin 2
  //RPI3 GPIO 22 --- LCD D7  pin --- wiringPi Pin 3
  lcdHandle = lcdInit (rows, cols, 411100,1,2,3,0,0,0,0) ;
 
 
  if (lcdHandle < 0)
  {
    fprintf (stderr, "%s: lcdInit failed\n", argv [0]) ;
    return -1 ;
  }
 
 
  //간단히 2줄 출력하기
  //lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "Gordon Henderson") ;
  //lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, "  wiringpi.com  ") ;
 
  //waitForEnter () ;//사용자 입력대기
 
  lcdCursor      (lcdHandle, FALSE) ;
  lcdCursorBlink (lcdHandle, FALSE) ;
  lcdClear       (lcdHandle) ;
 
 
  //스크롤하는 메시지와 시계출력하기
  for (;;)
  {
    scrollMessage (0, cols) ;
 
    if (rows == 1)
      continue ;
 
    tim = time (NULL) ;
    t = localtime (&tim) ;
 
    sprintf (buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ;
 
    lcdPosition (lcdHandle, (cols - 8/ 21) ;
    lcdPuts     (lcdHandle, buf) ;
 
    if (rows == 2)
      continue ;
 
    sprintf (buf, "%02d/%02d/%04d", t->tm_mday, t->tm_mon + 1, t->tm_year+1900) ;
 
    lcdPosition (lcdHandle, (cols - 10/ 22) ;
    lcdPuts     (lcdHandle, buf) ;
 
  }
 
  return 0 ;
}
cs


포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기

  1. 공대생 2018.09.28 01:57

    안녕하세요 라즈베리파이를 이용하여 LCD에 시계를 만드는데 질문이 있어서 그러는데

    어디에 질문을 남기면 되나요??

  2. 스터디생 2018.11.07 18:00

    가변저항은 어떻게 연결하는 건가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.11.07 18:23 신고

      가변저항의 가운데 다리를 LCD의 3번핀에 연결하고

      나머지는 각각 +5V와 ground에 연결해주면 됩니다.
      LCD의 1번핀, 2번핀에 연결해서 같이 라즈베리파이 핀과 연결되도록 하면 됩니다.

  3. RaspberryPi 2019.12.06 19:15

    답댓글확인하였습니다. 감사합니다.

+ Recent posts