Linux,Unix,BSD

[RaspberryPi] command line에서 gpio 다루기

채윤아빠 2021. 2. 23. 22:10
728x90
반응형

"raspi-gpio" 를 이용한 GPIO 다루기

"raspi-gpio" 기능 살펴보기

CM283x GPIO 디버깅을 목적으로 개발된 프로그램으로 사용에 대한 책임은 사용자가 진다는 경고 문구가 무섭습니다.

$ raspi-gpio help
WARNING! raspi-gpio set writes directly to the GPIO control registers
ignoring whatever else may be using them (such as Linux drivers) -
it is designed as a debug tool, only use it if you know what you
are doing and at your own risk!

The raspi-gpio tool is designed to help hack / debug BCM283x GPIO.
Running raspi-gpio with the help argument prints this help.
raspi-gpio can get and print the state of a GPIO (or all GPIOs)
and can be used to set the function, pulls and value of a GPIO.
raspi-gpio must be run as root.
Use:
  raspi-gpio get [GPIO]
OR
  raspi-gpio set <GPIO> [options]
OR
  raspi-gpio funcs [GPIO]
OR
  raspi-gpio raw

GPIO is a comma-separated list of pin numbers or ranges (without spaces),
e.g. 4 or 18-21 or 7,9-11
Note that omitting [GPIO] from raspi-gpio get prints all GPIOs.
raspi-gpio funcs will dump all the possible GPIO alt funcions in CSV format
or if [GPIO] is specified the alternate funcs just for that specific GPIO.
Valid [options] for raspi-gpio set are:
  ip      set GPIO as input
  op      set GPIO as output
  a0-a5   set GPIO to alternate function alt0-alt5
  pu      set GPIO in-pad pull up
  pd      set GPIO pin-pad pull down
  pn      set GPIO pull none (no pull)
  dh      set GPIO to drive to high (1) level (only valid if set to be an output)
  dl      set GPIO to drive low (0) level (only valid if set to be an output)
Examples:
  raspi-gpio get              Prints state of all GPIOs one per line
  raspi-gpio get 20           Prints state of GPIO20
  raspi-gpio get 20,21        Prints state of GPIO20 and GPIO21
  raspi-gpio set 20 a5        Set GPIO20 to ALT5 function (GPCLK0)
  raspi-gpio set 20 pu        Enable GPIO20 ~50k in-pad pull up
  raspi-gpio set 20 pd        Enable GPIO20 ~50k in-pad pull down
  raspi-gpio set 20 op        Set GPIO20 to be an output
  raspi-gpio set 20 dl        Set GPIO20 to output low/zero (must already be set as an output)
  raspi-gpio set 20 ip pd     Set GPIO20 to input with pull down
  raspi-gpio set 35 a0 pu     Set GPIO35 to ALT0 function (SPI_CE1_N) with pull up
  raspi-gpio set 20 op pn dh  Set GPIO20 to ouput with no pull and driving high

"raspi-gpio"를 이용한 GPIO 다루기

"raspi-gpio"을 다룰 때 주의할 점은 핀 번호입니다.

참고자료에도 명시한 https://pinout.xyz/pinout/ 의 GPIO 번호를 참고하시면 됩니다.

$ raspi-gpio set 4 op dh ; sleep 1 ; raspi-gpio set 4 op dl

다음에 설명할 "gpio" 명령은 "pwm", "toggle" 및 "blink" 등 좀 더 다양한 기능이 있어 유용합니다.


"config.txt"에서 GPIO 다루기

라즈베리파이의 "config.txt" 에서도 GPIO를 다룰 수 있습니다. 부팅시 설정되는 것이므로 주로 mode 설정 및 GPIO 기본 출력을 변경할 때 이용합니다.

"config.txt" 파일 내에 "gpio" 지시자를 통하여 mode 등을 변경할 수 있습니다.

# Select Alt2 for GPIO pins 0 to 27 (for DPI24)
gpio=0-27=a2

# Set GPIO12 to be an output set to 1
gpio=12=op,dh

# Change the pull on (input) pins 18 and 20
gpio=18,20=pu

# Make pins 17 to 21 inputs
gpio=17-21=ip

"[...]" 섹션 설정을 따르기 때문에 model, serial number, EDID 등에 따라 설정을 달리할 수 있습니다.

위와 설정은 kernel에 직접적인 영향을 주지 않습니다. pinctrl 및 "raspi-gpio" 명령으로 모드 및 설정을 언제든지 변경할 수 있습니다.

또한 라즈베리파이에 전원이 공급되면 "config.txt"이 바로 적용되는 것이 아니라 일정 시간의 지연이 존재점을 유의하셔야 합니다.


WiringPi 를 이용한 GPIO 다루기

"WiringPi" 패키지 설치

WiringPi의 gpio 명령을 이용하면 command line에서 라즈베리파이의 GPIO를 마음대로 다룰 수 있습니다.

하지만, 최신 4B인 경우 gpio 명령에서 다음과 같이 4B를 정상적으로 인식하지 않을 수 있습니다.

$ gpio -v
gpio version: 2.50
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Unknown17, Revision: 01, Memory: 0MB, Maker: Sony 
  * Device tree is enabled.
  *--> Raspberry Pi 4 Model B Rev 1.1
  * This Raspberry Pi supports user-level GPIO access.

위와 같이 gpio에서 정상적으로 인식을 하지 못한다면, 다음과 같이 직접 소스를 다운로드 받아서 수동으로 설치해 주면 됩니다.

원래는 다음 저장소에서 소스를 배포하였으나, 현재는 접속이 안됩니다.

git clone git://git.drogon.net/wiringPi

github에 미러링된 저장소에서 소스를 다운로드 받아서 설치합니다.

git clone https://github.com/WiringPi/WiringPi

설치는 간단하게 "./build" 명령으로 끝납니다.

./build

설치된 gpio를 제거할 경우에는 다음과 같이 합니다.

./build uninstall

설치된 gpio 명령의 버전을 확인하면 다음과 같습니다.

$ gpio -v
gpio version: 2.60
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 4B, Revision: 01, Memory: 4096MB, Maker: Sony 
  * Device tree is enabled.
  *--> Raspberry Pi 4 Model B Rev 1.1
  * This Raspberry Pi supports user-level GPIO access.

gpio 다루기

gpio 명령으로 다음과 같이 전체 핀 정보를 확인할 수 있습니다.

$ gpio readall
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 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 |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | 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 4B--+---+------+---------+-----+-----+

"gpio readall" 했을 때 표시되는 핀 정보들 중에 "BCM"과 "wPi"의 번호가 서로 다른데, "BCM" SoC 칩의 물리적인 GPIO 번호이고, "wPi" 논리적인 핀의 번호입니다.

"BCM" GPIO 번호로 명령을 할 경우에는 "-g" 옵션을 추가해야만 합니다.

위 표에서 보듯이 기본적으로 GPIO의 Mode는 모두 "IN"입니다. 즉, GPIO로부터 HI (1), LOW (0) 값을 읽는 용도입니다.

LED 등을 제어하기 위하여 write를 하기 위해서는 다음과 같이 Mode를 "OUT"으로 변경해 주어야 합니다.

$ gpio -g mode 4 OUT # == gpio mode 7 OUT

위 명령은 "BCM" GPIO 4번 핀의 "Mode"를 "OUT"으로 설정합니다. "wPi" 번호로 하면 "gpio mode 7 OUT"로 동일한 설정을 합니다.

위 명령을 수행한 후에는 다음과 전체 GPIO의 상태는 다음과 같습니다.

$ gpio readall
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |  OUT | 0 |  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 |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | 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 4B--+---+------+---------+-----+-----+

GPIO 4의 "Mode"가 "OUT"으로 변경되었고, 이제부터는 "write" 및 "read"가 가능합니다.
GPIO 4에 LED를 연결하고, 다음과 같이 명령을 하면 LED가 켜집니다.

$ gpio -g write 4 1 ; sleep 500 ; gpio -g write 4 0

"toggle" 명령을 이용하면, GPIO의 상태를 반전시킵니다.

$ gpio -g toggle 4

"blink" 명령을 이용하면 약 0.5초마다 커졌다 켜졌다를 반복합니다.

$ gpio -g blink 4

"gpio" 명령을 이용하여 다룰 수 있는 명령은 다음과 같습니다.

gpio: Usage: gpio -v
       gpio -h
       gpio [-g|-1] ...
       gpio [-d] ...
       [-x extension:params] [[ -x ...]] ...
       gpio [-p] <read/write/wb> ...
       gpio <mode/read/write/aread/awritewb/pwm/pwmTone/clock> ...
       gpio <toggle/blink> <pin>
       gpio readall
       gpio unexportall/exports
       gpio export/edge/unexport ...
       gpio wfi <pin> <mode>
       gpio drive <group> <value>
       gpio pwm-bal/pwm-ms 
       gpio pwmr <range> 
       gpio pwmc <divider> 
       gpio load spi/i2c
       gpio unload spi/i2c
       gpio i2cd/i2cdetect
       gpio rbx/rbd
       gpio wb <value>
       gpio usbp high/low
       gpio gbr <channel>
       gpio gbw <channel> <value>

참고자료