ㅇㅅㅇ

Raspberry Pi GPIO 활용하기 (파이썬, Python) 본문

프로그래밍/라즈베리파이

Raspberry Pi GPIO 활용하기 (파이썬, Python)

Lugun 2017. 4. 16. 12:00

이번에는 전 포스트에서 했던 라즈베리파이를 활용한 GPIO를 파이썬으로 컨트롤 해주자.


만들어볼 것은 저번과 같이 led 4개가 있고 이 led들이 순차적으로 불이 들어온다. 


이 때 우리가 369게임을 하는 것 처럼 자신의 차례에 3, 6, 9,가 들어가면 불을 켜지않고 그냥 지나가게 하는 것이 우리가 만들 프로그램이다.


프로그램 이름은 domino369로 지었다.


파이썬에서 GPIO를 컨트롤하기 위해서는 RPi.GPIO 모듈이 필요한데 기본적으로 지원이 되니 따로 설치해 줄 필요는 없다.


크게 준비할 것도 없으니 바로 시작해보자.




1. 파이썬 코드 작성


제일 처음 해줘야 할 것은 RPi.GPIO와 time 모듈을 import 해주는 것이다.

1
2
import RPi.GPIO as GPIO
import time
cs

RPi.GPIO 모듈을 쓰기 편하게 GPIO라는 이름으로 import해주고 불빛이 켜지고 꺼지는 것에 약간의 딜레이를 주기 위해 time 모듈을 import해주었다.



1
2
3
4
5
6
7
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings (False)
GPIO.setup(21, GPIO.IN)   # 스위치를 인풋으로 설정
 
led = 23
mod1 = 0
mod2 = 0
cs

GPIO.setmode는 두가지 모드가 존재하는데 BOARD와 BCM이다.


BOARD는 라즈베리파이 보드 번호로 사용하는 모드이고, 


BCM(Broadcom chip-specific pin numbers)은 핀의 번호, 즉 gpio 21번 이라고 하면 21번이라는 번호를 사용하겠다는 뜻이다.


BCM모드를 사용하는 것이 좀 더 직관적이므로 나는 BCM모드를 사용하였다.


그 다음 코드인 GPIO.setwarnings (False)는 코드를 실행했을 때 setwarning false 오류가 뜨는 사람만 적어주면 된다.


여담으로 항상 코딩할 때 마다 느끼는 건데, 오류란 오류는 한 번 씩 다 걸려보는것 같다...


그 밑에 led, mod1, mod2는 각각 GPIO번호로 사용할 변수와 현재 차례에서 3, 6, 9 가 들어가있는지 판별하기 위한 변수이다.



1
2
3
for i in range(2327):
    GPIO.setup(i, GPIO.OUT)   # 사용할 핀 출력 설정
    GPIO.output(i, GPIO.LOW)  # 사용할 led 초기화
cs

나는 GPIO 23번에서 27번까지의 번호에 led를 연결해 놓았기 때문에 프로그램 시작과 동시에 초기화를 진행 시켜 주었다.


먼저 23번에서 27번의 핀을 setup(핀번호, GPIO.OUT)으로 출력으로 설정해주고,  output(핀번호, GPIO.LOW)를 통해 불을 다 꺼주었다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while(1):    
    if not GPIO.input(21):            # 스위치 입력받음
        for i in range(1101):        # 1에서 100까지
            
            mod1 = i%10                # 일의자리 값을 mod1에 저장
            mod2 = i//10            # 십의자리 값을 mod2에 저장
        
            if mod1==or mod1==or mod1==or mod2==or mod2==or mod2==9:
                time.sleep(0.3)
            else:
                GPIO.output(led, GPIO.HIGH)
                time.sleep(0.3)
                GPIO.output(led, GPIO.LOW)
                
            led += 1
            if(led == 27):
                led = 23
cs

메인이라고 볼 수 있는 코드이다.


일단 while을 통해서 무한루프를 돌려준 뒤 21번 핀에서 값을 읽는데 스위치가 눌리면(스위치를 누르면 0) for문으로 들어가 총 100회 반복한다.


반복하는 동안 i를 %와 //연산을 통해 각각 십의자리와 일의자리로 분리해준뒤,


각 자리에 3, 6, 9가 나오면 0.3초 sleep을 해주고 그것이 아니라면 해당 led를 킨뒤 0.3초후에 끈다.


그 후에는 led값을 1 증가 시키는데 현재 사용하는 핀 번호가, 23, 24 ,25 ,26 이므로 27까지 올라갔다면 다시 23으로 초기화 시켜주어, 100회가 될동안 지속적인 동작이 가능하도록 하였다.


여기까지 해서 domino369.py의 코드 작성을 완료하였다. 


아래는 코드 전체이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings (False)
GPIO.setup(21, GPIO.IN)
 
led = 23
mod1 = 0
mod2 = 0
 
for i in range(2327):
    GPIO.setup(i, GPIO.OUT)
    GPIO.output(i, GPIO.LOW)
 
while(1):    
    if not GPIO.input(21):            
        for i in range(1101):        
            
            mod1 = i%10                
            mod2 = i//10            
        
            if mod1==or mod1==or mod1==or mod2==or mod2==or mod2==9:
                time.sleep(0.3)
            else:
                GPIO.output(led, GPIO.HIGH)
                time.sleep(0.3)
                GPIO.output(led, GPIO.LOW)
                
            led += 1
            if(led == 27):
                led = 23
cs



2. 실행 결과


대략 40까지 진행된 것을 영상으로 찍어보았다. 




Comments