본문 바로가기

라즈베리파이 5

파이썬 3으로 라즈베리파이 5 GPIO를 제어하는 방법

반응형

파이썬 3으로 라즈베리파이 5 GPIO를 제어하는 방법 

 

gpiod 모듈의 기본 사항 

 

라즈베리 파이 5는 이제 막 출시되어 더 강력한 파이를 소개했지만, 몇 가지가 바뀌었는데 가장 눈에 띄는 것은 GPIO입니다.

 

여전히 동일한 40핀 GPIO가 있지만 새로운 RP1 사우스브리지 칩에 연결되면서 이제 조금 다르게 작동합니다. 이것이 왜 중요할까요? 그것은 모두 GPIO와 상호작용하는 코드를 어떻게 작성하느냐에 달려 있습니다. 과거에는 많은 프로젝트에서 RPi.GPIO를 선호했습니다. 이것은 Ben Croston의 커뮤니티 프로젝트였으며 여러 세대의 라즈베리파이에 잘 적용되었습니다. 하지만 라즈베리파이 5에서는 GPIO 핀의 메모리 매핑 방식 때문에 RPi.GPIO를 사용할 수 없게 되었습니다. 따라서 대안을 사용해야 하는데, 이 방법의 초점은 libgpiod입니다.

 

특히 python3-gpiod는 GPIO와 상호 작용하기 위한 순수 파이썬 모듈입니다. GPIO 핀을 사용하기 전에 명시적으로 설정해야 한다는 점에서 RPI.GPIO와 비슷하게 느껴집니다. 저희는 gpiod를 파이썬과 GPIO를 위한 중간 모듈로 보고 있습니다. 이 모듈을 처음 사용하신다면 라즈베리 파이 5에서도 작동하는 GPIO Zero를 사용하세요. GPIO Zero는 벤 너톨과 데이브 존스가 만든 것으로, GPIO를 크게 간소화합니다. 

 

gpiod를 사용하여 매우 간단한 두 가지 프로젝트를 만들어 보겠습니다. 첫 번째는 출력인 LED입니다. 두 번째는 입력으로, LED를 켜고 끄는 버튼입니다. 

 

Project 1: 출력으로 LED 블링크 

 

 

언어/프레임워크를 배울 때 첫 번째 목표는 "Hello World" 프로그램을 만드는 것입니다. 하드웨어, 해킹 및 전자공학에서 이것은 깜박이는 LED입니다. 

 

 

회로는 매우 간단합니다. 점퍼 와이어를 사용하여 LED의 긴 다리(양극)를 GPIO 17에 연결했습니다. 짧은 다리(음극)는 저항과 다른 점퍼 와이어를 통해 GND에 연결됩니다. 저항은 100~330옴(주황색-주황색-갈색-금색) 사이의 값이면 됩니다. 자세한 내용은 저항기 참조 가이드를 참조하세요.

 

1. 토니를 열고 두 개의 코드 모듈을 가져옵니다. 첫 번째 모듈은 GPIO를 제어하고 읽는 데 사용되는 gpiod입니다. 두 번째 모듈은 코드에 일시 중지를 추가하는 데 사용되는 time입니다. 

 

import gpiod

import time 

 

2. LED_PIN이라는 변수를 생성하고 그 안에 값 17을 저장합니다. 이 변수에는 모든 라즈베리파이 모델의 GPIO 핀에 대한 Broadcom 핀 참조가 포함됩니다. 브로드컴 핀 레퍼런스는 모든 라즈베리파이 문서에서 사용하는 표준입니다. 여기에서는 SoC에서 GPIO로의 브레이크아웃을 사용합니다. 우리에게는 논리적으로 보이지 않을 수 있지만 보드를 만드는 엔지니어에게는 핀이 올바르게 분리되어 있습니다. 

 

LED_PIN = 17 

 

3. 코드에 GPIO를 찾을 수 있는 위치를 알려줍니다. 원래 라즈베리 파이에는 메모리에 매핑된 단일 gpiomem 장치가 있었고, 이를 RPi.GPIO와 같은 파이썬 모듈과 함께 사용할 수 있었습니다. 이제 라즈베리파이 5와 RP1 칩을 통해 동적으로 분할된 장치를 갖게 되었으며, GPIO는 gpiomem4에 있습니다. 

 

전체 코드는 아래와 같습니다.

 

import gpiod
import time
LED_PIN = 17
chip = gpiod.Chip('gpiochip4')
led_line = chip.get_line(LED_PIN)
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
try:
   while True:
       led_line.set_value(1)
       time.sleep(1)
       led_line.set_value(0)
       time.sleep(1)
finally:
   led_line.release()

 

코드 설명입니다.

 

1. 토니를 열고 두 개의 코드 모듈을 가져옵니다. 첫 번째 모듈은 GPIO를 제어하고 읽는 데 사용되는 gpiod입니다. 두 번째 모듈은 코드에 일시 중지를 추가하는 데 사용되는 time입니다.

2. LED_PIN이라는 변수를 생성하고 그 안에 값 17을 저장합니다. 이 변수에는 모든 라즈베리파이 모델의 GPIO 핀에 대한 Broadcom 핀 참조가 포함됩니다. 브로드컴 핀 레퍼런스는 모든 라즈베리파이 문서에서 사용하는 표준입니다. 여기에서는 SoC에서 GPIO로의 브레이크아웃을 사용합니다. 우리에게는 논리적으로 보이지 않을 수 있지만 보드를 만드는 엔지니어에게는 핀이 올바르게 분리되어 있습니다. LED_PIN = 17

3. 코드에 GPIO를 찾을 수 있는 위치를 알려줍니다. 원래 라즈베리 파이에는 메모리에 매핑된 단일 gpiomem 장치가 있었으며, 이를 RPi.GPIO와 같은 파이썬 모듈과 함께 사용할 수 있었습니다. 이제 라즈베리파이 5와 RP1 칩을 사용하면 동적으로 분할된 장치를 사용할 수 있으며, GPIO는 gpiomem4에 있습니다. chip = gpiod.Chip('gpiochip4')

4. led_line이라는 변수를 생성하고 LED GPIO 핀에 대한 참조를 저장합니다. gpiod 모듈은 라인을 사용하여 GPIO 핀을 참조합니다. led_line = chip.get_line(LED_PIN)

5. LED를 출력으로 설정합니다. LED에 전류가 흐르길 원합니다. led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)

6. 코드의 본문을 try와 while으로 감싸고 loop.Try는 코드를 실행하려고 시도하는 예외 처리기의 일부로, 예외를 처리하고 종료할 때 코드의 일부를 실행할 수 있습니다. try: while True:

7. LED를 켜고 1초간 기다립니다. 이렇게 하면 LED가 1초 동안 강제로 켜집니다. led_line.set_value(1) time.sleep(1)

8. LED를 끈 다음 1초 동안 기다립니다. 절전 모드에서는 LED가 1초 동안 꺼진 상태로 유지됩니다. led_line.set_value(0) time.sleep(1) # 1초 동안 절전 모드

9. 코드가 종료될 때 GPIO를 정리하는 코드 섹션을 추가합니다. GPIO Zero에서는 이 작업을 수행하지 않아도 되지만, gpiod(및 이전 RPi.GPIO)는 종료하기 전에 정리해야 합니다. 마지막으로: led_line.release()

10. 코드를 blinky.py로 저장하고 실행을 클릭하여 시작합니다. GPIO 17의 LED가 1초마다 깜박이고 꺼집니다. 종료하려면 CTRL + C를 누르거나 중지를 클릭합니다.

 

 

 

프로젝트 2: 입력, 사용자 입력에 반응하기 

 

 

"Hello World"에 이어 다음 목표는 입력을 만드는 것입니다. 이 예제에서는 버튼 하나를 만들고 한쪽은 버튼 GPIO 핀에 연결하고 다른 쪽은 3V3에 연결합니다. 버튼 GPIO 핀의 기본 상태는 전원 없음(0, False, Low)이지만 버튼을 누르면 3V3 핀을 버튼 GPIO 핀에 연결하고 상태를 전원(1, True, High)으로 변경합니다. 코드는 이 상태 변화를 찾아서 그에 따라 반응합니다. 버튼과 점퍼 와이어 두 개만 있으면 됩니다. 

 

전체 코드는 아래와 같습니다. 코드 설명은 코드 표시 후 아래에 이어집니다.

 

import gpiod
LED_PIN = 17
BUTTON_PIN = 27
chip = gpiod.Chip('gpiochip4')
led_line = chip.get_line(LED_PIN)
button_line = chip.get_line(BUTTON_PIN)
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
button_line.request(consumer="Button", type=gpiod.LINE_REQ_DIR_IN)
try:
   while True:
       button_state = button_line.get_value()
       if button_state == 1:
           led_line.set_value(1)
       else:
           led_line.set_value(0)
finally:
   led_line.release()
button_line.release()

 

코드 설명입니다.

 

1. 토니를 열고 두 개의 코드 모듈을 가져옵니다. 첫 번째 모듈은 GPIO를 제어하고 읽는 데 사용되는 gpiod입니다. 두 번째 모듈은 코드에 일시 정지를 추가하는 데 사용되는 time입니다. import gpiod import time

2. LED_PIN이라는 변수를 생성하고 그 안에 값 17을 저장합니다. 이 변수에는 모든 라즈베리파이 모델의 GPIO 핀에 대한 Broadcom 핀 참조가 포함됩니다. 브로드컴 핀 레퍼런스는 모든 라즈베리파이 문서에서 사용하는 표준입니다. 여기에서는 SoC에서 GPIO로의 브레이크아웃을 사용합니다. 우리에게는 논리적으로 보이지 않을 수 있지만 보드를 만드는 엔지니어에게는 핀이 올바르게 분리되어 있습니다. LED_PIN = 17

3. BUTTON_PIN이라는 변수를 생성하고 그 안에 값 27을 저장합니다. GPIO 27은 GPIO 17 바로 옆에 있습니다. BUTTON_PIN = 27

4. 코드에 GPIO를 찾을 수 있는 위치를 알려줍니다. 원래 라즈베리 파이에는 메모리에 매핑된 단일 gpiomem 장치가 있었으며, 이를 RPi.GPIO와 같은 파이썬 모듈과 함께 사용할 수 있었습니다. 이제 라즈베리파이 5와 RP1 칩을 사용하면 동적으로 분할된 장치를 갖게 되며, GPIO는 gpiomem4에 있습니다. chip = gpiod.Chip('gpiochip4')

5. led_line이라는 변수를 생성하고 LED GPIO 핀에 대한 참조를 저장합니다. gpiod 모듈은 선을 사용하여 GPIO 핀을 참조합니다. led_line = chip.get_line(LED_PIN)

6. button_line이라는 변수를 생성하고 버튼 GPIO 핀에 대한 참조를 저장합니다. button_line = chip.get_line(BUTTON_PIN)

7. LED를 출력으로 설정합니다. LED에 전류가 흐르도록 합니다. led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)

8. 버튼을 입력으로 설정합니다. button_line.request(consumer="Button", type=gpiod.LINE_REQ_DIR_IN)

9. 코드 본문을 try와 while으로 감싸고 loop.Try는 코드 실행을 시도하는 예외 처리기의 일부로, 예외를 처리하고 종료 시 코드 섹션을 실행할 수 있습니다. try: while True:

10. 버튼 GPIO 핀의 현재 상태를 가져와 button_state라는 변수에 저장합니다. button_state = button_line.get_value()

11. if 조건문을 사용하여 버튼이 눌렸는지 확인합니다. 그렇다면 LED를 켭니다. Button GPIO 핀의 기본 상태는 낮음(0, False)입니다. 하지만 버튼을 누르면 라즈베리파이 5의 3V 핀을 Button GPIO 핀에 연결합니다. 그러면 버튼 핀이 높게(1, True) 당겨집니다. 이 상태 변화가 코드의 트리거가 됩니다. if button_state == 1: # 버튼이 눌렸음 led_line.set_value(1) # LED를 켭니다

12. 버튼을 누르지 않았을 때 LED를 끄려면 else 조건을 사용합니다. else: led_line.set_value(0) # LED를 끕니다

13. 코드가 종료될 때 GPIO를 정리하는 코드 섹션을 추가합니다. GPIO Zero에서는 이 작업을 수행하지 않아도 되지만, gpiod(및 이전 RPi.GPIO)에서는 종료하기 전에 정리해야 합니다. 마지막으로:
led_line.release()
button_line.release()

14. 코드를 button-press.py로 저장하고 실행을 클릭하여 시작합니다. 버튼을 누르면 LED가 켜지고 놓으면 꺼집니다. 종료하려면 CTRL + C를 누르거나 중지를 클릭합니다.

 

 

참고 문서

How to Control the Raspberry Pi 5 GPIO with Python 3 

 

다른 내용인데 참고할 내용이라 여기에 첨부

Multiple DHD22 IoT Weather Station Dashboard

display dynamic number of DHT22 sensors 

Code 

auto-start this project when your Raspberry Pi boots or starts 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^