ㅇㅅㅇ

Raspberry Pi GPIO 활용하기 (쉘 스크립트) 본문

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

Raspberry Pi GPIO 활용하기 (쉘 스크립트)

Lugun 2017. 4. 11. 01:09

라즈베리파이의 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 truedo
    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 -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 -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


















Comments