본문 바로가기
Internet of Things/Raspberry pi

[GPIO] #1. GPIO & LED

by junnykim 2022. 2. 7.

대회 준비하면서 관심을 가지게 되었던 라즈베리파이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()

댓글