대회 준비하면서 관심을 가지게 되었던 라즈베리파이4에 대해서 마저 정리해보자!
교수님 수업자료 기반이고, 제가 추가 할 코멘트는 따로 추가했습니다.
1. GPIO - General Purpose Input and Output
- 범용 입/출력 장치(단자)를 지칭하는 용어
- 일반적으로 AP(Application Processor)는 물리적인 형태를 가지는 IC로 구현될 때 제한된 개수의 핀(신호를 주고 받는 통로)를 가짐
- AP 내부 기능은 물리적인 핀의 숫자보다 많음
- IC에 내장된 기눙과 입/출력 동작을 설정하고, 각 동작의 세부 상태를 설정하는 용도로 사용됨
- AP의 물리적인 특정핀의 동작 상태를 입력 또는 출력으로 설정
- 입력 상태와 출력 상태를 동시에 가질 수 없음
- 한 순간에는 하나의 동작 상태만을 가짐
1) 핀 동작 설정 : 신호의 출력 또는 입력
GPIO는 프로그래머가 사용하는 MCU의 물리적인 핀에 대해 입력 또는 출력 상태를 지정
2) 설정된 입력/출력에 대한 MCU에 내장된 기능 선택
MCU에 따라 입/출력과 기능 선택을 같은 단계에서 지정할 수 있음
- 자주쓰는 개념 정리
Pin numbering - 하드웨어적 결선을 따른다.
import RPi.GPIO as GPIO
or
try:
import RPi.GPIO as GPIO
except
RuntimeError: print("Error importing RPi.GPIO! This is probably because you need superuser privileges. You can achieve this by using 'sudo' to run your script")
결선 넘버링 확인 하는 방법 : mode = GPIO.getmode()
Warnings
RPI.GPIO에서 핀이 기본값(입력)이 아닌 다른 값으로 구성되었음을 감지하면 스크립트를 구성하려고 할 때 경고가 표시된다.
경고를 비활성화 하는 방법 : GPIO.setwarnings(False)
Setup up a channel
입력 또는 출력으로 사용하는 모든 채널을 설정해야 한다.
채널을 입력으로 구성하는 방법 : GPIO.setup(channel, GPIO.IN),
channel은 지정한 번호 체계(BOAD 또는 BCM)를 기준으로 한 채널 번호
초기값 설정
GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
Input/Outout
GPIO 핀 read : GPIO.input(channel) → return 0/ GPIO.LOW / False or 1 / GPIO.HIGH / True
GPIO 핀 ouput : GPIO.output(channel, state) → State can be 0 / GPIO.LOW / False or
1 / GPIO.HIGH / True
Clean up
프로그램을 마칠 때 사용한 리소스를 정리하는 것이 좋다.
사용 :
GPIO.cleanup()
GPIO.cleanup(channel)
GPIO.cleanup( (channel1, channel2) )
GPIO.cleanup( [channel1, channel2] )
2. GPIO-LED 제어
1) LED 구동 제어 프로그램의 구성
① LED의 패당 핀을 사용하도록 설정
② LED의 해당 핀을 출력으로 설정
③ 프로그램의 제어 구문에서 LED의 ON, OFF 동작 (time 함수 많이 사용)
2) 제어 프로그램의 요구 사항
- 각 제어 단위는 재사용 할 수 있도록 함수로 구현
: 매개 변수 검사하여 잘못된 지정이 있을 경우 컴파일 메시지 출력
- LED ON/OFF 함수 구현 및 적절한 시간 지연 함수 구현
: 효율성, S/W engineering 언급 사항, 코드 재사용, 안정성 고려
3) 구현한 코드 상호 비교 발표
Code - Led1
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
led_pin1 = 12
GPIO.setup(led_pin1, GPIO.OUT)
try:
while True:
GPIO.output(led_pin1, False)
time.sleep(1)
GPIO.output(led_pin1, True)
time.sleep(1)
finally:
print("Cleaning up")
GPIO.cleanup()
Code - Led2
import RPi.GPIO as GPIO
import time
led_pin1=12
GPIO.setmode(GPIO.BCM)
GPIO.setup(led_pin1, GPIO.OUT) ## GPIO 12 ouput
def blink():
print("Starting blinking fever!")
iteracion = 0
while iteracion < 30: ## Blink for 30'
GPIO.output(led_pin1, True) ## On 12
time.sleep(1) ## Wait one second
GPIO.output(led_pin1, False) ## Off 12
time.sleep(1) ## Wait one second
iteracion = iteracion + 2 ## Add 2 second, one for each blink
print("I'm done!")
GPIO.cleanup() ## Clean the GPIO
blink() ## Call the function
PWM - Pulse Width Modulation
디지털 수단으로 아날로그 결과를 얻는 기술. 디지털 제어는 켜짐과 꺼짐 사이에서 전환되는 신호인 사각파를 만드는 데 사용된다.
Code - Led Fadding Effect1
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
led_pin1 = 12
GPIO.setup(led_pin1,GPIO.OUT)
p = GPIO.PWM(led_pin1, 50) # create an object p for PWM on port 14 at 50 Hertz p.start(0)
try:
while 1:
for dc in range(0, 101, 5):
p.ChangeDutyCycle(dc) # change the duty cycle to dc% (예를 들면 90이면 90%)
time.sleep(0.1)
for dc in range(100, -1, -5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
except KeyboardInterrupt:
pass
p.stop()
GPIO.cleanup()
Code - Led Fadding Effect2
blink 횟수를 입력하면, 횟수가 증가할수록 LED on 시간이 증가
# Duration of LED lighting increased as time goes.
import RPi.GPIO as GPIO
import time led_pin1=12
GPIO.setmode(GPIO.BCM)
GPIO.setup(led_pin1, GPIO.OUT) ## GPIO 12 ouput
def blink(Num):
for i in range(1,Num):
GPIO.output(led_pin1, GPIO.HIGH) ## On 12
time.sleep(i)
GPIO.output(led_pin1, GPIO.LOW) ## off 12
time.sleep(1)
In = input("Give times you want:")
blink(In)
print ("Program is terminated..!!")
GPIO.cleanup()
댓글