Notice
Recent Posts
Recent Comments
ยซ   2024/12   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
Archives
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์ผ] ๋ณธ๋ฌธ

๐ŸŒณBootcamp Revision 2023โœจ/Raspberry Pi, Linux, Electronics Basics

[45] 230303 Ch. 5 ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด GPIO ๋ฐ ์„ผ์„œ ํ™œ์šฉํ•˜๊ธฐ: 1. GPIO(General Purpose Input Output) ์ œ์–ด ๋ฐ ํ…Œ์ŠคํŠธ, 2. PWM(Pulse Width Modulation) ์ œ์–ด [K-๋””์ง€ํ„ธ ํŠธ๋ ˆ์ด๋‹ 45์ผ]

yjyuwisely 2023. 3. 3. 12:45

230303 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

 

IoT ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท์„ ์œ„ํ•œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด 4 ์ •์„ | ์ตœ์ฃผํ˜ธ - ๊ต๋ณด๋ฌธ๊ณ 

IoT ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท์„ ์œ„ํ•œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด 4 ์ •์„ | ใ€ŽIoT ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท์„ ์œ„ํ•œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด 4 ์ •์„ใ€์€ ์™•์ดˆ๋ณด๋„ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด๋ฅผ ์ด์šฉํ•ด ๋‹ค์–‘ํ•œ IoT๋ฅผ ์ง์ ‘ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ „๊ธฐ์ „์ž ๊ธฐ์ดˆ ์›๋ฆฌ๋ถ€ํ„ฐ ์„ผ

product.kyobobook.co.kr

์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ ์ค‘ ๊ธฐ์–ตํ•  ๊ฒƒ์„ ์ •๋ฆฌํ–ˆ๋‹ค.

๋ณธ๋ฌธ์˜ ํŒŒ์ด์ฌ ์ฝ”๋“œ ์ˆœ์„œ
[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) ์ œ์–ด ๋ฐ ํ…Œ์ŠคํŠธ

๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด 3๊ณผ 4 GPIO PINOUT

๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์˜ 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 ์ „์› ( + )

์ถœ๋ ฅ(Outputs) : GPIO๋ฅผ ์ถœ๋ ฅ ์„ค์ •  Low(0V) ๋‚˜ High(3.3V) ๋กœ ์ถœ๋ ฅ
์ž…๋ ฅ(Inputs)    : GPIO๋ฅผ ์ž…๋ ฅ ์„ค์ • 3.3V IN => High , 0V IN => Low

1.1 LED ์‹ค์Šต

(1) ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ ์—ฐ๊ฒฐํ•˜๊ธฐ

GPIO 4๋ฒˆ ํ•€์— ์ €ํ•ญ๊ณผ LED๋ฅผ ์—ฐ๊ฒฐ
 

(2) ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ค€๋น„ํ•˜๊ธฐ

(2.1) ์ง€๋‹ˆ(Geany) ํ”„๋กœ๊ทธ๋žจ ์„ค์ •

์ง€๋‹ˆ: 
ํ†ตํ•ฉ๊ฐœ๋ฐœํ™˜๊ฒฝ(IDE, Integrated Development Environment)์œผ๋กœ ํŒŒ์ด์ฌ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ๊นŒ์ง€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 

๋ฉ”๋‰ด => ์ œ์ž‘ => ๋นŒ๋“œ ์„ค์ •  

Complie์—์„œ python3์œผ๋กœ ๋ณ€๊ฒฝ
Execute์—์„œ python3์œผ๋กœ ๋ณ€๊ฒฝ

Geany๋กœ ํ”„๋กœ๊ทธ๋žจ ์„ค์ •


(2.2) RPi.GPIO ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฒ•

 - ํ•œ๊ธ€์ฃผ์„์„ ์œ„ํ•ด ์ฝ”๋“œ์˜ ์ตœ์ƒ๋‹จ์— “#-*- coding: utf-8 -*-”๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

- ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
ํ•˜๋“œ์›จ์–ด๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด RPI.GPIO ๋ชจ๋“ˆ๊ณผ LED ์ผœ๊ณ  ๋„๋Š” ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด time ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

- ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด GPIO ํ•€๋“ค ์ œ์–ด ๋ชจ๋“ˆ
์‹œ๊ฐ„ ๊ด€๋ จ ๋ชจ๋“ˆ

GPIO ํ•€๋ฒˆํ˜ธ ๋ชจ๋“œ ์„ค์ • ๋ฌผ๋ฆฌ๋ฒˆํ˜ธ, BCM )

BOARD ๋ชจ๋“œ: 2์—ด ํ—ค๋” ํ•€์˜ ๋ฒˆํ˜ธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•œ๋‹ค.
BCM ๋ชจ๋“œ: ์•ฝ์†๋œ GPIO ๋ฒˆํ˜ธ๋กœ ํ‘œ์‹œํ•œ๋‹ค.

๋ฌผ๋ฆฌ์ ์ธ ํ•€ ๋ฒˆํ˜ธ ( GND, VCC , ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•€ ๋“ฑ ๋ชจ๋‘ ํฌํ•จ)
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ€๋Šฅํ•œ ํ•€ ๋ฒˆํ˜ธ

GPIO ํ•€์„ ์ถœ๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๋จผ์ € ์„ค์ •

GPIO.OUT (์ถœ๋ ฅ)
GPIO.IN    (์ž…๋ ฅ)
์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” 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ํ•€ ์‡ผํŠธ ๋“ฑ์˜ ํ•˜๋“œ์›จ์–ด์ ์ธ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‡ผํŠธ: ์ ‘์ด‰๋˜๋ฉด ์•ˆ๋˜๋Š” ๋‘ ๋„์ฒด, ์ฆ‰ ์„œ๋กœ๊ฐ„์˜ ๋ถ€ํ•˜๊ฐ€ ๊ฑฐ์˜ ์—†๋Š” ์ƒํƒœ์—์„œ ์ „๋ฅ˜์ ์œผ๋กœ ์ ‘์ด‰๋˜๋Š” ํ˜„์ƒ์„ ๋งํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‡ผํŠธ๊ฐ€ ๋‚˜๋ฉด ์˜๋„์น˜์•Š์€ ๊ณผ์ „๋ฅ˜๊ฐ€ ํ๋ฅด๊ฒŒ ๋˜๊ณ  ๊ทธ ๋ง‰๋Œ€ํ•œ ์ „๊ธฐ ์—๋„ˆ์ง€๊ฐ€ ๋ฐœ์‚ฐํ•˜๋Š” ๋ฐœ์—ด๋กœ ์ธํ•ด ํ™”์žฌ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๋Š” ํ˜„์ƒ์ด๋‹ค.

VI, P: ์ „๋ ฅ, V: ์ „์••, I: ์ „๋ฅ˜


(4) ์ฝ”๋“œ ์‹คํ–‰ํ•˜๊ธฐ

LED๊ฐ€ 10ํšŒ ๊นœ๋นก์ธ๋‹ค.


1.2 ํ‘ธ์‹œ ๋ฒ„ํŠผ ์Šค์œ„์น˜ ์‹ค์Šต(Polling ๋ฐฉ์‹) p. 130

ํ‘ธ์‹œ ๋ฒ„ํŠผ ์Šค์œ„์น˜ ์—ฐ๊ฒฐ

ํ‘ธ์‹œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด 3.3V๊ฐ€ GPIO15 ํ•€์— ์ž…๋ ฅ๋˜์–ด GPIO15 ํ•€์— ์ž…๋ ฅ(High) ์‹ ํ˜ธ๊ฐ€ ๋“ค์–ด์˜ด์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
ํ‘ธ์‹œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์ง€ ์•Š์•˜์„ ๋•Œ๋Š” 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

์ฝœ๋ฐฑํ•จ์ˆ˜(button_callback)๋Š” ๋ฏธ๋ฆฌ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
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

๋ธŒ๋ ˆ๋“œ๋ณด๋“œ ์—ฐ๊ฒฐ

๋ธŒ๋ ˆ๋“œ๋ณด๋“œ์— ์ฐจ๊ทผ์ฐจ๊ทผ ์—ฐ๊ฒฐํ•ด ๋ด…๋‹ˆ๋‹ค.
ํ•จ์ˆ˜์ •์˜ (๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„๋•Œ ์‹คํ–‰ ํ•จ์ˆ˜)

boolean ๋ณ€์ˆ˜๋Š” ์ฐธ(True) ๋˜๋Š” ๊ฑฐ์ง“(False) ๊ฐ’๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„๋•Œ button_callback ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ์ด๋•Œ light_on ๋ณ€์ˆ˜๊ฐ’์ด  ๊ฑฐ์ง“(์ดˆ๊ธฐ๊ฐ’)์ด๋ฉด ์šฐ์„  LED๋ฅผ ์ผœ๊ณ  “LED ON” ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค๋ฐ˜๋Œ€๋กœ ์ฐธ์ด๋ผ๋ฉด LED๋ฅผ ๋„๊ณ  “LED OFF” ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค
ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰์— ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ˜์ „ํ•œ๋‹ค. ( ์ฐธ <=> ๊ฑฐ์ง“ )


(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) ์ œ์–ด

์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ON OFF ์‹ ํ˜ธ๋ฅผ ํ†ตํ•ด์„œ ๋ชจํ„ฐ, ํŒฌ์˜ ์†๋„๋‚˜ LED ๋“ฑ์˜ ๋ฐ๊ธฐ ๋“ฑ์„ ์ œ์–ด
๋ฐ˜๋ณต๋˜๋Š” Pulse ์‹ ํ˜ธ์˜ ์ฃผ๊ธฐ์—์„œ ON ์‹ ํ˜ธ๊ฐ€ ์ง€์†๋˜๋Š” ์‹œ๊ฐ„์˜ ๋น„์œจ์„ Duty Cycle (๋“€ํ‹ฐ๋น„) ์ด๋ผ๊ณ  ํ•œ๋‹ค.
์ด ๋“€ํ‹ฐ๋น„๊ฐ€ ํด์ˆ˜๋ก ํŒฌ์†๋„๋‚˜ LED์˜ ๋ฐ๊ธฐ๊ฐ€ ์ปค์ง‘๋‹ˆ๋‹ค

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 ์„ค์ •์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
์ž‘์„ฑํ•œ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ์— ์—ฐ๊ฒฐํ•œ LED๊ฐ€ ๋ฐ์•„์กŒ๋‹ค๊ฐ€ ์–ด๋‘์›Œ์ง€๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํžˆ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด ๋ณด๊ณ  ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋“€ํ‹ฐ๋น„๋‚˜ ๋”œ๋ ˆ์ด ์‹œ๊ฐ„์„ ๋ณ€ํ™”์‹œ์ผœ ์„œ LED์˜ ์ ๋ฉธ์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋Š”์ง€๋„ ํ™•์ธํ•ด ๋ด…๋‹ˆ๋‹ค.
์ข…๋ฃŒ ์‹œ Ctrl + C ๋กœ ํ‚ค๋ณด๋“œ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์‹œ ์‹คํ–‰ ์‹œ์—๋Š” Enter ๋ฅผ ํ•œ๋ฒˆ ๋ˆ„๋ฅธ ๋‹ค์Œ ์‹คํ–‰ํ•ด ์ค๋‹ˆ๋‹ค.

2.2 PWM(Pulse Width Modulation์œผ๋กœ ๋ถ€์ € ์‹ค์Šต

๋ถ€์ €์˜ ์ข…๋ฅ˜

Active : LED์˜ ON/OFF์ฒ˜๋Ÿผ ์ผ์ •ํ•œ ์ „์›๋งŒ ๊ฐ€ํ•ด์ฃผ๋ฉด ๋ถ€์ € ์†Œ๋ฆฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.
Passive : ์ผ์ •ํ•œ ์ฃผํŒŒ์ˆ˜ ์‹ ํ˜ธ๋ฅผ ์ค„๋•Œ ์†Œ๋ฆฌ๊ฐ€ ๋‚˜๋Š”๋ฐ ์ฃผํŒŒ์ˆ˜์˜ ๋†’๋‚ฎ์ด์— ๋”ฐ๋ผ ์Œ์„ ์กฐ์ • ๊ฐ€๋Šฅ

์™ผ์ชฝ ํšŒ๋กœ๋„์˜ 2๋ฒˆํ•€์— PWM ์‹ ํ˜ธ๋ฅผ ๋„ฃ์œผ๋ฉด ๋ถ€์ €๋ฅผ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์˜ GPIO ํ•€์„ ๋ฐ”๋กœ ๋ถ€์ €์— ์—ฐ๊ฒฐํ•˜์—ฌ ์ œ์–ดํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ GPIO ํ•€์€ ํ—ˆ์šฉ์ „๋ฅ˜๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์•ˆ์ „ํ•˜๊ณ  ๋ถ€์ €์— ํฐ ์ „๋ฅ˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.



(2) Python ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ 

4
์˜ฅํƒ€๋ธŒ “๋„ ๋ ˆ ๋ฏธ ํŒŒ ์†” ๋ผ ์‹œ”์™€ 5์˜ฅํƒ€๋ธŒ ๋„๊นŒ์ง€ ์ฃผํŒŒ์ˆ˜

์ฃผํŒŒ์ˆ˜์˜ ์†Œ์ˆ˜์ ์€ ๋ฐ˜์˜ฌ๋ฆผ ํ•˜๊ณ , ์Œ๊ณผ ์Œ์‚ฌ์ด๋Š” 0.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()

728x90
๋ฐ˜์‘ํ˜•

'๐ŸŒณBootcamp Revision 2023โœจ > Raspberry Pi, Linux, Electronics Basics' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[47] 230307 Ch. 5 ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด GPIO ๋ฐ ์„ผ์„œ ํ™œ์šฉํ•˜๊ธฐ: 6. IยฒC(Inter-Integrated Circuit) ํ†ต์‹  [K-๋””์ง€ํ„ธ ํŠธ๋ ˆ์ด๋‹ 47์ผ]  (0) 2023.03.07
[46] 230306 Ch. 5 ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด GPIO ๋ฐ ์„ผ์„œ ํ™œ์šฉํ•˜๊ธฐ: 3. ์ดˆ์ŒํŒŒ์„ผ์„œ(HC-SR04) ์‹ค์Šต, 4. PIR(Passive Infrared Sensor) ์„ผ์„œ(HC-SR501) ์‹ค์Šต, 5. ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ์™€ SPI(Serial Peripheral Interface) ํ†ต์‹  [K-๋””์ง€ํ„ธ ํŠธ๋ ˆ์ด๋‹ 4..  (0) 2023.03.06
[45] 230303 Ch. 4 ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด๋ฅผ ์œ„ํ•œ ์ „์ž ๊ธฐ์ดˆ ๋ฐฐ์šฐ๊ธฐ: 1. ์•Œ๊ธฐ ์‰ฌ์šด ์ „์žํšŒ๋กœ, 2. ๋ฐ์ดํ„ฐ์‹œํŠธ์™€ ํšŒ๋กœ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ „์ž ๋ถ€ํ’ˆ ์•Œ์•„๋ณด๊ธฐ [K-๋””์ง€ํ„ธ ํŠธ๋ ˆ์ด๋‹ 45์ผ]  (0) 2023.03.03
[43~44] 230228, 230302 ๋ฆฌ๋ˆ…์Šค Ch. 2 ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด๋ฅผ ์œ„ํ•œ ๋ฆฌ๋ˆ…์Šค ๊ธฐ์ดˆ ๋ฐฐ์šฐ๊ธฐ: 1. ์šด์˜ ์ฒด์ œ, 2. ์›๊ฒฉ ์ ‘์†์„ ์œ„ํ•œ VNC์™€ Putty, 3. ๋ฆฌ๋ˆ…์Šค ํŒŒ์ผ ์‹œ์Šคํ…œ, 4. ๋ฆฌ๋ˆ…์Šค ๋ช…๋ น์–ด [K-๋””์ง€ํ„ธ ํŠธ๋ ˆ์ด๋‹ 43~44์ผ]  (0) 2023.02.28
Comments