Notice
Recent Posts
Recent Comments
ยซ   2024/11   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
Archives
Today
In Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

A Joyful AI Research Journey๐ŸŒณ๐Ÿ˜Š

[46] 230306 Ch. 5 ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด GPIO ๋ฐ ์„ผ์„œ ํ™œ์šฉํ•˜๊ธฐ: 3. ์ดˆ์ŒํŒŒ์„ผ์„œ(HC-SR04) ์‹ค์Šต, 4. PIR(Passive Infrared Sensor) ์„ผ์„œ(HC-SR501) ์‹ค์Šต, 5. ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ์™€ SPI(Serial Peripheral Interface) ํ†ต์‹  [K-๋””์ง€ํ„ธ ํŠธ๋ ˆ์ด๋‹ 4.. ๋ณธ๋ฌธ

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

[46] 230306 Ch. 5 ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด GPIO ๋ฐ ์„ผ์„œ ํ™œ์šฉํ•˜๊ธฐ: 3. ์ดˆ์ŒํŒŒ์„ผ์„œ(HC-SR04) ์‹ค์Šต, 4. PIR(Passive Infrared Sensor) ์„ผ์„œ(HC-SR501) ์‹ค์Šต, 5. ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ์™€ SPI(Serial Peripheral Interface) ํ†ต์‹  [K-๋””์ง€ํ„ธ ํŠธ๋ ˆ์ด๋‹ 4..

yjyuwisely 2023. 3. 6. 09:49

230306 Mon 46th class

Ch. 5 ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด GPIO ๋ฐ ์„ผ์„œ ํ™œ์šฉํ•˜๊ธฐ
์ง„๋„: p. 144 ~ (๊ต์žฌ: 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

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


๋ชฐ๋ž๋˜ ๊ฒƒ ์ •๋ฆฌ

์ง‘์ ํšŒ๋กœ(IC: Integrated Circuit) ๋ž€, ํ•˜๋‚˜์˜ ๋ฐ˜๋„์ฒด ๊ธฐํŒ์— ๋‹ค์ˆ˜์˜ ๋Šฅ๋™์†Œ์ž (ํŠธ๋žœ์ง€์Šคํ„ฐ, ์ง„๊ณต๊ด€๋“ฑ)์™€ ์ˆ˜๋™์ˆ˜์ž (์ €ํ•ญ, ์ฝ˜๋ด์„œ, ์ €ํ•ญ๊ธฐ๋“ฑ)๋ฅผ ์ดˆ์†Œํ˜•์œผ๋กœ ์ง‘์ , ์„œ๋กœ ๋ถ„๋ฆฌ๋  ์ˆ˜ ์—†๋Š” ๊ตฌ์กฐ๋กœ ๋งŒ๋“  ์™„์ „ํ•œ ํšŒ๋กœ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๊ธฐ๋Šฅ์†Œ์ž์ด๋‹ค.
์ฐธ๊ณ : https://blog.naver.com/roboholic84/220331162212

์ง‘์  ํšŒ๋กœ(้›†็ฉๅ›ž่ทฏ, ์˜์–ดIntegrated Circuit) ๋˜๋Š” ๋ชจ๋†€๋ฆฌ์‹ ์ง‘์ ํšŒ๋กœ, IC์นฉ, ์ปดํ“จํ„ฐ ์นฉ, ๋งˆ์ดํฌ๋กœ์นฉ, IC๋Š” ๋ฐ˜๋„์ฒด๋กœ ๋งŒ๋“  ์ „์žํšŒ๋กœ์˜ ์ง‘ํ•ฉ์„ ๋งํ•œ๋‹ค.

์ฐธ๊ณ : https://devicemart.blogspot.com/2019/04/ic-posted-by-makefunny-pcb-ic.html


shift์—ฐ์‚ฐ์ž

์ด ๋น„ํŠธ๋‹จ์œ„ ๊ณ„์‚ฐ์—๋Š” ์˜ค๋ฅธ์ชฝ, ์™ผ์ชฝ์œผ๋กœ ์ˆ˜๋ฅผ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋‹ค.
0b1001์ด๋ผ๋Š” ์ˆ˜๋ฅผ ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ์˜ฎ๊ธฐ๋Š”๋ฐ, ๋นˆ์ž๋ฆฌ๋Š” 0์œผ๋กœ ์ฑ„์šด๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. 0b10010์ด ๋  ๊ฒƒ์ด๋‹ค.

>>> bin(b<<1)
'0b10010'
>>> a<<1
24
>>> bin(b<<3)
'0b1001000`
>>> a<<<3
96

์ด๋ ‡๊ฒŒ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•  ๋•Œ ๋งˆ๋‹ค 2๋ฐฐ๊ฐ€ ๋˜๋Š” ํšจ๊ณผ๊ฐ€ ์ƒ๊ธด๋‹ค.
์ด๋ฒˆ์—” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์›€์ง์—ฌ๋ณด์ž.

>>> b
9
>>> bin(b>>1)
'0b100'
>>> b>>1
4
>>> bin(b>>3)
'0b1'
>>> b>>3
1

๋ฐ˜๋Œ€๋กœ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜๋ฉด ์ˆซ์ž๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

๊ทธ๋Ÿผ 2๋ฅผ ๊ณฑํ•˜๊ณ  ๋‚˜๋ˆ„๋ฉด ๋˜์ง€ ์•Š๋‚˜?๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํฐ ์ˆ˜์—์„œ ๋น„ํŠธ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ, ์ด ๋•Œ ์‹œํ”„ํŠธ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํฐ ์ƒ๊ฐ์—†์ด ๋น„ํŠธ๋“ค์„ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ํŽธํ•˜๋‹ค.

์ฐธ๊ณ : https://wikidocs.net/95998


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 ๋””์Šคํ”Œ๋ ˆ์ด ์‹ค์Šต

3. ์ดˆ์ŒํŒŒ์„ผ์„œ(HC-SR04) ์‹ค์Šต

(3) ํŒŒ์ด์ฌ ์ฝ”๋“œ ์ž‘์„ฑ๊ณผ ์‹คํ–‰ํ•˜๊ธฐ p. 145 - p. 146

์‹ค์ŠตํŒŒ์ผ: /home/pi/webapps/ch05/PWM_Buzzer.py
HC_SRP4.py

#-*-coding:utf-8-*-

# ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. 
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#์„ผ์„œ์— ์—ฐ๊ฒฐํ•œ Trig์™€ Echo ํ•€์˜ ๋ฒˆํ˜ธ ์„ค์ • 
TRIG = 23
ECHO = 24
print("Distance measurement in progress")

#Trig์™€ Echo ํ•€์˜ ์ถœ๋ ฅ/์ž…๋ ฅ ์„ค์ • 
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)

#Trigํ•€์˜ ์‹ ํ˜ธ๋ฅผ 0์œผ๋กœ ์ถœ๋ ฅ 
GPIO.output(TRIG, False)
print("Waiting for sensor to settle")
time.sleep(2)

try:
    while True:    
        # Triger ํ•€์—  ํŽ„์Šค์‹ ํ˜ธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด 1 ์ถœ๋ ฅ               
        GPIO.output(TRIG, True)  
        time.sleep(0.00001)       # 10µs ๋”œ๋ ˆ์ด 
        GPIO.output(TRIG, False)
        
        while GPIO.input(ECHO)==0:
            start = time.time()      # Echo ํ•€ ์ƒ์Šน ์‹œ๊ฐ„ 
        while GPIO.input(ECHO)==1:
            stop= time.time         # Echo ํ•€ ํ•˜๊ฐ• ์‹œ๊ฐ„ 
            
        check_time = stop - start
        distance = check_time * 34300 / 2
        print("Distance : %.1f cm" % distance)
        time.sleep(0.4)         # 0.4์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์„ผ์„œ ์ธก์ • 
        
except KeyboardInterrrupt:
    print("Measurement stopped by User")
    GPIO.cleanup()

4. PIR(Passive Infrared Sensor) ์„ผ์„œ(HC-SR501) ์‹ค์Šต p. 147

์ ์™ธ์„  ์ธ์ฒด๊ฐ์ง€ ์„ผ์„œ๋Š” ์ ์™ธ์„ ์„ ํ†ตํ•ด ์‚ฌ๋žŒ์˜ ์›€์ง์ž„์„ ๊ฐ์ง€ํ•˜๋Š” ์„ผ์„œ๋‹ค.
๊ฑด๋ฌผ์˜ ๋ณต๋„๋‚˜ ํ˜„๊ด€๋ฌธ ์ฒœ์žฅ์— ์žˆ๋Š” ์กฐ๋ช… ๋“ฑ์— ์„ค์น˜๋˜์–ด ์‚ฌ๋žŒ์˜ ์›€์ง์ž„์ด ๊ฐ์ง€๋˜๋ฉด ์ž๋™์œผ๋กœ ์กฐ๋ช…์„ ์ผœ์ฃผ๋Š”๋ฐ ์ด์šฉ๋˜๋Š” ์„ผ์„œ๋‹ค.
๊ฐ์ง€ ๊ฐ๋„๋ฒ”์œ„ ์•ˆ์— ์ ์™ธ์„ ์˜ ๋ณ€ํ™”๊ฐ€ ์žˆ์„์‹œ High(1) ์‹ ํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์—†์„์‹œ Low(0) ์‹ ํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

HC-SR501 ์กฐ์ • ๋ฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•

GPIO 4 -> GPIO 17

(2) ํŒŒ์ด์ฌ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ p. 148
์‹ค์ŠตํŒŒ์ผ: /home/pi/webapps/ch05/PWM_Buzzer.py
HC_SR501.py

#-*-coding:utf-8-*-

# ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. 
import RPi.GPIO as GPIO
import time

#  ๋…ธ๋ž€์ƒ‰ LED, ๋นจ๊ฐ„์ƒ‰ LED, ์„ผ์„œ ์ž…๋ ฅํ•€ ๋ฒˆํ˜ธ ์„ค์ • 
led_R = 20
led_Y = 21
sensor = 17

# ๋ถˆํ•„์š”ํ•œ warning ์ œ๊ฑฐ,  GPIOํ•€์˜ ๋ฒˆํ˜ธ ๋ชจ๋“œ ์„ค์ •
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

# LED ํ•€์˜ IN/OUT(์ž…๋ ฅ/์ถœ๋ ฅ) ์„ค์ • 
GPIO.setup(led_R, GPIO.OUT)
GPIO.setup(led_Y, GPIO.OUT)
GPIO.setup(sensor, GPIO.IN)

print ("PIR Ready . . . . ")
time.sleep(5)  # PIR ์„ผ์„œ ์ค€๋น„ ์‹œ๊ฐ„

try:
    while True:
        if GPIO.input(sensor) == 1:   #์„ผ์„œ๊ฐ€ High(1)์ถœ๋ ฅ 
                GPIO.output(led_Y, 1)   # ๋…ธ๋ž€์ƒ‰ LED ์ผฌ 
                GPIO.output(led_R, 0)   # ๋นจ๊ฐ„์ƒ‰ LED ๋” 
                print("Motion Detected !")
                time.sleep(0.2)
                
        if GPIO.input(sensor) == 0:    #์„ผ์„œ๊ฐ€ Low(0)์ถœ๋ ฅ  
                GPIO.output(led_R, 1)   # ๋นจ๊ฐ„์ƒ‰ LED ์ผฌ 
                GPIO.output(led_Y, 0)   # ๋…ธ๋ž€์ƒ‰ LED ๋” 
                time.sleep(0.2)                    

except KeyboardInterrupt:
                print("Stopped by User")
                GPIO.cleanup()

PIR ์„ผ์„œ ๊ทผ์ฒ˜๋กœ ์‚ฌ๋žŒ์˜ ์›€์ง์ž„์ด ๊ฐ์ง€๋˜๋ฉด ๋…ธ๋ž€์ƒ‰ LED๋ฅผ ์ผœ๊ณ  ๊ฐ์ง€๋จ์„ ์ถœ๋ ฅํ•˜๊ณ ,
๊ฐ์ง€๋˜์ง€ ์•Š์„ ๋•Œ๋Š” ๋นจ๊ฐ„์ƒ‰ LED๋ฅผ ์ผœ๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•œ๋‹ค.


5. ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ์™€ SPI(Serial Peripheral Interface) ํ†ต์‹  p. 150



5.1 ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ๋ฅผ ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด๋กœ ์ฝ์–ด์˜ค๊ธฐ

 
(์ง์ ‘ ํšŒ๋กœ(Integrated Circuit)๋Š” ๋ฐ˜๋„์ฒด์— ๋งŒ๋“  ์ „์žํšŒ๋กœ์˜ ์ง‘ํ•ฉ์„ ๋งํ•œ๋‹ค.
์ฐธ๊ณ : https://devicemart.blogspot.com/2019/04/ic-posted-by-makefunny-pcb-ic.html)


ADC(Analog to Digital Converter)
๋Š” ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ๋ฅผ ๋””์ง€ํ„ธ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

 

 

MCP3008

MCP3008 ๋ฐ์ดํ„ฐ์‹œํŠธ

MCP3008์€ 8๊ฐœ์˜ ADC(Analog-to-Digital Converter) ์ฑ„๋„์ด ์žˆ๊ณ  ํ•ด์ƒ๋„(Resolution)๋Š” 10 bits์ด๊ณ  SPI ํ†ต์‹ ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ด์ƒ๋„๊ฐ€ 10 bits๋ผ๋Š” ๊ฒƒ์€ ์•„๋‚ ๋กœ๊ทธ ์ „์••์„ 2^10 = 1024 ๋งŒํผ ๋ถ„ํ•ดํ•ด์„œ ๋””์ง€ํ„ธ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ฆ‰ ์ž…๋ ฅ๋˜๋Š” ์•„๋‚ ๋กœ๊ทธ ์ „์••์ด ์ตœ๋Œ€ 3.3V ๋ผ๊ณ  ํ•˜๋ฉด 3.3V/1024= 3.22mV ์ด๊ณ , ์ด๊ฒƒ์ด ์ตœ์†Œ ๋‹จ์œ„ ์ฆ‰, 1์— ํ•ด๋‹นํ•˜๋Š” ์ „์••์ด ๋ฉ๋‹ˆ๋‹ค.

5.2 SPI ํ†ต์‹ ์˜ ์ดํ•ด

SPI(Serial Peripheral Interface) ํ†ต์‹ ์€ ๋งˆ์Šคํ„ฐ ์žฅ์น˜์™€ ์ฃผ๋ณ€์žฅ์น˜๋“ค๊ณผ์˜ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์„ ์œ„ํ•œ ํ†ต์‹ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ฃผ๋ณ€์žฅ์น˜๋Š” ํ”Œ๋ž˜์‰ฌ ๋ฉ”๋ชจ๋ฆฌ, ์„ผ์„œ, RTC(real time clock), ADC (analog to digital converter) ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” MCP3008 IC๋ฅผ ์ด์šฉํ•ด ์•„๋‚ ๋กœ๊ทธ ์„ผ์„œ๊ฐ’์„ ๋””์ง€ํ„ธ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด๋กœ ์ฝ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

SPI ํ†ต์‹  ์ƒ์„ธ ๋ถ„์„ ์ฐธ๊ณ : https://www.hardcopyworld.com/?p=2778

SPI ์‹ ํ˜ธ์„ 

MISO : ์Šฌ๋ ˆ์ด๋ธŒ์—์„œ ๋งˆ์Šคํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™
MOSI : ๋งˆ์Šคํ„ฐ์—์„œ ์Šฌ๋ ˆ์ด๋ธŒ๋กœ ํ…Œ์ดํ„ฐ๊ฐ€ ์ด๋™
SCLK  : ํ†ต์‹ ์˜ ๋™๊ธฐํ™”๋ฅผ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ์‹ ํ˜ธ๋กœ ๋งˆ์Šคํ„ฐ์—์„œ ๋งŒ๋“ค์–ด ๋ณด๋ƒ…๋‹ˆ๋‹ค.
CS / SS : ์Šฌ๋ ˆ์ด๋ธŒ๋ฅผ ์„ ํƒํ•˜๋Š” ์‹ ํ˜ธ์„ 

5.3 SPI ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์—์„œ ์„ค์ •ํ•˜๊ธฐ

02 ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด ์„ค์ •์ฐฝ์˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ SPI์™€ I2C๋ฅผ Enable๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

03 [OK] ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

04 ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด๋ฅผ ๋ฆฌ๋ถ€ํŒ…ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋‰ด์—์„œ Shutdown => Reboot๋ฅผ ํด๋ฆญํ•ด๋„ ๋˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ„ฐ๋ฏธ๋„์—์„œ sudo reboot์„ ์ž…๋ ฅํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.


5.4 ์•„๋‚ ๋กœ๊ทธ ์ „์••์„ MCP3008๋กœ ์ฝ์–ด์˜ค๊ธฐ

(3) ํŒŒ์ด์ฌ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ p. 155
์‹ค์ŠตํŒŒ์ผ: /home/pi/webapps/ch05/MCP_3008.py

#-*-coding:utf-8-*-

# ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
import spidev
import time

# ๋”œ๋ ˆ์ด ์‹œ๊ฐ„ (์„ผ์„œ ์ธก์ • ๊ฐ„๊ฒฉ)
delay = 0.5

# MCP3008 ์ฑ„๋„์ค‘ ์„ผ์„œ์— ์—ฐ๊ฒฐํ•œ ์ฑ„๋„ ์„ค์ •
pot_channel = 0

# SPI ์ธ์Šคํ„ด์Šค spi ์ƒ์„ฑ
spi = spidev.SpiDev()

# SPI ํ†ต์‹  ์‹œ์ž‘ํ•˜๊ธฐ
spi.open(0, 0)

# SPI ํ†ต์‹  ์†๋„ ์„ค์ •
spi.max_speed_hz = 100000

# readadc ํ•จ์ˆ˜์ •์˜
# 0 ~ 7 ๊นŒ์ง€ 8๊ฐœ์˜ ์ฑ„๋„์—์„œ SPI ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
def readadc(adcnum):
  if adcnum > 7 or adcnum < 0:
     return -1
  r = spi.xfer2([1, 8 + adcnum << 4, 0])
  data = ((r[1] & 3) << 8) + r[2]
     return data

while True:
  # readadc ํ•จ์ˆ˜๋กœ pot_channel์˜ SPI ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
  pot_value = readadc(pot_channel)
  print ("---------------------------------------")
  print("POT Value: %d" % pot_value)
  time.sleep(delay)   # delay ์‹œ๊ฐ„๋งŒํผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

r = spi.xfer2([1, 8 + adcnum << 4, 0])
1, 8 + adcnum << 4, 0 ๊ฐ ๊ฐ’์„ ๋ณด๋‚ธ๋‹ค. 
์ฐธ๊ณ : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=msyang59&logNo=220806962339

์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ฐ€๋ณ€์ €ํ•ญ ์ „์•• ์ฝ๊ธฐ

๊ฒฐ๊ณผ์ธ POT Value ๊ฐ’์„ ์—ญ์œผ๋กœ MCP3008์œผ๋กœ ์ž…๋ ฅ๋˜๋Š” ์ „์•• ์ˆ˜์น˜๋กœ ๋‹ค์Œ ๊ณต์‹์„ ํ†ตํ•ด ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ : https://www.youtube.com/watch?v=6VQIfGnMMt0

์ฐธ๊ณ : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=msyang59&logNo=220670170063

์ฐธ๊ณ : https://tobuymacbookpro.tistory.com/12


5.5 LDR ์„ผ์„œ ์‹ค์Šต

LDR(Light Dependent Resistor)
๊ด‘์„ผ์„œ ๋ชจ๋“ˆ๋กœ์จ ๋น›์˜ ์„ธ๊ธฐ์— ๋”ฐ๋ผ์„œ ์ €ํ•ญ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋Š” ์†Œ์ž
์ฃผ์œ„๊ฐ€ ๋ฐ์œผ๋ฉด ์ €ํ•ญ๊ฐ’์ด ์ค„์–ด๋“ค๊ณ ์ฃผ์œ„๊ฐ€ ์–ด๋‘์šฐ๋ฉด ์ €ํ•ญ๊ฐ’์ด ์ฆ๊ฐ€

์ฃผ์œ„๊ฐ€ ๋ฐ์œผ๋ฉด LDR ์„ผ์„œ์˜ ์ €ํ•ญ์ด ์ค„์–ด๋“ค์–ด 3.3์— ๊ฐ€๊นŒ์šด ์ „์••์ด ์ถœ๋ ฅ ๋ฐ˜๋Œ€๋กœ ์ฃผ์œ„๊ฐ€ ์–ด๋‘์šฐ๋ฉด LDR ์„ผ์„œ์˜ ์ €ํ•ญ์ด ์ปค์ ธ์„œ ์ „์••์ด ์ž‘์•„์ง

 

(2) ํŒŒ์ด์ฌ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ p. 157 - p. 158
์‹ค์ŠตํŒŒ์ผ: /home/pi/webapps/ch05/LDR.py

#-*- coding: utf-8 -*-

# ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
import spidev
import time

# ๋”œ๋ ˆ์ด ์‹œ๊ฐ„ (์„ผ์„œ ์ธก์ • ๊ฐ„๊ฒฉ)
delay = 0.5

# MCP3008 ์ฑ„๋„์ค‘ ์„ผ์„œ์— ์—ฐ๊ฒฐํ•œ ์ฑ„๋„ ์„ค์ •
ldr_channel = 0

# SPI ์ธ์Šคํ„ด์Šค spi ์ƒ์„ฑ
spi = spidev.SpiDev()
# SPI ํ†ต์‹  ์‹œ์ž‘ํ•˜๊ธฐ
spi.open(0, 0)
# SPI ํ†ต์‹  ์†๋„ ์„ค์ •
spi.max_speed_hz = 100000

# 0 ~ 7 ๊นŒ์ง€ 8๊ฐœ์˜ ์ฑ„๋„์—์„œ SPI ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ๋ฐ˜ํ™˜
def readadc(adcnum):
  if adcnum > 7 or adcnum < 0:
    return -1
  r = spi.xfer2([1, 8 + adcnum << 4, 0])
  data = ((r[1] & 3) << 8) + r[2]
    return data

while True:
 # readadc ํ•จ์ˆ˜๋กœ ldr_channel์˜ SPI ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์ €์žฅ
  ldr_value = readadc(ldr_channel)
  print ("---------------------------------------")
  print("LDR Value: %d" % ldr_value)
  time.sleep(delay)

5.6 ์กฐ์ด์Šคํ‹ฑ(Joystick) ์‹ค์Šต

X์ถ• Y์ถ• ์›€์ง์ž„์ด๋‚˜ ๋ฐฉํ–ฅ๋“ฑ์„ ํ‘œํ˜„
์กฐ์ด์Šคํ‹ฑ์„ ์ˆ˜์ง์œผ๋กœ ๋ˆŒ๋ ค์„œ ์Šค์œ„์น˜ ๊ธฐ๋Šฅ

(2) ํŒŒ์ด์ฌ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ p. 159 - p. 160
์‹ค์ŠตํŒŒ์ผ: /home/pi/webapps/ch05/Joystick.py

#-*- coding: utf-8 -*-
# ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
import spidev
import time

# ๋”œ๋ ˆ์ด ์‹œ๊ฐ„ (์„ผ์„œ ์ธก์ • ๊ฐ„๊ฒฉ)
delay = 0.5
# MCP3008 ์ฑ„๋„์„ค์ •
sw_channel = 0
vrx_channel = 1
vry_channel = 2

# SPI ์ธ์Šคํ„ด์Šค spi ์ƒ์„ฑ
spi = spidev.SpiDev()
# SPI ํ†ต์‹  ์‹œ์ž‘ํ•˜๊ธฐ
spi.open(0, 0)
# SPI ํ†ต์‹  ์†๋„ ์„ค์ •
spi.max_speed_hz = 100000

# 0 ~ 7 ๊นŒ์ง€ 8๊ฐœ์˜ ์ฑ„๋„์—์„œ SPI ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ๋ฐ˜ํ™˜
def readadc(adcnum):
  if adcnum > 7 or adcnum < 0:
    return -1
  r = spi.xfer2([1, 8 + adcnum << 4, 0])
  data = ((r[1] & 3) << 8) + r[2]
    return data

# ๋ฌดํ•œ๋ฃจํ”„
while True:
  # X, Y ์ถ• ํฌ์ง€์…˜๊ฐ’
  vrx_pos = readadc(vrx_channel)
  vry_pos = readadc(vry_channel)
  # ์Šค์œ„์น˜ ์ž…๋ ฅ
  sw_val = readadc(sw_channel)
  # ์ถœ๋ ฅ
  print("X : {} Y : {} SW : {}".format(vrx_pos, vry_pos, sw_val))
  # delay ์‹œ๊ฐ„๋งŒํผ ๊ธฐ๋‹ค๋ฆผ
  time.sleep(delay)

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

์กฐ์ด์Šคํ‹ฑ์„ ์›€์ง์ด์ง€ ์•Š์„ ๋•Œ X์ถ•๊ณผ Y์ถ•์ด 500 ์ •๋„์ด๊ณ  X์ถ• Y์ถ•์„ ์ขŒ์šฐ๋กœ ์›€์ง์ด๋ฉด 0 ~ 1023๊นŒ์ง€ ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์กฐ์ด์Šคํ‹ฑ์„ ์•„๋ž˜๋กœ ๋ˆŒ๋ €์„ ๋•Œ SW๋Š” 0์ด๊ณ  ๋ˆŒ๋ฆฌ์ง€ ์•Š์œผ๋ฉด 1023์œผ๋กœ ์œ ์ง€๋œ๋‹ค.


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