라즈베리파이

라즈베리 파이 GPIO 액세스

기하 2022. 6. 21. 03:24

https://www.electronicwings.com/raspberry-pi/raspberry-pi-gpio-access

 

Raspberry Pi GPIO Access | Raspberry Pi

GPIO (General Purpose Input Output) is pin on any integrated circuit. It is either input or output in behavior. Raspberry Pi has GPIO (General Purpose Input Output) pins through which it can talk I/O devices. They are used to control lights and motors, rea

www.electronicwings.com

 

소개

GPIO(범용 입력 출력) 핀은 입력 또는 출력으로 사용할 수 있으며 라즈베리 파이를 범용 I/O 장치와 연결할 수 있습니다.

  • Raspberry pi 3 모델 B는 보드에서 26개의 GPIO 핀을 꺼냈습니다.
  • Raspberry pi는 이러한 GPIO를 사용하여 많은 외부 I/O 장치를 제어할 수 있습니다.
  • 이 핀은 Pi와 외부 세계 간의 물리적 인터페이스입니다.
  • 외부 장치와 상호 작용해야 하는 필요에 따라 이 핀을 프로그래밍할 수 있습니다. 예를 들어 물리적 스위치의 상태를 읽으려면 사용 가능한 GPIO 핀을 입력으로 구성하고 스위치 상태를 읽어 결정을 내릴 수 있습니다. 또한 GPIO 핀을 출력으로 구성하여 LED ON/OFF를 제어할 수도 있습니다.
  • Raspberry Pi는 온보드 Wi-Fi 또는 Wi-Fi USB 어댑터를 사용하여 인터넷에 연결할 수 있습니다. Raspberry Pi가 인터넷에 연결되면 Raspberry Pi에 연결된 장치를 원격으로 제어할 수 있습니다.

Raspberry Pi 3의 GPIO 핀은 아래 그림과 같습니다.

Raspberry Pi 3 모델 B GPIO 핀

일부 GPIO 핀은 I2C, SPI, UART 등과 같은 대체 기능으로 다중화됩니다.

애플리케이션에 GPIO 핀을 사용할 수 있습니다.

핀 번호 매기기

출력 또는 입력으로 사용하려는 GPIO 핀을 정의해야 합니다. 그러나 Raspberry Pi에는 다음과 같이 핀 번호를 정의하는 두 가지 방법이 있습니다.

  • GPIO 번호 매기기
  • 물리적 번호 매기기

GPIO 번호 지정 에서 핀 번호는 Broadcom SoC(System on Chip)의 번호를 나타냅니다. 따라서 GPIO 핀을 사용하기 위해서는 항상 핀 매핑을 고려해야 합니다.

Physical Numbering 에서 핀 번호는 Raspberry Pi 보드에 있는 40핀 P1 헤더의 핀을 나타냅니다. 위의 물리적 번호는 P1 헤더의 핀 번호를 세어 GPIO로 할당할 수 있으므로 간단합니다.

그러나 여전히 위의 핀 구성 다이어그램을 고려하여 GPIO 핀과 VCC 및 GND를 알아야 합니다.

인터페이스 다이어그램

라즈베리파이를 이용한 LED 제어

예시

이제 라즈베리파이에 연결된 스위치를 이용하여 LED를 제어해보자. 여기서는 LED ON-OFF 제어를 위해 Python과 C(WiringPi)를 사용하고 있습니다.

Python을 사용하여 LED 제어

이제 Raspberry Pi에서 Python을 사용하여 LED를 켜고 끄겠습니다. 스위치는 LED ON-OFF를 제어하는 ​​데 사용됩니다.

파이썬 프로그램

import RPi.GPIO as GPIO		#import RPi.GPIO module

LED = 32			#pin no. as per BOARD, GPIO18 as per BCM
Switch_input = 29		#pin no. as per BOARD, GPIO27 as per BCM
GPIO.setwarnings(False) 	#disable warnings
GPIO.setmode(GPIO.BOARD)	#set pin numbering format
GPIO.setup(LED, GPIO.OUT)	#set GPIO as output
GPIO.setup(Switch_input, GPIO.IN, pull_up_down=GPIO.PUD_UP)

while True:
    if(GPIO.input(Switch_input)):
        GPIO.output(LED,GPIO.LOW)
    else:
        GPIO.output(LED,GPIO.HIGH)

사용된 기능:

RPi.GPIO

Python에서 Raspberry Pi GPIO 핀을 사용하려면 GPIO 를 제어하는 ​​클래스가 있는 RPi.GPIO 패키지를 가져와야 합니다.  RPi.GPIO Python 패키지는 이미 Raspbian OS에 설치되어 있습니다. 따라서 외부에 설치할 필요가 없습니다. Python을 사용하여 GPIO 액세스를 위한 함수를 사용하려면 프로그램에 라이브러리를 포함해야 합니다. 이것은 다음과 같이 주어진다.

             GPIO로 RPi.GPIO 가져오기

GPIO.setmode ( 핀 번호 매기기 시스템 )

이 기능은 GPIO 번호 지정 또는 물리적 번호 지정과 같은 핀 번호 지정 시스템을 정의하는 데 사용됩니다.

RiPi.GPIO에서 GPIO 번호 매기기는 BCM 으로 식별되는 반면 물리적 번호 매기기는 BOARD 로 식별됩니다.

핀 번호 매기기 시스템 = BOARD/BCM

예를 들어 P1 헤더의 핀 번호 40을 출력으로 구성해야 하는 GPIO 핀으로 사용하는 경우,

    비씨엠 에서는

            GPIO.setmode(GPIO.BCM)

            GPIO.setup(21, GPIO.OUT)

    BOARD에서는

            GPIO.setmode(GPIO.BOARD)

            GPIO.setup(40, GPIO.OUT)

GPIO.setup (채널, 방향, 초기값, 풀업/풀다운)

GPIO 핀의 방향을 입/출력으로 설정하는 기능입니다.

            채널 – 번호 매기기 시스템에 따른 GPIO 핀 번호.

            방향 – GPIO 핀의 방향을 입력 또는 출력으로 설정합니다.

            초기 값 – 초기 값을 제공할 수 있습니다.

            pull up/pull down – 필요한 경우 pull up 또는 pull down 활성화

몇 가지 예를 들면 다음과 같다.

  • GPIO를 출력으로
                 GPIO.setup (채널, GPIO.OUT)
  • 입력으로 GPIO

                 GPIO.setup (채널, GPIO.IN)

  • 초기 값이 있는 출력으로 GPIO

                 GPIO.setup (채널, GPIO.OUT, 초기=GPIO.HIGH)

  • 풀업 저항이 있는 입력으로 GPIO

                 GPIO.setup (채널, GPIO.IN, pull_up_down = GPIO.PUD_UP)

GPIO.output(채널, 상태)

이 기능은 GPIO 핀의 출력 상태를 설정하는 데 사용됩니다.

            채널 – 번호 매기기 시스템에 따른 GPIO 핀 번호.

            state – 출력 상태 즉 GPIO 핀의 HIGH 또는 LOW

            GPIO.출력(7, GPIO.HIGH)

GPIO.input(채널)

이 함수는 GPIO 핀의 값을 읽는 데 사용됩니다.

            GPIO.input(9)

C(WiringPi)를 이용한 제어 LED

C를 사용하여 Raspberry Pi GPIO에 액세스할 수 있습니다. 여기에서는 C를 사용하여 Raspberry Pi GPIO에 액세스하기 위해 WiringPi 라이브러리를 사용합니다.

WiringPi를 사용하여 LED 깜박임을 구현하기 전에 WiringPi 라이브러리 사용 방법을 참조할 수 있습니다 .

프로그램

#include <wiringPi.h>
#include <stdio.h>
int LED = 26;			/* GPIO26 as per wiringPi, GPIO12 as per BCM, pin no.32 */
int switch_input = 21;          /* GPIO21 as per WiringPi, GPIO5 as per BCM, pin no.29 */
int main(){
	wiringPiSetup();	/* initialize wiringPi setup */
	pinMode(LED,OUTPUT);	/* set GPIO as output */
	pullUpDnControl(switch_input, PUD_UP);
	while (1){
		if(digitalRead(switch_input))
			digitalWrite(LED,LOW);		/* write LOW on GPIO */
		else
			digitalWrite(LED, HIGH);	/* write HIGH on GPIO */
		
		}
	}