본문으로 바로가기
반응형

[Raspberry Pi] 라즈베리파이 7. LED 제어, PWM 제어, Flask

 

LED가 생겼다!!!

 라즈베리파이는 보통 3.3V, 5V를 줄 수 있다. 보통 발광다이오드의 일반 전류와 최대 전류는 아래의 표와 같다.

(출처 : https://opentutorials.org/module/779/7087)

 옴의 법칙인 V = I R 식으로인해서 전압은 3.3V, 5V 전류는 20mA, 50mA로 계산해서 적당한 저항의 값을 계산해보면 아래의 표와 같다.

 전압 3.3V를 쓸때는 66~165옴의 저항을 써야하고, 전압 5V일때는 100~250옴의 저항을 사용해줘야 LED를 불편함없이 쓸 수 있다.

 

GPIO(General Pupose Input Output)는 S/W의 기능을 사용자에 맞게 바꿀 수 있는 것을 뜻한다.

 

GPIO의 Pin을 코드로 작성해서 제어해보자.

$ cp gpio.py gpio_led.py

$ vi gpio_led.py 

 

 

회로구성

 import RPi.GPIO as GPIO
 import time

 GPIO.setmode(GPIO.BCM)
 GPIO.setup(21, GPIO.OUT)

 for i in range(10):
     GPIO.output(21,1)  # GPIO 21번 Pin을 High(3.3V)로 만들어라
     print('High!!!')
     time.sleep(1)
     GPIO.output(21,0)  # GPIO 21번 Pin을 Low(0V)로 만들어라
     print('Low~~~')
     time.sleep(1)
 GPIO.cleanup()

$ python3 gpio_led.py 로 실행하면 high, low신호가 10번씩 뜬다

 

LED가 1초 간격마다 깜빡이는 것을 주목해보자

 

 이때, time.sleep을 1초에서 0.05로 아주 빠르게 껐다켰다 바꿔주면 계속 켜지는 것처럼 볼 수 있는데, 잔상효과때문에 그런 것이다. LED가 꺼지는데도 시간이 걸리는데 꺼지는 시간이 오기전에 이미 켜버렸기때문에 계속 켜져있는 것처럼 우리가 보는 것이다.

 

 

PWM 제어

 PWM(Pulse Width Modulation) 제어는 주기적으로 반복되는 ON OFF 신호를 통해서 모터, 팬의 속도, LED 밝기 등을 제어 할 수 있다. 반복되는 Pulse 신호의 주기에서 ON 신호가 지속되는 시간의 비율을 Duty Cycle 이라고하며, 이 듀티비가 클수록 팬속도가 LED의 밝기가 커진다.

 

회로는 위의 예제 그대로 쓰고, 코드를 바꿔준다.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.OUT)

p = GPIO.PWM(21, 50)
p.start(0)

try:
        while 1:
                for dc in range(0, 101, 5):
                        p.ChangeDutyCycle(dc)
                        time.sleep(0.1)
                for dc in range(100, -1, -5):
                        p.ChangeDutyCycle(dc)
                        time.sleep(0.1)

except KeyboardInterrupt:
        pass
p.stop()
GPIO.cleanup()

 

버어어언쩍하고 빛났다가 서서히 꺼지는 것을 볼 수 있다(카메라에서는 계속 깜빡이는 것 처럼 보였다)

 

 

 

Flask

 Flask는 Python으로 구성된 웹 어플리케이션 프레임워크이다. Django 프레임워크보다 가볍고, 스케일이 작기 때문에 작은 서버부터 스케일이 큰 서버를 만들 수가 있다.

 

Flask 설치 확인

 보통 최신 라즈베리파이를 설치했으면 Flask도 자동으로 설치되어있다.

$cd usr/bin   으로 이동해서 $ python 을 실행해서 파이썬 모드로 들어간다.

>>> from flask import Flask   를 입력해서 Flask의 설치 유무를 확인할 수 있다. 

이렇게 명령어를 입력했을때 아무 반응이없으면 설치가 잘 되어있다는 뜻이다

 

 현재 python의 버전을 확인해보자.

 

이 파이썬 명령어가 어느 디렉터리에 있는지 확인하기위해 which 명령어를 실행해보자.

python 명령어가 있는 디렉터리를 cd로 이동했다

 

 

/usr/bin 디렉터리에서 python 명령어가 어떤게 있는지 확인할수도 있다. 

맨앞에 l로 되있는게 링크를 뜻한다.

연두색으로 색깔이 다른 부분은 그 링크로 이동된다는 뜻이다.

python은 python2로 이동하기때문에 본진은 python2이다.

python3은 python3.7로 이동하기때문에 본진은 python3.7이다.

 

python3을 python으로 변경

$ sudo ln -s python3 python

이제부터 python을 입력하면 python3으로 실행하게 된다

 

 

디렉터리를 만들고 파일을 vi편집기로 생성하고 코드를 저장해보자.

$ mkdir -p webapps/ch06/helloworld

 

디렉터리 생성 후,  app_start.py 를 vi편집기로 편집하고 밑의 코드를 저장하고 빠져나온다.

from flask import Flask
app = Flask(__name__)
@app.route("/")
def helloworld():
        return "Hello World"

if __name__ == "__main__":
        app.run(host="0.0.0.0")

 

$ python app_start.py

를 실행해두고 인터넷 사이트에서 '본인 라즈베리파이 IP : 5000'   을 링크에 입력해주면 저장한 return 값이 뜬다.

return 값을 Hell World로 저장해뒀기때문에 사이트에서 헬로우월드가 출력된다

 

 명령어를 끝내려면 컨트롤 C로 종료하면 된다.(인터넷창은 그냥 닫으면 된다)

 

 

 이번엔 사이트에 접속하고, 다른 사이트에 접속했을때(예를들면 그 사이트에서 이동했을때, 게시물이나 다른 무언가를 클릭했을때 연결되는 사이트) 출력을 설정해보자.

 

먼저, cp 명령어로 app_strat2.py 파일을 복사하면서 만들어준다.

vi 편집기에서 /Test일때 return값을 입력해준다.

사이트에서 /Test를 입력하면 키티_테스트가 출력될 것이다.

python 명령어로 실행해보자

app_start2.py 실행화면
사이트 링크에서 app_start2.py 실행 후, /Test로 이동했을때 return값을 확인할 수 있다.

 

 

vi편집기에서 print와 메서드를 추가해서 입력해줄수도있다.

메서드와 print 추가
실행하면 추가했던 메서드와 print의 출력값이 출력된다
사이트 링크에는 추가되지는 않는듯 하다

 

위의 LED 제어와 Flask를 섞어서 예제를 만들어보자.

 

데코레이션 on에 접속하면 켜지고, off에 접속하면 꺼지도록 프로그램 만들어보기

/on 일때, /off 일때 코드 작성
실행했을때의 첫 화면

사이트에 접속했을때 화면

사이트에서 /on 으로 접속했을때 LED가 켜진다 

사이트에서 /off 으로 접속했을때 LED가 꺼진다

 

반응형