์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- Absolute
- AGI
- ai
- AI agents
- AI engineer
- AI researcher
- ajax
- algorithm
- Algorithms
- aliases
- Array ๊ฐ์ฒด
- ASI
- bayes' theorem
- Bit
- Blur
- BOM
- bootstrap
- canva
- challenges
- ChatGPT
- Today
- In Total
A Joyful AI Research Journey๐ณ๐
[45] 230303 Ch. 5 ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด GPIO ๋ฐ ์ผ์ ํ์ฉํ๊ธฐ: 1. GPIO(General Purpose Input Output) ์ ์ด ๋ฐ ํ ์คํธ, 2. PWM(Pulse Width Modulation) ์ ์ด [K-๋์งํธ ํธ๋ ์ด๋ 45์ผ] ๋ณธ๋ฌธ
[45] 230303 Ch. 5 ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด GPIO ๋ฐ ์ผ์ ํ์ฉํ๊ธฐ: 1. GPIO(General Purpose Input Output) ์ ์ด ๋ฐ ํ ์คํธ, 2. PWM(Pulse Width Modulation) ์ ์ด [K-๋์งํธ ํธ๋ ์ด๋ 45์ผ]
yjyuwisely 2023. 3. 3. 12:45230303 Fri 45th class
Ch. 5 ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด GPIO ๋ฐ ์ผ์ ํ์ฉํ๊ธฐ
์ง๋: p. 126 ~ (๊ต์ฌ: IoT ์ฌ๋ฌผ์ธํฐ๋ท์ ์ํ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด 4 ์ ์, ์ ์: ์ต์ฃผํธ , ๊น์ฌ๋ฒ , ์ ๋์ง)
๊ต์ฌ ์ฝ๋ ๊นํ๋ธ: https://github.com/codingspecialist/RaspberryPi4-Book-Example
๊ต์ฌ ์์ค ๋ฐ PPT: http://jspstudy.co.kr/main/main.jsp
์ ์ ์นดํ: https://cafe.naver.com/metacoding
์ค๋ ๋ฐฐ์ด ๊ฒ ์ค ๊ธฐ์ตํ ๊ฒ์ ์ ๋ฆฌํ๋ค.
๋ณธ๋ฌธ์ ํ์ด์ฌ ์ฝ๋ ์์
[1] LED.Blink.py p. 129 : LED 10๋ฒ ๊น๋นก์
[2] Btn_Polling.py p. 131 : ๋ฒํผ ๋๋ฅด๋ฉด ๊ณ์ ๋ฉ์์ง ์ถ๋ ฅ
[3] Btn_Event.py p. 132 - p. 133 : ๋ฒํผ ๊ณ์ ๋๋ฅด๊ณ ์์ด๋ ๋ฉ์์ง 1๋ฒ ์ถ๋ ฅ
[4] Btn_LED.py p. 135 : ๋ฒํผ ๋๋ฅผ ๋๋ง๋ค LED ์ผ์ง๊ณ ๊บผ์ง ๋ฐ๋ณต
ํ์ด์ฌ ์ฝ๋ ์ด๋ฆ | ์ค๋ช |
LED_Blick | LED 10๋ฒ ๊น๋นก์ธ๋ค. |
Btn_Pollling | ๋ฒํผ ๋๋ฅด๊ณ ์์ผ๋ฉด ๊ณ์ํด์ 'Button pushed!' ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค. |
Btn_Event | ๋ฒํผ์ ๊ณ์ ๋๋ฅด๊ณ ์์ด๋ ๋ฉ์์ง๊ฐ ํ๋ฒ๋ง ์ถ๋ ฅ๋๋ค. |
Btn_LED | ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค LED ์ผ์ง๊ณ ๊บผ์ง์ ๋ฐ๋ณตํ๋ค. |
Chapter 05 ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด GPIO ๋ฐ ์ผ์ ํ์ฉํ๊ธฐ
์ฑ ์ ๋ชฉ์ฐจ
01 _ GPIO ์ ์ด ๋ฐ ํ ์คํธ
01-1 LED ์ค์ต
01-2 ํธ์ ๋ฒํผ ์ค์์น ์ค์ต(Polling ๋ฐฉ์)
01-3 ํธ์ ๋ฒํผ ์ค์์น ์ค์ต(Event ์๋ฆผ ๋ฐฉ์)
01-4 ํธ์ ๋ฒํผ ์ ๋ ฅ์ผ๋ก LED ์ค์ต
02 _ PWM ์ ์ด
02-1 PWM์ผ๋ก LED ์ค์ต
02-2 PWM์ผ๋ก ๋ถ์ ์ค์ต
02-3 PWM์ผ๋ก ์๋ณด๋ชจํฐ ์ค์ต
03 _ ์ด์ํ์ผ์(HC-SR04) ์ค์ต
04 _ PIR ์ผ์(HC-SR501) ์ค์ต
05 _ ์๋ ๋ก๊ทธ ์ ํธ์ SPI ํต์
05-1 ์๋ ๋ก๊ทธ ์ ํธ๋ฅผ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด๋ก ์ฝ์ด์ค๊ธฐ
05-2 SPI ํต์ ์ ์ดํด
05-3 SPI ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ ์ค์ ํ๊ธฐ
05-4 ์๋ ๋ก๊ทธ ์ ์์ MCP3008๋ก ์ฝ์ด์ค๊ธฐ
05-5 LDR ์ผ์ ์ค์ต
05-6 ์กฐ์ด์คํฑ(Joystick) ์ค์ต
06 _ I2C ํต์
06-1 I2C ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ ์ค์ ํ๊ธฐ
06-2 BMP180(๋๊ธฐ์ ์ผ์) ์ค์ต
06-3 OLED ๋์คํ๋ ์ด ์ค์ต
1. GPIO(General Purpose Input Output) ์ ์ด ๋ฐ ํ
์คํธ
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์ 2์ด์ ํค๋ ํ๋ค์ ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ํ ๋ฐฐ์ด์ ๊ฐ์ง๋ค.
GPIO(General Purpose Input Output): ๋ง์ดํฌ๋กํ๋ก์ธ์๊ฐ ์ฃผ๋ณ์ฅ์น์ ํต์ ํ๊ธฐ ์ํด ๋ฒ์ฉ์ผ๋ก ์ฌ์ฉ๋๋ ์
์ถ๋ ฅ(I/O) ํฌํธ์ด๋ค.
ํฌํธ: ์ ๊ธฐ์ ์ ํธ ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ๋ ํต๋ก
ํ๋ฒํธ ์ฝ๋ ๋ฒ
1. Board(๋ฌผ๋ฆฌ์ ์ธ ํ ๋ฒํธ):
์ผ์ชฝ ์์ชฝ๋ถํฐ 1๋ก ์์
์ค๋ฅธ์ชฝ ์๋ 40๋ฒ ํ
2. BCM(ํ๋ก๊ทธ๋จ ๊ฐ๋ฅํ ํ ๋ฒํธ):
GPIO + ์ซ์
3. ํน์๊ธฐ๋ฅ(Functions)
GPIO ๊ธฐ๋ฅ ์ธ์ ํน์๊ธฐ๋ฅ ๊ฐ๋ฅ
GND => ๊ทธ๋ผ์ด๋ ( - )
5V => 5V ์ ์ ( + )
3.3V => 3.3V ์ ์ ( + )
1.1 LED ์ค์ต
(1) ๋ธ๋ ๋๋ณด๋ ์ฐ๊ฒฐํ๊ธฐ
(2) ํ์ด์ฌ ํ๋ก๊ทธ๋๋ฐ ์ค๋นํ๊ธฐ
(2.1) ์ง๋(Geany) ํ๋ก๊ทธ๋จ ์ค์
์ง๋: ํตํฉ๊ฐ๋ฐํ๊ฒฝ(IDE, Integrated Development Environment)์ผ๋ก ํ์ด์ฌ์ผ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๊ณ ํ๋ก๊ทธ๋จ๊น์ง ์คํํ ์ ์๋ค.
๋ฉ๋ด => ์ ์ => ๋น๋ ์ค์
(2.2) RPi.GPIO ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฒ
- ํ๊ธ์ฃผ์์ ์ํด ์ฝ๋์ ์ต์๋จ์ “#-*- coding: utf-8 -*-”๋ฅผ ์ถ๊ฐํ๋ค.
- ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
ํ๋์จ์ด๋ฅผ ์ ์ดํ๊ธฐ ์ํด RPI.GPIO ๋ชจ๋๊ณผ LED ์ผ๊ณ ๋๋ ์๊ฐ์ ์ค์ ํ๊ธฐ ์ํด time ๋ชจ๋์ ๋ถ๋ฌ์จ๋ค.
GPIO ํ๋ฒํธ ๋ชจ๋ ์ค์ ( ๋ฌผ๋ฆฌ๋ฒํธ, BCM )
BOARD ๋ชจ๋: 2์ด ํค๋ ํ์ ๋ฒํธ๋ฅผ ์์๋๋ก ๋์ดํ๋ค.
BCM ๋ชจ๋: ์ฝ์๋ GPIO ๋ฒํธ๋ก ํ์ํ๋ค.
GPIO ํ์ ์ถ๋ ฅ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ธ์ง ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ธ์ง ๋จผ์ ์ค์
์ฌ์ฉํ๊ณ ์ ํ๋ GPIO ์ฑ๋์ ์ถ๋ ฅ์ผ๋ก ์ค์ ํ๋ค.
GPIO ๋ชจ๋๋ฅผ out์ผ๋ก ์ค์ ํ ์ดํ์ ๋ค์์ ์ฌ์ฉํ๋ค.
GPIO.output(channel, 1) => High(3, 3V)๋ฅผ ์ถ๋ ฅํ๋ค.
GPIO.output(channel, 0) => LOW(0V)๋ฅผ ์ถ๋ ฅํ๋ค.
time ๋ชจ๋์์ 1์ด๊ฐ ์๊ฐ์ ๋๊ธฐํ๋ time.sleep(1)์ ์ฌ์ฉํ์ฌ 1์ด๊ฐ ๋๊ธฐ ์ํ๋ก ๋ง๋ ๋ค.
Time.sleep(1)
(2.3) ํ์ด์ฌ ์คํ ๋ฒ์ ์ค์ ํ๊ธฐ
(3) ํ์ด์ฌ ์ฝ๋ ์์ฑํ๊ธฐ
[1] LED_Blink.py p. 129
# -*- coding: utf-8 -*-
#ํ์ํ ๋ชจ๋์ ๋ถ๋ฌ์ต๋๋ค.
import RPi.GPIO as GP10
import time
#์ฌ์ฉํ GPIOํ์ ๋ฒํธ๋ฅผ ์ ์ ํ๋ค.(BCM ๋ชจ๋)
led_pin = 4 #GPIO 4
#๋ถํ์ํ warning ์ ๊ฑฐ
GPIO.setwarnings(False)
#GPIOํ์ ๋ฒํธ ๋ชจ๋ ์ค์
GPIO.setmode(GPIO.BCM)
#LEDํ์ IN/OUT ์ค์
GPIO.setup(led_pin, GPIO.OUT)
#10๋ฒ ๋ฐ๋ณต๋ฌธ
for i in range(10):
GPIO.output(led_pin, 1) #LED ON
time.sleep(1) #1์ด๋์ ๋๊ธฐ์ํ
GPIO.output(led_pin, 0) #LED OFF
time.sleep(1) #1์ด๋์ ๋๊ธฐ์ํ
GPIO.cleanup() #GPIO ์ค์ ์ด๊ธฐํ
์ฝ๋ ๋ง์ง๋ง์ GPIO.cleanup()์ ์คํฌ๋ฆฝํธ ์คํ ์์ GPIO ๋ชจ๋ ์ธํ
๋ฑ์ ์ด๊ธฐํํ๊ณ ๋ฆฌ์คํธ๋ฅผ ๋ฐํ์์ผ์ ์ค๋ณต ์ฌ์ฉ์ด๋ GPIOํ ์ผํธ ๋ฑ์ ํ๋์จ์ด์ ์ธ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
์ผํธ: ์ ์ด๋๋ฉด ์๋๋ ๋ ๋์ฒด, ์ฆ ์๋ก๊ฐ์ ๋ถํ๊ฐ ๊ฑฐ์ ์๋ ์ํ์์ ์ ๋ฅ์ ์ผ๋ก ์ ์ด๋๋ ํ์์ ๋งํ๋ ๊ฒ์ผ๋ก ์ผํธ๊ฐ ๋๋ฉด ์๋์น์์ ๊ณผ์ ๋ฅ๊ฐ ํ๋ฅด๊ฒ ๋๊ณ ๊ทธ ๋ง๋ํ ์ ๊ธฐ ์๋์ง๊ฐ ๋ฐ์ฐํ๋ ๋ฐ์ด๋ก ์ธํด ํ์ฌ๊ฐ ์ผ์ด๋ ์๋ ์๋ ํ์์ด๋ค.
P = VI, P: ์ ๋ ฅ, V: ์ ์, I: ์ ๋ฅ
(4) ์ฝ๋ ์คํํ๊ธฐ
LED๊ฐ 10ํ ๊น๋นก์ธ๋ค.
1.2 ํธ์ ๋ฒํผ ์ค์์น ์ค์ต(Polling ๋ฐฉ์) p. 130
ํธ์ ๋ฒํผ์ ๋๋ฅด์ง ์์์ ๋๋ GPIO ํ์ ํ๋กํ (Floating: ์ฐ๊ฒฐ X) ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ ์ ์๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด Pull up/down ํ์ฌ ์ด๊ธฐ์ํ๋ฅผ ๋ช ํํ๊ฒ ํด์ผ ํ๋ค. (๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์๋ ๋ด๋ถ์ ์ผ๋ก ์ธํ ํ ์ ์๋ค.)
(2) RPI.GPIO ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฒ
GPIO ํ์ ์ ๋ ฅํ๊ณ Pull up/down์ ์ค์ ํ๋ค.
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP) #=> ํ์
์ค์
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) #=> ํ๋ค์ด ์ค์
๋ธ๋ ๋๋ณด๋ ์ฐ๊ฒฐ์์ ์ค์์น์ ํ์ชฝ์ 3.3V(1)์ ์ฐ๊ฒฐํ์ผ๋ฏ๋ก PUD_DOWN์ผ๋ก ์ค์ ํ๋ค.
GPIO ํ์ ์
๋ ฅ์ํ๋ฅผ ์ฒดํฌํ๋ if๋ฌธ์ ์์ฑํ๋ค.
if GPIO.input(channel) == GPIO.HIGH:
print('HIGH)
else:
print('LOW')
if๋ฌธ์ GPIO.HIGH๋ 1๊ณผ ๊ฐ๋ค.
์ฆ ์
๋ ฅํ์ 3.3V ์
๋ ฅ์ด ์์ผ๋ฉด ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์๋ ๋์งํธ 1๋ก ๋ฐ์๋ค์ฌ์ HIGH(1)๋ฅผ ์ถ๋ ฅํ๊ณ
์๋์์๋ LOW(0)์ ์ถ๋ ฅํ๋ค.
(3) ํ์ด์ฌ ์ฝ๋ ์์ฑํ๊ธฐ
[2] Btn_Polling.py p. 131 - p. 132
# -*- coding: utf-8 -*-
#ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
import RPi.GPIO as GP10
import time
#์ฌ์ฉํ GPIOํ์ ๋ฒํธ๋ฅผ ์ ์ ํฉ๋๋ค.
button_pin = 15
#๋ถํ์ํ warning ์ ๊ฑฐ
GPIO.setwarnings(False)
#GPIOํ์ ๋ฒํธ ๋ชจ๋ ์ค์
GPIO.setmode(GPIO.BCM)
#๋ฒํผ ํ์ ์
๋ ฅ ์ค์ , PULL DOWN ์ค์
GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while 1: #๋ฌดํ๋ฐ๋ณต
#๋ง์ฝ ๋ฒํผํ์ High(1) ์ ํธ๊ฐ ๋ค์ด์ค๋ฉด, "Button pushed!"์ ์ถ๋ ฅํฉ๋๋ค.
if GPIO.input(button_pin) == GPIO.HIGH:
print("Button pushed!")
time.sleep(0.1) #0.1์ด ๋๋ ์ด
์์ ๋ฌดํ๋ฐ๋ณต๋ฌธ์ ๋ณด๋ฉด ๊ณ์ํด์ 0.1์ด ๊ฐ๊ฒฉ์ผ๋ก GPIO ๋ฒํผ ํ์ ํ์ธํด์ ๋๋ฌ์ก์ผ๋ฉด "Button pushed"๋ฅผ ์ถ๋ ฅํ๋ค.
ํด๋ง(Polling): ์ด๋ ๊ฒ ๊ณ์ํด์ ์
๋ ฅ์ ํ์ธํ๋ ์ฒ๋ฆฌ๋ฐฉ์
ํด๋ง๋ฐฉ์์ ์
๋ ฅ์์๋ ๋ฒํผ์ ๋๋ฅด๊ณ ์์ผ๋ฉด ๊ณ์ํด์ 'Button pushed!' ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
๋๊ธฐ ์ํ๋ ๋ค๋ฅธ ์์
์ ํ๋ ์ํฉ์ด๋ผ๋ฉด ์
๋ ฅ๋ฒํผ์ ๋๋ฌ๋ ํ์ธํ ์ ์๋ค. (=> ์ด๋ฒคํธ ์๋ฆผ ๋ฐฉ์์ ์ฒ๋ฆฌ๋ฐฉ๋ฒ๋ ์์๋ณธ๋ค.)
1.3 ํธ์ ๋ฒํผ ์ค์์น ์ค์ต(Event ์๋ฆผ ๋ฐฉ์) p. 132
def button_callback(channel):
print("Button pushed!")
์ด ํจ์๋ ์คํ์ “Button pushed!” ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ค.
(2) ํ์ด์ฌ ์ฝ๋ ์์ฑํ๊ธฐ p. 132 - p. 133
[3] Btn_Event.py
#-*-coding:utf-8-*-
# ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
import RPi.GPIO as GPIO
import time
# button_callback ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
def button_callback(channel):
print("Button pushed!")
# ์ฌ์ฉํ GPIOํ์ ๋ฒํธ๋ฅผ ์ ์ ํฉ๋๋ค.
button_pin = 15
# GPIOํ์ ๋ฒํธ ๋ชจ๋ ์ค์
GPIO.setmode(GPIO.BCM)
# ๋ฒํผ ํ์ IN/OUT ์ค์ , PULL DOWN ์ค์
GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
# Event ๋ฐฉ์์ผ๋ก ํ์ Rising ์ ํธ๋ฅผ ๊ฐ์งํ๋ฉด button_callback ํจ์๋ฅผ ์คํํฉ๋๋ค.
GPIO.add_event_detect(button_pin,GPIO.RISING,callback=button_callback)
while 1:
time.sleep(0.1) # 0.1์ด ๋๋ ์ด
์์ ๋ฌดํ๋ฐ๋ณต๋ฌธ์ ๋ณด๋ฉด ๊ณ์ 0.1์ด์ ๋๊ธฐ์๊ฐ์ ๋ฐ๋ณตํ์ง๋ง Event ๋ฐฉ์์ ์ ํธ ๊ฐ์ง ์ ๋ฏธ๋ฆฌ ์ ์ํ button_callback ํจ์๋ฅผ ์คํํด ์ค๋ค. (=> ํด๋ง ๋ฐฉ์๊ณผ๋ ๋ค๋ฅด๊ฒ ์ ๋ ฅ ์ ํธ๊ฐ ๋ค์ด์ฌ ๋ ์ํ๋ ๋์์ ํ ์ ์๋ค.)
(3) ์ฝ๋ ์คํํ๊ธฐ
๋ฒํผ์ ๊ณ์ ๋๋ฅด๊ณ ์์ด๋ ๋ฉ์์ง๊ฐ ํ๋ฒ๋ง ์ถ๋ ฅ๋๋ค.
์
๋ ฅ ์ ํธ๊ฐ 0์์ 1๋ก ๋ณํํ๋ ์๊ฐ๋ง์ ๊ฐ์งํ๊ธฐ ๋๋ฌธ์ ๋ฒํผ์ ์์ ๋ผ๊ณ ๋ค์ ๋๋ฅด์ง ์๋ ์ด์ ์ฌ๋ฌ๋ฒ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ์ง ์๋๋ค.
1.4 ํธ์ ๋ฒํผ ์ ๋ ฅ์ผ๋ก LED ์ค์ต p. 133
(2) ํ์ด์ฌ ์ฝ๋ ์์ฑ๊ณผ ์คํํ๊ธฐ p. 135
[4] Btn_LED.py p. 135
#-*-coding:utf-8-*-
# ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
import RPi.GPIO as GPIO
import time
# ์ฌ์ฉํ GPIOํ์ ๋ฒํธ๋ฅผ ์ ์ ํฉ๋๋ค.
button_pin = 15
led_pin = 4
#๋ถํ์ํ warning ์ ๊ฑฐ
GPIO.setwarnings(False)
# GPIOํ์ ๋ฒํธ ๋ชจ๋ ์ค์
GPIO.setmode(GPIO.BCM)
# ๋ฒํผ ํ์ IN/OUT ์ค์ , PULL DOWN ์ค์
GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#LED ํ์ OUT์ค์
GPIO.setup(led_pin, GPIO.OUT)
#boolean ๋ณ์ ์ค์
light_on = False
#button_callback ํจ์๋ฅผ ์ ์ํ๋ค.
def button_callback(channel):
global light_on #Global ๋ณ์ ์ ์ธ
if light_on == False: #LED ๋ถ์ด ๊บผ์ ธ์์ ๋
GPIO.output(led_pin,1) #LED ON
print("LED ON!")
else: #LED ๋ถ์ด ์ผ์ ธ์์ ๋
GPIO.output(led_pin,0) #LED OFF
print("LED OFF!")
light_on = not light_on #False <=> True
#Event ์๋ฆผ ๋ฐฉ์์ผ๋ก GPIO ํ์ Rising ์ ํธ๋ฅผ ๊ฐ์งํ๋ฉด button_callback ํจ์๋ฅผ ์คํํ๋ค.
#300ms ๋ฐ์ด์ค ํ์์ ์ค์ ํ์ฌ ์๋ชป๋ ์ ํธ๋ฅผ ๋ฐฉ์งํ๋ค.
GPIO.add_event_detect(button_pin, GPIO.RISING, callback=button_callback, bouncetime=300)
while 1:
time.sleep(0.1) #0.1์ด ๋๋ ์ด
global: ํ์ด์ฌ์์ ์ ์ญ ๋ณ์
๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค LED๊ฐ ์ผ์ง๊ณ ๊บผ์ง์ ๋ฐ๋ณตํ๋ค.
2. PWM(Pulse Width Modulation) ์ ์ด
Duty๋น๋ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ Pulse์์ ์ฐ์ด๋ ์ฉ์ด์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก Duty๋น๋ผ๊ณ ํ๋ฉด On Duty Ratio๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ธ๋ฐ, ์ด๋ ํ ์ฃผ๊ธฐ์ ๋ํด์ ํ์ค๊ฐ On ์ํ์ธ ์๊ฐ์ ๋น์จ์ ๋ปํ๋ค.
2.1 PWM(Pulse Width Modulation) ์ผ๋ก LED ์ค์ต
[1] PWM_LED.py p. 137 - p. 138
#-*-coding:utf-8-*-
# ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
import RPi.GPIO as GPIO
import time
#๋ถํ์ํ warning ์ ๊ฑฐ, GPIOํ์ ๋ฒํธ ๋ชจ๋ ์ค์
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
#GPIO 18๋ฒ ํ์ ์ถ๋ ฅ์ผ๋ก ์ค์
GPIO.setup(18, GPIO.OUT)
#PWM ์ธ์คํด์ค p๋ฅผ ๋ง๋ค๊ณ GPIO 18๋ฒ์ PWM ํ์ผ๋ก ์ค์ , ์ฃผํ์ = 50Hz
p = GPIO.PWM(18, 50)
#LED ํ์ OUT์ค์
GPIO.setup(led_pin, GPIO.OUT)
p.start(0) #PWM ์์, ๋ํฐ๋น = 0
try:
while 1: #๋ฌดํ ๋ฐ๋ณต
for dc in range(0, 101, 5): #๋ฐ๊ธฐ๊ฐ 0๋ถํฐ 5์ฉ 100์ด ๋ ๋์
p.ChangeDutyCycle(dc)
time.sleep(0.1)
for dc in range(100, -1, 5): #๋ฐ๊ธฐ๊ฐ 100๋ถํฐ 5์ฉ 0์ด ๋ ๋์
p.ChangeDutyCycle(dc)
time.sleep(0.1)
except KeyboardInterrupt: #ํค๋ณด๋ CTRL+C ๋๋ ์ ๋ ์์ธ๋ฐ์
pass #๋ฌดํ๋ฐ๋ณต์ ๋น ์ ธ๋์ ์๋์ ์ฝ๋๋ฅผ ์คํํ๋ค.
p.stop() #PWM์ ์ข
๋ฃํ๋ค.
GPIO.cleanup() #GPIO ์ค์ ์ ์ด๊ธฐํํ๋ค.
2.2 PWM(Pulse Width Modulation) ์ผ๋ก ๋ถ์ ์ค์ต
๋ถ์ ์ ์ข ๋ฅ
(2) Python ์ฝ๋ ์์ฑํ๊ธฐ
4์ฅํ๋ธ “๋ ๋ ๋ฏธ ํ ์ ๋ผ ์”์ 5์ฅํ๋ธ ๋๊น์ง ์ฃผํ์
[2] PWM_Buzzer.py p. 140 - p. 141
์ค์ตํ์ผ: /home/pi/webapps/ch05/PWM_Buzzer.py
#-*-coding:utf-8-*-
# ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
import RPi.GPIO as GPIO
import time
# ๋ถํ์ํ warning ์ ๊ฑฐ, GPIOํ์ ๋ฒํธ ๋ชจ๋ ์ค์
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
# GPIO 18๋ฒ ํ์ ์ถ๋ ฅ์ผ๋ก ์ค์
GPIO.setup(18, GPIO.OUT)
# PWM ์ธ์คํด์ค p๋ฅผ ๋ง๋ค๊ณ GPIO 18๋ฒ์ PWM ํ์ผ๋ก ์ค์ , ์ฃผํ์ = 100Hz
p = GPIO.PWM(18, 100)
# 4์ฅํ๋ธ ๋~์ , 5์ฅํ๋ธ ๋์ ์ฃผํ์
Frq = [ 262, 294, 330, 349, 392, 440, 493, 523 ]
speed = 0.5 # ์๊ณผ ์ ์ฌ์ด ์ฐ์ฃผ์๊ฐ ์ค์ (0.5์ด)
p.start(10) # PWM ์์ , ๋ํฐ์ฌ์ดํด 10 (์ถฉ๋ถ)
try:
while 1:
for fr in Frq:
p.ChangeFrequency(fr) #์ฃผํ์๋ฅผ fr๋ก ๋ณ๊ฒฝ
time.sleep(speed) #speed ์ด๋งํผ ๋๋ ์ด (0.5s)
except KeyboardInterrupt: # ํค๋ณด๋ Ctrl+C ๋๋ ์๋ ์์ธ๋ฐ์
pass # ๋ฌดํ๋ฐ๋ณต์ ๋น ์ ธ๋์ ์๋์ ์ฝ๋๋ฅผ ์คํ
p.stop() # PWM์ ์ข
๋ฃ
GPIO.cleanup() # GPIO ์ค์ ์ ์ด๊ธฐํ
2.3 PWM(Pulse Width Modulation)์ผ๋ก ์๋ณด๋ชจํฐ ์ค์ต
[3] PWM_Servo.py p. 142 - p. 143
#-*- coding: utf-8 -*-
#ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
import RPi.GPIO as GPIO
import time
#์๋ณด๋ชจํฐ๋ฅผ PWM์ผ๋ก ์ ์ดํ ํ ๋ฒํธ ์ค์
SERVO_PIN = 18
#๋ถํ์ํ warning ์ ๊ฑฐ
GPIO.setwarnings(False)
#GPIOํ์ ๋ฒํธ ๋ชจ๋ ์ค์
GPIO.setmode(GPIO.BCM)
#์๋ณดํ์ ์ถ๋ ฅ ์ค์
GPIO.setup(SERVO_PIN, GPIO.OUT)
#PWM ์ธ์คํด์ค servo ์์ฑ, ์ฃผํ์ 50์ผ๋ก ์ค์
servo = GPIO.PWM(SERVO_PIN, 50)
#PWM ๋ํฐ๋น 0์ผ๋ก ์์
servo.start(0)
try:
while True:
#๋ํฐ๋น๋ฅผ ๋ณ๊ฒฝํ์ฌ ์๋ณด๋ชจํฐ๋ฅผ ์ํ๋ ๋งํผ ์์ง์
servo.ChangeDutyCycle(7.5) #90๋
time.sleep(1)
servo.ChangeDutyCycle(12.5) #180๋
time.sleep(1)
servo.ChangeDutyCycle(2.5) #0๋
time.sleep(1)
except KeyboardInterrupt:
servo.stop()
GPIO.cleanup()