Raspberry Pi로 LED를 제어해 보자
먼저 T 코블러는 다음과 같이 생긴 녀석으로 Pi의 GPIO핀들을 쉽게 사용할 수 있기 때문에 사용된다. 다음 그림 들을 보고 T 코블러를 연결하자.
빨간 색선이 위와 같은 곳에 위치하도록!
브레드 보드에 연결!
T 코블러를 통해 나온 핀들은 다음과 같다
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
메소드 | 기능 |
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 모듈의 버전값을 갖는 변수 |
#!/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()
'Raspberry' 카테고리의 다른 글
Korean Alexa with Raspberry pi (1) | 2017.05.09 |
---|---|
Pi Camera를 이용해 Timelapse 촬영하기 (0) | 2017.04.08 |
Raspberry 부팅시에 자동으로 파이썬 스크립트 실행하기 (0) | 2017.04.02 |
PiFaceCAD를 이용해 인터넷 라디오 스트리머 만들기 (0) | 2017.03.29 |
PiFaceCAD를 이용해 MusicPlayer 만들기 (0) | 2017.03.29 |