개발자/라즈베리파이4

라즈베리파이 i2c 사용하기 ssd1306 OLED와 함께

지구빵집 2020. 11. 18. 15:30
반응형

 

 

라즈베리파이를 다시 만나니 너무 반갑네요. 한 동안 사용하지 않아 기억도 가물가물한데 다시 찾으니 집 나간 아들이 돌아온 것처럼 씁쓸합니다. Raspberry Pi I/O Interface 보드를 설계 중이라 다시 구석구석 들여다보고 있는 중입니다. 일단 I2C 포트를 만들어야 해서 탐구합니다. 이전 보드에는 만들지 않았는데 왜 빼먹은 건지 ^^. 자 함께 공부해봅시다. 여기서 사용하는 보드는 Raspberry Pi 3 Model B입니다.

 

I2C는 Inter-Integrated Circuit의 약자이며 버스 형태로 임베디드 시스템에서 저속의 주변기기를 연결하기 위해서 사용되는 프로토콜입니다. 버스 형태여서 라인을 공유 가능하며 Address에 따라서 여러 개의 주변 장치와 통신이 가능합니다. SPI는 직렬연결인 것에 반하여 I2C는 병렬연결이라고 할 수 있습니다.

 

$gpio readall 명령으로 SDA/SCL을 찾아보면 피지컬 번호 3번핀(SDL1), 5번핀(SCL1)이 보입니다.

 

pi@raspberrypi:~ $ gpio readall
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5V      |     |     |
 |   3 |   9 |   SCL.1 | ALT0 | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT5 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT5 | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI | ALT0 | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO | ALT0 | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT  | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | OUT  | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
pi@raspberrypi:~ $

 

제일 먼저 할 일은 여러분이 사용하는 라즈베리파이 설정에서 i2c 포트를 사용 가능하게 만드는 일입니다. 아래를 따라서 합니다. 터미널에서 raspi-config Tool을 사용하여 설정합니다.

 

  • 1. $sudo raspi-config 명령으로 설정 화면을 엽니다.
  • 2. 화살표 키를 사용하여 5 Interfacing Options을 선택합니다.
  • 3. 아래 P5 I2C로 들어가서
  • 4. YES를 선택합니다. enable I2C입니다.
  • 5. 부팅 시 자동으로 커널 모듈을 로딩하기 위해 yes를 선택합니다.
  • 6. 빠져나옵니다.
  • 7. 필요하면 재부팅을 해주세요. 

아래 그림을 참고하셔서 사용하겠다고 설정해주시면 됩니다.

 

i2c 설정. 이미지 https://learn.sparkfun.com/tutorials/raspberry-pi-spi-and-i2c-tutorial/all

 

라즈베리파이는 한 개의 I2C 포트를 제공합니다. 그렇더라도 주소 지정 방식으로 여러 개의 i2c 부품을 연결할 수 있습니다. 일단 i2c 기본 툴을 설치해 보겠습니다. 설치 명령어는 아래 명령어로 합니다. 둘 중 위 명령어로 설치했고, 아래 명령어는 해보지 않았습니다.

 

$sudo apt-get install i2c-tools
sudo apt-get install -y i2c-tools

 

아래 설치 명령으로 터미털 출력 결과입니다. 중간에 검증을 물어오는데 반드시 대문자로 Y를 눌러 진행하십시오.

 

pi@raspberrypi:~ $ sudo apt-get install i2c-tools
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  gyp libc-ares-dev libc-ares2 libgssapi3-heimdal libheimntlm0-heimdal libjs-node-uuid
  libjs-underscore libssl-dev libssl-doc libv8-3.14-dev libv8-3.14.5 node-abbrev
  node-ansi node-ansi-color-table node-archy node-async node-block-stream
  node-combined-stream node-cookie-jar node-delayed-stream node-forever-agent
  node-form-data node-fstream node-fstream-ignore node-github-url-from-git node-glob
  node-graceful-fs node-gyp node-inherits node-ini node-json-stringify-safe node-lockfile
  node-lru-cache node-mime node-minimatch node-mkdirp node-mute-stream node-node-uuid
  node-nopt node-normalize-package-data node-npmlog node-once node-osenv node-qs
  node-read node-read-package-json node-request node-retry node-rimraf node-semver
  node-sha node-sigmund node-slide node-tar node-tunnel-agent node-underscore node-which
Use 'apt-get autoremove' to remove them.
Suggested packages:
  libi2c-dev python-smbus
The following NEW packages will be installed:
  i2c-tools
0 upgraded, 1 newly installed, 0 to remove and 389 not upgraded.
Need to get 51.3 kB of archives.
After this operation, 227 kB of additional disk space will be used.
WARNING: The following packages cannot be authenticated!
  i2c-tools
Install these packages without verification? [y/N] Y
Get:1 http://archive.raspberrypi.org/debian/ jessie/main i2c-tools armhf 3.1.1+svn-2 [51.3 kB]
Fetched 51.3 kB in 1s (45.7 kB/s)
Selecting previously unselected package i2c-tools.
(Reading database ... 132915 files and directories currently installed.)
Preparing to unpack .../i2c-tools_3.1.1+svn-2_armhf.deb ...
Unpacking i2c-tools (3.1.1+svn-2) ...
Processing triggers for man-db (2.7.0.2-5) ...
Setting up i2c-tools (3.1.1+svn-2) ...
/run/udev or .udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
pi@raspberrypi:~ $

 

터미널에서 다음 명령어로 $ls /dev/*i2c* 로 사용 가능한 i2c 포트를 살펴봅니다. 아래 실행 명령과 결과를 보시면 한 개 보입니다. /dev/i2c-1 입니다. 이것을 사용합니다.

 

pi@raspberrypi:~ $ ls /dev/*i2c*
/dev/i2c-1

$sudo i2cdetect -y 1 명령어로 연결된 i2c 주소를 볼 수 있습니다. 현재 아무것도 연결이 되지 않았으니 어떤 주소도 볼 수 나오지 않습니다. :)

 

pi@raspberrypi:~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi:~ $

 

위에서 보이는 주변장치 주소로 i2cget, i2cset and i2cdump 등 명령어를 사용할 수 있습니다. 

 

이제 저의 밥인 SSD1306 OLED를 연결하고 위 명령을 실행해보면 아래와 같이 3C 주소를 보여줍니다. 연결 도면은 아래 이미지를 참고하세요.

 

 

pi@raspberrypi:~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi:~ $ ^C

 

 아래 명령어를 순서대로 잘 실행하시면 됩니다. 실행하는 터미널 명령어 실행과 결과 사진을 첨부합니다.

소스코드를 다운로드합니다.

 

$ git clone https://github.com/iliapenev/ssd1306_i2c.git

 

다운로드 폴더로 이동합니다.

 

 

$ cd ssd1306_i2c/

 

$ls 명령을 사용하여 파일을 확인합니다.

 

 

pi@raspberrypi:~/ssd1306_i2c $ ls README demo.c oled_fonts.h ssd1306_i2c.c ssd1306_i2c.h

 

아래 명령을 사용하여 컴파일합니다. 주의할 점은 아래 명령을 카피해서 쓸 때 - 자는 다시 입력하세요.

 

 

$ gcc –o demo demo.c ssd1306_i2c.c -lwiringPi

 

실행하여 OLED 화면을 확인합니다.

 

 

$sudo ./demo 

 

아주 아름다운 화면이 나오면 성공입니다. 진심으로 축하합니다. 즐 개발하세요.

 

pi@raspberrypi:~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi:~ $ ^C
pi@raspberrypi:~ $ git clone https://github.com/iliapenev/ssd1306_i2c.git
Cloning into 'ssd1306_i2c'...
remote: Enumerating objects: 7, done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 7
Unpacking objects: 100% (7/7), done.
Checking connectivity... done.
pi@raspberrypi:~ $
pi@raspberrypi:~ $ cd ssd1306_i2c
pi@raspberrypi:~/ssd1306_i2c $ ls
demo.c  oled_fonts.h  README  ssd1306_i2c.c  ssd1306_i2c.h
pi@raspberrypi:~/ssd1306_i2c $ gcc –o demo demo.c ssd1306_i2c.c -lwiringPi
gcc: error: –o: No such file or directory
gcc: error: demo: No such file or directory
pi@raspberrypi:~/ssd1306_i2c $
pi@raspberrypi:~/ssd1306_i2c $ gcc -o demo demo.c ssd1306_i2c.c -lwiringPi
pi@raspberrypi:~/ssd1306_i2c $
pi@raspberrypi:~/ssd1306_i2c $ sudo ./demo

 

라즈베리파이 ssd1306 OLED Test

 

 

아~! 지겨운 방구석~~

 

참고

[라즈베리파이 3B+] I2C 사용하기(SSD1306 OLED 사용)

 

 

반응형