Raspberry Pi로 LED를 제어해 보자

T 코블러를 이용해서 GPIO를 제어해 보자.

먼저 T 코블러는 다음과 같이 생긴 녀석으로 Pi의 GPIO핀들을 쉽게 사용할 수 있기 때문에 사용된다. 다음 그림 들을 보고 T 코블러를 연결하자.

빨간 색선이 위와 같은 곳에 위치하도록!


브레드 보드에 연결!



T 코블러를 통해 나온 핀들은 다음과 같다



WiringPi 설치

GPIO를 다루기 위해 WiringPi를 설치하자
$ sudo apt-get update
$ sudo apt-get upgrade
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ git pull origin
$ ./build 

설치 후

$ gpio readall 

명령을 실행시키면 아래와 같은 출력이 나온다.

자신의 핀들의 상태를 알 수 있다.


LED 제어하기

아래와 같은 회로로 LED가 연결되어 있다고 해보자.

GPIO 23번을 통해 LED를 제어해보자.

$ gpio –g mode 23 output

먼저 23번 핀을 output 모드로 변경한 후

$ gpio –g write 23 1

23번 핀을 high로 만들면 LED가 켜진다!

$ gpio –g write 23 0

23번 핀을 low로 만들면 LED가 꺼진다.



스위치 읽기

아래와 같은 회로로 스위치가 연결되어 있다고 해보자.


GPIO 21번의 위에 연결된 저항은 핀 자체의 풀업 저항이기 때문에 우리가 회로상에 연결하는 저항은 아니다. 회로 구성을 보면 스위치가 눌려 있기 전에는 GPIO 21번 핀이 high이고, 스위치가 눌리면 GPIO 21번 핀이 low 가 된다는걸 알고 지나가자.


$ gpio –g mode 21 input

먼저 21번 핀을 input 모드로 변경한 후

$ gpio –g mode 21 up

21번 핀을 pull-ip 상태로 만든다.

$ gpio –g read 21

21번 핀의 값을 읽어 high일 때 1을 low일 때 0을 반환한다.



이제 다음 예제들을 bash script를 통해 풀어보자.

예제 1) 도미노

LED 4개와 스위치 1개를 이용해, 스위치를 눌렀을 때 LED가 도미노처럼 한개 씩만 켜지도록 한다. 처음엔 다 꺼져있는 상태이고, 마지막 LED가 켜지면 모두 끄고 끝이난다.



domino.sh

#!/bin/bash
gpio_arr=(5 6 13 19)
for i in "${gpio_arr[@]}"
do
   gpio -g mode $i output
   gpio -g write $i 0
done
gpio -g mode 21 input
gpio -g mode 21 up

while true; do
   sw=`gpio -g read 21`
   if [ $sw -eq 0 ]; then
      for i in "${gpio_arr[@]}"
      do
         gpio -g write $i 1
         sleep 0.5
         gpio -g write $i 0
      done
   fi
done



예제 2) 369 LED


스위치를 눌렀을 때 예제 1번과 비슷한 동작을 한다. 100번 움직이는데, 3,6,9가 들어간 번째의 움직임에서는 LED를 키지 않는다.



LED369.sh

#!/bin/bash
gpio_arr=(19 5 6 13)
for i in "${gpio_arr[@]}"
do
   gpio -g mode $i output
   gpio -g write $i 0
done
gpio -g mode 21 input
gpio -g mode 21 up

while true; do
   sw=`gpio -g read 21`
   if [ $sw -eq 0 ]; then
      for i in {1..100}
      do
         if [[ "$i" == *"3"* ]] || [[ "$i" == *"6"* ]] || [[ "$i" == *"9"* ]]; then
            sleep 0.5
         else
            gpio -g write ${gpio_arr[$(($i % 4))]} 1
            sleep 0.5
            gpio -g write ${gpio_arr[$(($i % 4))]} 0
         fi
      done
   fi
done



예제 2-2) 369 LED - python script

bash로 짯던 369 LED를 python으로 짜보자

python 에서는 GPIO를 RPI.GPIO모듈을 이용해서 제어한다. 그의 메소드는 아래와 같다


메소드
기능
GPIO.setmode(GPIO.BOARD)
GPIO.setmode(GPIO.BCM)
핀 번호를 라즈베리파이 보드(BOARD) 번호로 참조
BCM(Broadcom chip-specific pin numbers)모드
GPIO.setup(pin, GPIO.IN)
GPIO.setup(pin, GPIO.OUT)
핀을 입력으로 설정
핀을 출력으로 설정
GPIO.output(pin, GPIO.(True/HIGH))
GPIO.output(pin, GPIO.(Flase/LOW)
디지털 출력을 True/HIGH로 설정
디지털 출력을 Flase/LOW로 설정
GPIO.input(pin)
디지털 값을 읽음
GPIO.cleanup()
GPIO 모듈의 점유 리소스를 해제
GPIO.VERSION
RPi.GPIO 모듈의 버전값을 갖는 변수
이를 이용하여 369 LED를 python script로 구현하여 보자.


#!/usr/bin/python2

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP)
gpio_arr=[19,5,6,13]
for gpio in gpio_arr:
	GPIO.setup(gpio, GPIO.OUT)
	GPIO.output(gpio, False)

def my_callback(channel):
	for i in range(1,101):
		num = str(i)
		if '3' in num or '6' in num or '9' in num:
			sleep(0.5)
		else:
			GPIO.output(gpio_arr[i%4], True)
			sleep(0.5)
			GPIO.output(gpio_arr[i%4], False)
	 
GPIO.add_event_detect(21, GPIO.FALLING, callback=my_callback, bouncetime=300)
try:
	while True:
		sleep(1)
	
except KeyboardInterrupt:
	pass
GPIO.cleanup() 





+ Recent posts