์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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๐ณ๐
[46] 230306 Ch. 5 ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด GPIO ๋ฐ ์ผ์ ํ์ฉํ๊ธฐ: 3. ์ด์ํ์ผ์(HC-SR04) ์ค์ต, 4. PIR(Passive Infrared Sensor) ์ผ์(HC-SR501) ์ค์ต, 5. ์๋ ๋ก๊ทธ ์ ํธ์ SPI(Serial Peripheral Interface) ํต์ [K-๋์งํธ ํธ๋ ์ด๋ 4.. ๋ณธ๋ฌธ
[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:49230306 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
์ค๋ ๋ฐฐ์ด ๊ฒ ์ค ๊ธฐ์ตํ ๊ฒ์ ์ ๋ฆฌํ๋ค.
๋ชฐ๋๋ ๊ฒ ์ ๋ฆฌ
์ง์ ํ๋ก(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
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 ์๋ ๋ก๊ทธ ์ ํธ๋ฅผ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด๋ก ์ฝ์ด์ค๊ธฐ
์ฐธ๊ณ : https://devicemart.blogspot.com/2019/04/ic-posted-by-makefunny-pcb-ic.html)
ADC(Analog to Digital Converter)๋ ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์๋ ๋ก๊ทธ ์ ํธ๋ฅผ ๋์งํธ๋ก ๋ณํํ๋ค.
MCP3008
ํด์๋๊ฐ 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 ์ ํธ์
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 ์ผ์ ์ค์ต
(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) ์ค์ต
(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์ผ๋ก ์ ์ง๋๋ค.