일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 소인수 구하기
- Raspberry Pi
- API
- 라즈베리파이
- 최소공배수
- #c언어
- 배수 더하기
- C언어
- #소수판별
- 피보나치
- palindrome
- #프로젝트 오일러
- PiFaceCAD
- project euler
- 대칭수
- open weather map
- lirc
- mp3
- Radio
- 프로젝트 오일러
- #Project Euler
- Today
- Total
ㅇㅅㅇ
Raspberry Pi GPIO 활용하기 (쉘 스크립트) 본문
라즈베리파이의 GPIO를 이용하여 LED와 Switch를 컨트롤 해보자
1. GPIO사용 준비하기
GPIO를 사용하기위해 먼저 WiringPi를 인스톨 해주어야 한다.
$ sudo apt-get update
$ sudo apt-get upgrade
$ git clone git://git.drogen.net/wiringPi
$ cd wiringPi
$ git pull origin
$ ./build
위의 과정을 따라하면서 별다른 에러가 발생하지 않았다면 성공한 것이다.
현재 GPIO가 어떤 상태인지 확인하기 위해 아래의 명령어를 쳐보자
$ gpio readall
이런식으로 터미널에 표현이 된다. 우리가 확인할 부분은 노란색 부분이다.
BCM부분이 GPIO핀 번호라고 생각하면된다. 여기서 아래의 명령어를 한번 쳐보자
$ gpio -g mode 23 output
$ gpio -g write 23 1
$ gpio readall //여기서 23번핀이 output으로 바뀌고 v가 1이 되었는지 확인
$ gpio -g mode 23 input
$ gpio readall //23번 핀이 input으로 변경되었는지 확인
우리가 설정하기에 따라 핀의 용도가 output 또는 input으로 변화되는 것을 확인할 수 있다.
2. LED와 Switch 컨트롤 해보기
이제 간단한 led와 switch 컨트롤에 대해 알아보자. 일단 led의 회로도는 이렇다.
위의 회로도를 참고하여 원하는 gpio핀 번호에 연결한뒤 쉘 스크립트하나를 작성해보자.
$ nano ~/bin/testled.sh
1 2 3 4 5 6 7 | #!/bin/bash echo "Test on GPIO 18" gpio -g mode 18 output gpio -g write 18 1 sleep 1 gpio -g write 18 0 | cs |
이렇게 작성한뒤 chmod를 통해 권한을 주고 testled.sh를 실행해보면 led가 한번 깜빡이는 것을 확인할 수 있다.
led는 테스트 해봤고 이번엔 스위치 테스트를 진행해보자. 스위치의 회로도는 아래와 같다.
위와같이 회로도를 꾸민 후 led를 테스트 할때와 같이 쉘 스크립트 하나를 만들어 테스트 해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash gpio -g mode 21 input gpio -g mode 21 up gpio –g mode 23 output gpio –g write 23 1 led=1 while true; do sw=`gpio –g read 21` if [ $sw –eq 0 ]; then ((led ^= 1)) gpio -g write 23 $led sleep 0.3 fi done | cs |
위와 같이 따라 치되 중요한 것이 있다. 쉘 스크립트는 공백에 민감해서 띄어쓰기를 제대로 해야된다는 것이고 `표시는 작은 따옴표가 아닌 보통 키보드에서 1 왼쪽에 붙어있는 문자이다.
이 스크립트를 실행해보면 스위치를 누를 때 마다 led가 켜졌다 꺼졌다 하는 것을 확인해 볼 수 있다.
3. GPIO 응용 - 1
위의 정보를 가지고 스위치를 입력받으면 4개의 led가 차례대로 불이 들어오게 쉘 스크립트를 통해 조작해보자.
위의 사진을 보면 좀더 명확한 동작이 느껴지리라 생각한다.
나는 이렇게 작성하였다.
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 | #!/bin/bash gpio -g mode 21 input # 21번핀 input(switch) gpio -g mode 21 up # 21번핀 pull up gpio -g mode 23 output # 23~26핀 output(led) gpio -g mode 24 output gpio -g mode 25 output gpio -g mode 26 output for i in {23..26} # i 에 23에서 26까지 1씩 증가시키며 차례로 집어넣음 do gpio -g write $i 0 # 사용하는 led를 off해줌 done while true; # 무한루프 do sw=`gpio -g read 21` # sw라는 변수에 21번 핀에서 읽은 정보를 넣음(누르면 0 떼면 1) if [ $sw -eq 0 ]; then # sw가 0과 같으면 for i in {23..26} do gpio -g write $i 1 # i번 핀에 연결되어 있는 led를 on sleep 0.5 # 0.5초 딜레이 gpio -g write $i 0 # i번 핀에 연결되어 있는 led를 off done fi done | cs |
4. GPIO 응용 - 2
이번엔 위와 비슷하지만 스위치를 눌렀을 때 led가 369로 켜지게 해보자.
우리가 369 게임을 하는 것처럼 자신의 차례에 3 또는 6 또는 9가 들어가면 불빛을 내지 않는다.
위와 같은 형식으로 100까지 진행하게 할 예정이다.
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #!/bin/bash gpio -g mode 21 input gpio -g mode 21 up gpio -g mode 23 output gpio -g mode 24 output gpio -g mode 25 output gpio -g mode 26 output mod1=0 mod2=0 led=23 p=0 q=0 for i in {23..26} do gpio -g write $i 0 done while true; do sw=`gpio -g read 21` if [ $sw -eq 0 ]; then for i in {1..100} # i에 1에서 100까지 1씩 증가하며 대입 do mod1=`expr $i % 10` # 증가하는 i에 10을 모듈러 연산을 통해 현재 1의자리 값을 알아냄 mod2=`expr $i / 10` # 증가하는 i에 10을 나누어 십의자리 값을 알아냄 if [ \( $mod1 -eq 3 \) -o \( $mod1 -eq 6 \) -o \( $mod1 -eq 9 \) ]; then # 일의 자리가 3,6,9이면 p를 1로 만들어줌 p=1 else p=0 # 셋다 해당 안될 경우 0 fi if [ \( $mod2 -eq 3 \) -o \( $mod2 -eq 6 \) -o \( $mod2 -eq 9 \) ]; then # 십의 자리가 3,6,9이면 q를 1로 만들어줌 q=1 else q=0 # 셋다 해당 안될 경우 0 fi if [ \( $p -eq 0 \) -a \( $q -eq 0 \) ]; then # 만약 p와 q가 0이면 일의 자리와 십의 자리에 3,6,9가 없다는 뜻이므로 gpio -g write $led 1 # led에 저장된 번호의 led를 on sleep 0.5 # 0.5초 딜레이 gpio -g write $led 0 # led off else sleep 0.5 # 만약 숫자에 3이 포함 되어있으면 그냥 0.5초만 딜레이를 주어서 켜지않고 차례를 넘김 fi led=`expr $led + 1` # led = led +1 if [ $led == 27 ]; then # 만약 led가 27까지 증가했으면 23으로 초기화 led=23 fi done fi done | cs |
'프로그래밍 > 라즈베리파이' 카테고리의 다른 글
Raspberry Pi GPIO 활용하기 (파이썬, Python) (0) | 2017.04.16 |
---|---|
Raspberry pi와 pi camera를 활용한 Time-lapse 비디오 만들기 (1) | 2017.04.09 |
PiFaceCAD를 이용한 MP3와 라디오 만들기 - 2 (0) | 2017.04.02 |
PiFaceCAD를 이용한 MP3와 라디오 만들기 - 1 (0) | 2017.04.01 |
Openweathermap을 사용하여 7개 도시의 현재 날씨와 온도를 프린트하기 (0) | 2017.03.23 |