Python์ผ๋ก ์๋ฒ ๋๋ ์์คํ ์ ์ธ๊ณ๋ฅผ ํํํ์ธ์. ์ด ์ข ํฉ ๊ฐ์ด๋๋ MicroPython, CircuitPython, ํ๋์จ์ด ํตํฉ ๋ฐ ์ ์ธ๊ณ ์์ฒญ์๋ฅผ ์ํ ์ค์ ํ๋ก์ ํธ๋ฅผ ๋ค๋ฃน๋๋ค.
Python on the Metal: ์๋ฒ ๋๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ ํตํฉ ์ฌ์ธต ๋ถ์
์์ญ ๋ ๋์ ์ค๋งํธ์์น๋ถํฐ ์ฐ์ ๊ธฐ๊ณ๊น์ง ๋ชจ๋ ๊ฒ์ ๊ตฌ๋ํ๋ ์์ ์ปดํจํฐ์ธ ์๋ฒ ๋๋ ์์คํ ์ ์ธ๊ณ๋ C, C++, ์ด์ ๋ธ๋ฆฌ์ ๊ฐ์ ์ ์์ค ์ธ์ด์ ์ ์ ๋ฌผ์ด์์ต๋๋ค. ์ด๋ฌํ ์ธ์ด๋ ๋น๊ตํ ์ ์๋ ์ ์ด๋ ฅ๊ณผ ์ฑ๋ฅ์ ์ ๊ณตํ์ง๋ง, ๋ฐฐ์ฐ๊ธฐ ์ด๋ ต๊ณ ๊ฐ๋ฐ ์ฃผ๊ธฐ๊ฐ ๊ธธ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ์ด์ ๋จ์์ฑ, ๊ฐ๋ ์ฑ, ๋ฐฉ๋ํ ์ํ๊ณ๋ก ์ ๋ช ํ Python์ด ๋ฑ์ฅํ์ต๋๋ค. ํ๋ ์น ์๋ฒ์ ๋ฐ์ดํฐ ๊ณผํ์ ๊ตญํ๋์๋ Python์ด ์ด์ ํ๋์จ์ด์ ์ฌ์ฅ๋ถ๋ก ๊ฐ๋ ฅํ๊ฒ ์ง์ถํ์ฌ ์ ์ธ๊ณ์ ์๋ก์ด ๊ฐ๋ฐ์, ์ทจ๋ฏธ ์ ํธ๊ฐ ๋ฐ ํ์ ๊ฐ๋ค์๊ฒ ์ ์๊ณตํ์ ๋ณด๊ธํ๊ณ ์์ต๋๋ค.
์ด ๊ฐ์ด๋๋ Python ์๋ฒ ๋๋ ํ๋ก๊ทธ๋๋ฐ์ ํฅ๋ฏธ๋ก์ด ์ธ๊ณ์ ๋ํ ํฌ๊ด์ ์ธ ์๊ฐ์ ๋๋ค. Python๊ณผ ๊ฐ์ ๊ณ ์์ค ์ธ์ด๊ฐ ํ๋์จ์ด๋ฅผ ์ง์ ์ ์ดํ๋ ๋ฐฉ๋ฒ, ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ฃผ์ ํ๋ซํผ, ๊ทธ๋ฆฌ๊ณ ์ํํธ์จ์ด์์ ์ค๋ฆฌ์ฝ๊น์ง ์ฌ์ ์ ์์ํ๊ธฐ ์ํ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Python ์๋ฒ ๋๋ ์ํ๊ณ: CPython ๊ทธ ์ด์
์ผ๋ฐ์ ์ธ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ์ ๋ ธํธ๋ถ์์ ์ฌ์ฉํ๋ ํ์ค Python(CPython์ด๋ผ๊ณ ๋ ํจ)์ ๋จ์ํ ์ค์นํ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ์ฅ์น๋ RAM์ ํฌ๋ก๋ฐ์ดํธ, ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๋ฉ๊ฐํค๋ฅด์ธ ๋จ์๋ก ๋ฆฌ์์ค๊ฐ ๊ทน๋๋ก ์ ํ์ ์ ๋๋ค. ์ด๋ ์ต์ ์ปดํจํฐ์ ๊ธฐ๊ฐ๋ฐ์ดํธ ๋ฐ ๊ธฐ๊ฐํค๋ฅด์ธ ์๋ ๊ทน๋ช ํ ๋์กฐ๋ฅผ ์ด๋ฃน๋๋ค. ์ด ๊ฐ๊ทน์ ๋ฉ์ฐ๊ธฐ ์ํด Python์ ํน์ํ๊ณ ๊ฐ๋ฒผ์ด ๊ตฌํ์ด ๋ง๋ค์ด์ก์ต๋๋ค.
MicroPython: ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ๋ฅผ ์ํ Python
MicroPython์ ์ ์ฝ์ด ์๋ ํ๋์จ์ด์์ ์คํ๋๋๋ก ์ต์ ํ๋ Python 3 ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์์ ํ ์ฌ์์ฑ์ ๋๋ค. Damien George๊ฐ ๋ง๋ค์์ผ๋ฉฐ, ํ์ค Python๊ณผ์ ํธํ์ฑ์ ์ต๋ํ ์ ์งํ๋ฉด์ ํ๋์จ์ด์ ๋ํ ์ง์ ์ ์ด๊ณ ์ ์์ค์ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
- ์ฃผ์ ํน์ง: ์ปดํ์ผ ๋จ๊ณ ์์ด ๋ณด๋์ ์ฐ๊ฒฐํ๊ณ ์ฝ๋๋ฅผ ํ ์ค์ฉ ์คํํ ์ ์๋ ๋ํํ REPL(Read-Eval-Print Loop)์ด ํฌํจ๋์ด ์์ต๋๋ค. ๋งค์ฐ ํจ์จ์ ์ด๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ ์ผ๋ฉฐ,
machine๊ณผ ๊ฐ์ ๊ฐ๋ ฅํ ๋ชจ๋์ ํตํด ์ง์ ์ ์ธ ํ๋์จ์ด ์ ์ด(GPIO, I2C, SPI ๋ฑ)๊ฐ ๊ฐ๋ฅํฉ๋๋ค. - ์ ํฉํ ๋์: ์ต๊ณ ์ ์ฑ๋ฅ, ํ๋์จ์ด์ ๋ํ ์ธ๋ฐํ ์ ์ด, ๊ด๋ฒ์ํ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ ๊ฐ์ ํธํ์ฑ์ ์ํ๋ ๊ฐ๋ฐ์์๊ฒ ์ ํฉํฉ๋๋ค. "๋ฉํ"์ ๋ ๊ฐ๊น๊ณ ์ฑ๋ฅ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฃผ ์ ํธ๋ฉ๋๋ค.
CircuitPython: ์ด๋ณด์๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ
CircuitPython์ DIY ์ ์์ ํ ๋ถ์ผ์ ์ ๋ ๊ธฐ์ ์ธ Adafruit์์ ๋ง๋ค๊ณ ์ ์ง ๊ด๋ฆฌํ๋ MicroPython์ ํฌํฌ์ ๋๋ค. MicroPython๊ณผ ํต์ฌ์ ๊ณต์ ํ์ง๋ง, ์ฌ์ฉ ํธ์์ฑ๊ณผ ๊ต์ก์ ์ค์ ์ ๋ ์ฒ ํ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ์ฃผ์ ํน์ง: ๊ฐ์ฅ ๋์ ๋๋ ํน์ง์ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ๋ฅผ ์ปดํจํฐ์ ํ์ํ๋ ๋ฐฉ์์
๋๋ค. CircuitPython ๋ณด๋๋ฅผ ์ฐ๊ฒฐํ๋ฉด ์์ USB ๋๋ผ์ด๋ธ๋ก ๋ํ๋ฉ๋๋ค. ์ด ๋๋ผ์ด๋ธ์์
code.pyํ์ผ์ ํธ์งํ๊ณ ์ ์ฅํ๋ฉด ๋ณด๋๊ฐ ์๋์ผ๋ก ๋ค์ ๋ก๋๋๊ณ ์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. ๋ํ ์ง์๋๋ ๋ชจ๋ ๋ณด๋์์ ํตํฉ๋ API๋ฅผ ์ ๊ณตํ๋ฏ๋ก, ํ ๋ณด๋์์ ์ผ์๋ฅผ ์ฝ๋ ์ฝ๋๊ฐ ์ต์ํ์ ๋ณ๊ฒฝ์ผ๋ก ๋ค๋ฅธ ๋ณด๋์์๋ ์๋ํฉ๋๋ค. - ์ ํฉํ ๋์: ์ด๋ณด์, ๊ต์ก์ ๋ฐ ๋น ๋ฅธ ํ๋กํ ํ์ดํ์ ์ค์ ์ ๋ ๋ชจ๋ ์ฌ๋์๊ฒ ์ ํฉํฉ๋๋ค. ํ์ต ๊ณก์ ์ด ์๋งํ๋ฉฐ Adafruit์์ ์ ๊ณตํ๋ ๊ด๋ฒ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ๋ฅผ ํตํด ์ผ์, ๋์คํ๋ ์ด ๋ฐ ๊ธฐํ ๊ตฌ์ฑ ์์๋ฅผ ๋งค์ฐ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
MicroPython vs. CircuitPython: ๋น ๋ฅธ ๋น๊ต
๋ ์ฌ์ด์ ์ ํ์ ํ๋ก์ ํธ ๋ชฉํ์ ๊ฒฝํ ์์ค์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ์ฒ ํ: MicroPython์ ํ๋์จ์ด๋ณ ๊ธฐ๋ฅ๊ณผ ์ฑ๋ฅ์ ์ฐ์ ์ํฉ๋๋ค. CircuitPython์ ๋จ์์ฑ, ์ผ๊ด์ฑ ๋ฐ ํ์ต ์ฉ์ด์ฑ์ ์ฐ์ ์ํฉ๋๋ค.
- ์ํฌํ๋ก์ฐ: MicroPython์ ์ฌ์ฉํ ๋๋ ์ผ๋ฐ์ ์ผ๋ก Thonny์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฅ์น์ REPL์ ์ฐ๊ฒฐํ๊ณ ํ์ผ์ ์
๋ก๋ํฉ๋๋ค. CircuitPython์ ์ฌ์ฉํ ๋๋
code.pyํ์ผ์ USB ๋๋ผ์ด๋ธ๋ก ๋์ด๋ค ๋์ต๋๋ค. - ํ๋์จ์ด ์ง์: MicroPython์ ๋ง์ ์ ์กฐ์ ์ฒด์ ๊ด๋ฒ์ํ ๋ณด๋๋ฅผ ์ง์ํฉ๋๋ค. CircuitPython์ ์ฃผ๋ก Adafruit ๋ฐ ์ผ๋ถ ํ์ฌ ํํธ๋์ ๋ณด๋๋ฅผ ์ง์ํ์ง๋ง, ์ง์์ด ๊น๊ณ ๋ฌธ์ํ๊ฐ ์ ๋์ด ์์ต๋๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ: CircuitPython์ ์ค์นํ๊ธฐ ์ฌ์ด ๋ฐฉ๋ํ๊ณ ์์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธํธ๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค. MicroPython ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ์ฉํ ์ ์์ง๋ง ๋ ํํธํ๋ ์ ์์ต๋๋ค.
์ด ๊ฐ์ด๋์์๋ ๊ฐ๋ ๊ณผ ๋ง์ ์ฝ๋ ์์ ๊ฐ ์ฌ์ํ ์์ ์ผ๋ก ๋ ๊ฐ์ง ๋ชจ๋์ ์ ์ฉ๋ ๊ฒ์ ๋๋ค. ์ค์ํ ์ฐจ์ด์ ์ ๋ช ์ํ๊ฒ ์ต๋๋ค.
ํ๋์จ์ด ์ ํ: ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ ์ ์ฅ
Python์ ์คํํ ์ ์๋ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ(MCU)์ ์๊ฐ ์ต๊ทผ ๋ช ๋ ๊ฐ ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ์ต๋๋ค. ์ ์ธ๊ณ ์์ฒญ์๋ฅผ ์ํด ๊ฐ์ฅ ์ธ๊ธฐ ์๊ณ ์ ๊ทผํ๊ธฐ ์ฌ์ด ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Raspberry Pi Pico & RP2040
์ ์ Raspberry Pi ์ปดํจํฐ์ ํผ๋ํ๋ฉด ์ ๋ฉ๋๋ค. Pico๋ ๋ง์ถคํ RP2040 ์นฉ์ ์ค์ฌ์ผ๋ก ์ ์๋ ์ ๋ ดํ๊ณ ๊ณ ์ฑ๋ฅ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ ๋ณด๋์ ๋๋ค. Python์ ํ๋์จ์ด์์ ์ฌ์ฉํ๋ ๋ฐ ์์ด ์ ์ธ๊ณ์ ์ผ๋ก ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ต๋๋ค.
- ์ฃผ์ ํน์ง: ๊ฐ๋ ฅํ ๋์ผ ์ฝ์ด ARM Cortex-M0+ ํ๋ก์ธ์, ๋๋ํ 264KB RAM, ๋ง์ถคํ ํ๋์จ์ด ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์ ์๋ Programmable I/O(PIO)๋ผ๋ ๊ณ ์ ํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ต์ Pico W ๋ชจ๋ธ์ ์จ๋ณด๋ Wi-Fi๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
- Python์ ์ ํฉํ ์ด์ : MicroPython์ ๋ํ ๊ณต์์ ์ด๊ณ ์ต์ฐ์ ์ ์ธ ์ง์์ ๋ฐ์ผ๋ฉฐ CircuitPython์์๋ ์ ์ง์๋ฉ๋๋ค. ์ ๋ ดํ ๊ฐ๊ฒฉ(์ข ์ข 10๋ฌ๋ฌ ๋ฏธ๋ง)๊ณผ ๊ฐ๋ ฅํ ์ฑ๋ฅ์ ๋๋ผ์ด ๊ฐ์น๋ฅผ ์ ๊ณตํฉ๋๋ค.
Espressif ESP32 & ESP8266
์ํ์ด ๊ธฐ๋ฐ ํ์ฌ์ธ Espressif Systems์์ ๋ง๋ ESP ์นฉ ์ ํ๊ตฐ์ IoT์ ๋ฌด์ ์ ์ฑํผ์ธ์ ๋๋ค. ํตํฉ Wi-Fi ๋ฐ Bluetooth ๊ธฐ๋ฅ์ ๊ฐ์ถ๊ณ ์์ด ์ฐ๊ฒฐ๋ ํ๋ก์ ํธ์ ๊ธฐ๋ณธ ์ ํ์ ๋๋ค.
- ์ฃผ์ ํน์ง: ๊ฐ๋ ฅํ ๋จ์ผ ๋๋ ๋์ผ ์ฝ์ด ํ๋ก์ธ์, ๋ด์ฅ Wi-Fi ๋ฐ(ESP32์ ๊ฒฝ์ฐ) Bluetooth. ์ ์ธ๊ณ ์ ์กฐ์ ์ฒด์ ์์ฒ ๊ฐ์ง ๋ค์ํ ๊ฐ๋ฐ ๋ณด๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Python์ ์ ํฉํ ์ด์ : ๋ฐ์ด๋ MicroPython ์ง์์ ํตํด ๋ช ์ค์ Python ์ฝ๋๋ก ์ฐ๊ฒฐ๋ ์ฅ์น๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์น ์๋ฒ ์คํ ๋๋ ์ฌ๋ฌ ์ผ์์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ฐ์ ๋ณต์กํ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
Adafruit Feather, ItsyBitsy ๋ฐ Trinket ์ํ๊ณ
Adafruit๋ ํ์คํ๋ ํผ ํฉํฐ๋ก ๋ค์ํ ๋ณด๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ํน์ ์นฉ์ด ์๋๋ผ CircuitPython ์ํ๊ณ ๋ด์์ ์ํํ๊ฒ ์๋ํ๋๋ก ์ค๊ณ๋ ์ ํ๊ตฐ์ ๋๋ค.
- ์ฃผ์ ํน์ง: Feather ์ ํ๊ตฐ์ ๋ณด๋๋ ๊ณตํต ํ ๋ฐฐ์ด์ ๊ณต์ ํ์ฌ ์ํธ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๋ง์ ๋ณด๋์ ๋ด์ฅ ๋ฐฐํฐ๋ฆฌ ์ถฉ์ ํ๋ก ๋ฐ ์ปค๋ฅํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. RP2040, ESP32 ๋ฑ ๋ค์ํ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Python์ ์ ํฉํ ์ด์ : CircuitPython์ ์ํด ์ฒ์๋ถํฐ ์ค๊ณ๋์์ต๋๋ค. ์ด๋ฌํ ๊ธด๋ฐํ ํตํฉ์ ์๋ฐฑ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํํ ๋ฆฌ์ผ์ ๋ํ ์ก์ธ์ค๋ฅผ ํตํด ์ํํ๊ณ ํ๋ฌ๊ทธ ์ค ํ๋ ์ด ํ๊ฒฝ์ ์๋ฏธํฉ๋๋ค.
์์ํ๊ธฐ: ํ๋์จ์ด์์์ ์ฒซ "Hello, World"
์ด๋ก ์์ ์ค์ฒ์ผ๋ก ๋์ด๊ฐ ๋ณด๊ฒ ์ต๋๋ค. ์๋ฒ ๋๋ ํ๋ก๊ทธ๋๋ฐ์ ์ ํต์ ์ธ "Hello, World"๋ LED ๊น๋ฐ์์ ๋๋ค. ์ด ๊ฐ๋จํ ์์ ์ ์ฝ๋ ํธ์ง๊ธฐ๋ถํฐ ๋ณด๋์ ํ์จ์ด๊น์ง ์ ์ฒด ํด์ฒด์ธ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํฉ๋๋ค.
์ฌ์ ์๊ตฌ ์ฌํญ
- ์ง์๋๋ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ ๋ณด๋(์: Raspberry Pi Pico, ESP32 ๋๋ Adafruit ๋ณด๋).
- ๋ฐ์ดํฐ ์ ์ก์ ์ง์ํ๋ USB ์ผ์ด๋ธ(์ถฉ์ ์ ์ฉ์ด ์๋).
- ์ปดํจํฐ(Windows, macOS ๋๋ Linux).
1๋จ๊ณ: ํ์จ์ด ์ค์น
๋ณด๋์ MicroPython ๋๋ CircuitPython ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค. ์ด๋ฅผ "ํ์จ์ด ํ๋์ฑ"์ด๋ผ๊ณ ํฉ๋๋ค.
- CircuitPython์ ๊ฒฝ์ฐ: circuitpython.org๋ฅผ ๋ฐฉ๋ฌธํ์ฌ ๋ณด๋๋ฅผ ์ฐพ๊ณ
.uf2ํ์ผ์ ๋ค์ด๋ก๋ํฉ๋๋ค. ๋ณด๋๋ฅผ ๋ถํธ๋ก๋ ๋ชจ๋๋ก ์ ํํฉ๋๋ค(๋ณดํต "BOOT" ๋๋ "RESET" ๋ฒํผ์ ๋๋ฅธ ์ํ์์ ์ฐ๊ฒฐ). USB ๋๋ผ์ด๋ธ๋ก ๋ํ๋ฉ๋๋ค. ๋ค์ด๋ก๋ํ.uf2ํ์ผ์ ํด๋น ๋๋ผ์ด๋ธ๋ก ๋์ด๋ค ๋์ต๋๋ค. ๋๋ผ์ด๋ธ๊ฐ ๋ถ๋ฆฌ๋์๋ค๊ฐ ๋ค์ ๋ํ๋๋ฉฐ ์ด์ CIRCUITPY๋ผ๊ณ ์ด๋ฆ์ด ์ง์ ๋ฉ๋๋ค. - MicroPython์ ๊ฒฝ์ฐ: micropython.org๋ฅผ ๋ฐฉ๋ฌธํ์ฌ ๋ณด๋๋ฅผ ์ฐพ๊ณ ํ์จ์ด ํ์ผ(์ข
์ข
.uf2๋๋.binํ์ผ)์ ๋ค์ด๋ก๋ํฉ๋๋ค. ํ๋ก์ธ์ค๋ ์ ์ฌํฉ๋๋ค. ๋ณด๋๋ฅผ ๋ถํธ๋ก๋ ๋ชจ๋๋ก ์ ํํ๊ณ ํ์ผ์ ๋ณต์ฌํฉ๋๋ค.
2๋จ๊ณ: ํธ์ง๊ธฐ ์ค์
ํ ์คํธ ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง, ์ ์ฉ IDE๋ ๊ฐ๋ฐ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. Thonny IDE๋ ์ด๋ณด์์๊ฒ ๊ฐ๋ ฅํ ๊ถ์ฅ๋ฉ๋๋ค. ๋ฌด๋ฃ์ด๋ฉฐ ํฌ๋ก์ค ํ๋ซํผ์ด๋ฉฐ MicroPython ๋ฐ CircuitPython์ ๋ํ ๋ด์ฅ ์ง์์ด ํฌํจ๋์ด ์์ต๋๋ค. ๋ณด๋๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ์ฅ์น์ REPL์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ฉฐ ํ์ผ์ ์ฝ๊ฒ ์ ๋ก๋ํ ์ ์์ต๋๋ค.
3๋จ๊ณ: LED ๊น๋ฐ์ ์ฝ๋
์ด์ ์ฝ๋์
๋๋ค. MicroPython์ ๊ฒฝ์ฐ main.py๋ผ๋ ์ ํ์ผ์ ๋ง๋ค๊ฑฐ๋ CircuitPython์ ๊ฒฝ์ฐ ๊ธฐ์กด code.py๋ฅผ ํธ์งํฉ๋๋ค.
Raspberry Pi Pico W์์ MicroPython ์์ :
import machine
import utime
# Pico W์ ์จ๋ณด๋ LED๋ "LED"๋ผ๋ ํน๋ณํ ์ด๋ฆ์ผ๋ก ์ก์ธ์ค๋ฉ๋๋ค.
led = machine.Pin("LED", machine.Pin.OUT)
while True:
led.toggle()
print("LED ํ ๊ธ๋จ!")
utime.sleep(0.5) # 0.5์ด ๋๊ธฐ
๋๋ถ๋ถ์ Adafruit ๋ณด๋์์ CircuitPython ์์ :
import board
import digitalio
import time
# ์จ๋ณด๋ LED๋ ์ผ๋ฐ์ ์ผ๋ก 'LED'๋ผ๋ ํ์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = not led.value
print("LED ํ ๊ธ๋จ!")
time.sleep(0.5)
์ฝ๋ ์ค๋ช :
import: ํ๋์จ์ด ์ ์ด(machine,digitalio,board) ๋ฐ ์๊ฐ ๊ด๋ฆฌ(utime,time)๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.- ํ ์ค์ : ์ ์ดํ๋ ค๋ ๋ฌผ๋ฆฌ์ ํ(์จ๋ณด๋ LED)์ ์ ์ํ๊ณ ์ถ๋ ฅ์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค.
- ๋ฃจํ:
while True:๋ฃจํ๋ ์์ํ ์คํ๋ฉ๋๋ค. ๋ฃจํ ์์์ LED ์ํ๋ฅผ ํ ๊ธํ๊ณ (์ผ์ง-๊บผ์ง ๋๋ ๊บผ์ง-์ผ์ง), ์ง๋ ฌ ์ฝ์(Thonny์์ ๋ณด์)์ ๋ฉ์์ง๋ฅผ ์ธ์ํ๊ณ , 0.5์ด ๋์ ์ผ์ ์ค์งํฉ๋๋ค.
์ด ํ์ผ์ ์ฅ์น์ ์ ์ฅํฉ๋๋ค. ์จ๋ณด๋ LED๊ฐ ์ฆ์ ๊น๋ฐ์ด๊ธฐ ์์ํด์ผ ํฉ๋๋ค. ์ถํํฉ๋๋ค. ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ์์ ์ง์ Python์ ์คํํ์ต๋๋ค!
๋ ๊น์ด ํ๊ณ ๋ค๊ธฐ: ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ์์ Python์ ํต์ฌ ๊ฐ๋
LED๋ฅผ ๊น๋ฐ์ด๋ ๊ฒ์ ์์์ผ ๋ฟ์ ๋๋ค. ๋ ๋ณต์กํ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ฌ์ฉํ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ฒ์ฉ ์ ์ถ๋ ฅ(GPIO)
GPIO ํ์ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ๊ฐ ์ธ์๊ณผ ์ํธ ์์ฉํ ์ ์๋๋ก ํ๋ ๋ฌผ๋ฆฌ์ ์ฐ๊ฒฐ์ ๋๋ค. ์ ์ถ๋ ฅ(์ผ์ ๋๋ ๋ฒํผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์ํด) ๋๋ ์ถ๋ ฅ(LED, ๋ชจํฐ ๋๋ ๋ฆด๋ ์ด๋ฅผ ์ ์ดํ๊ธฐ ์ํด)์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
๋ฒํผ ๋๋ฆ ์ฝ๊ธฐ(MicroPython):
import machine
import utime
button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
while True:
if button.value() == 1:
print("๋ฒํผ์ด ๋๋ ธ์ต๋๋ค!")
utime.sleep(0.1)
์ฌ๊ธฐ์๋ ํ 14๋ฅผ ๋ด๋ถ ํ๋ค์ด ์ ํญ์ด ์๋ ์ ๋ ฅ์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค. ๋ฃจํ๋ ๋ฒํผ์ ๊ฐ์ด 1(๋์)์ธ์ง ์ง์์ ์ผ๋ก ํ์ธํ์ฌ ๋ฒํผ์ด ๋๋ ธ์์ ๋ํ๋ ๋๋ค.
์ผ์ ์ฌ์ฉ
๋๋ถ๋ถ์ ํฅ๋ฏธ๋ก์ด ํ๋ก์ ํธ์๋ ์ผ์๊ฐ ํฌํจ๋ฉ๋๋ค. Python์ ์ฌ์ฉํ๋ฉด ์๋ ๋ก๊ทธ ๋ฐ ๋์งํธ ์ผ์ ๋ชจ๋์์ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์๋ ๋ก๊ทธ ์ผ์: ๊ด ์ ํญ๊ธฐ(๋น ์ธก์ ) ๋๋ ํฌํ ์ ๋ฏธํฐ์ ๊ฐ์ ์ด๋ฌํ ์ผ์๋ ๊ฐ๋ณ ์ ์์ ์ ๊ณตํฉ๋๋ค. ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ์ ADC(์๋ ๋ก๊ทธ-๋์งํธ ๋ณํ๊ธฐ)๋ ์ด ์ ์์ ์ฝ๊ณ ์ซ์๋ก ๋ณํํฉ๋๋ค.
- ๋์งํธ ์ผ์: ์ด๋ฌํ ๊ณ ๊ธ ์ผ์(์จ๋/์ต๋ ์ผ์, ๊ฐ์๋๊ณ ๋ฑ)๋ ํน์ ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ํต์ ํฉ๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ ๊ฐ์ง๋ I2C(Inter-Integrated Circuit) ๋ฐ SPI(Serial Peripheral Interface)์ ๋๋ค. ์ด๋ฌํ ํ๋กํ ์ฝ์ ๋ช ๊ฐ์ ํ๋ง ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ฅ์น๊ฐ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ์ ํต์ ํ ์ ์๋๋ก ํฉ๋๋ค. ๋คํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํต์ ์ ์ฒ๋ฆฌํ๋ฏ๋ก ์ ์์ค ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ํ์๋ ๊ฑฐ์ ์์ต๋๋ค.
BMP280 ์ผ์๋ก ์จ๋ ์ฝ๊ธฐ(CircuitPython):
import board
import adafruit_bmp280
# I2C ๋ฒ์ค ๊ฐ์ฒด ์์ฑ
i2c = board.I2C() # ๊ธฐ๋ณธ SCL ๋ฐ SDA ํ ์ฌ์ฉ
# ์ผ์ ๊ฐ์ฒด ์์ฑ
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
# ์จ๋ ์ฝ๊ธฐ
temperature = bmp280.temperature
print(f"์จ๋: {temperature:.2f} C")
PWM(ํ์ค ํญ ๋ณ์กฐ)
PWM์ ๋์งํธ ํ์์ ์๋ ๋ก๊ทธ ์ถ๋ ฅ์ ์๋ฎฌ๋ ์ด์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ ๋๋ค. ํ์ ๋น ๋ฅด๊ฒ ์ผ๊ณ ๋์ผ๋ก์จ ํ๊ท ์ ์์ ์ ์ดํ ์ ์์ผ๋ฉฐ, ์ด๋ LED๋ฅผ ๋๋ฐํ๊ฑฐ๋ DC ๋ชจํฐ ์๋๋ฅผ ์ ์ดํ๊ฑฐ๋ ์๋ณด ๋ชจํฐ ์์น๋ฅผ ์ ์ดํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์ฐ๊ฒฐ์ฑ ๋ฐ ์ฌ๋ฌผ ์ธํฐ๋ท(IoT)
ESP32 ๋ฐ Pico W์ ๊ฐ์ ๋ณด๋๊ฐ ์ง์ ํ ๋น์ ๋ฐํ๋ ๊ณณ์ ๋๋ค. ๋ด์ฅ Wi-Fi๋ฅผ ํตํด Python์ ์ฌ์ฉํ๋ฉด IoT ์ฅ์น๋ฅผ ๋๋ผ์ธ ์ ๋๋ก ๊ฐ๋จํ๊ฒ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
Wi-Fi ์ฐ๊ฒฐ
์ฅ์น๋ฅผ ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์ฒซ ๋ฒ์งธ ๋จ๊ณ์
๋๋ค. ๋คํธ์ํฌ ์๊ฒฉ ์ฆ๋ช
์ ์์ ํ๊ฒ ์ ์ฅํ๊ธฐ ์ํด(CircuitPython์์ ์ข
์ข
secrets.py๋ผ๊ณ ํจ) ํ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
ESP32๋ฅผ Wi-Fi์ ์ฐ๊ฒฐ(MicroPython):
import network
SSID = "YourNetworkName"
PASSWORD = "YourNetworkPassword"
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(SSID, PASSWORD)
while not station.isconnected():
pass
print("์ฐ๊ฒฐ ์ฑ๊ณต")
print(station.ifconfig())
์น ์์ฒญ ๋ง๋ค๊ธฐ
์ฐ๊ฒฐ๋๋ฉด ์ธํฐ๋ท๊ณผ ์ํธ ์์ฉํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค(API)์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋, ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์น ์๋น์ค์ ๊ฒ์ํ๊ฑฐ๋, ์จ๋ผ์ธ ์์ ์ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค.
API์์ JSON ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ(`urequests` ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ):
import urequests
response = urequests.get("http://worldtimeapi.org/api/timezone/Etc/UTC")
data = response.json()
print(f"ํ์ฌ UTC ์๊ฐ: {data['datetime']}")
response.close()
MQTT: IoT์ ์ธ์ด
HTTP๋ ์ ์ฉํ์ง๋ง IoT ํต์ ์ ํ์ค์ MQTT(Message Queuing Telemetry Transport)์ ๋๋ค. ์ ๋์ญํญ, ๊ณ ์ง์ฐ ๋คํธ์ํฌ์ฉ์ผ๋ก ์ค๊ณ๋ ๊ฒฝ๋ ๊ฒ์-๊ตฌ๋ ํ๋กํ ์ฝ์ ๋๋ค. ์ฅ์น๋ "ํ ํฝ"์ผ๋ก ์ผ์ ๋ฐ์ดํฐ๋ฅผ "๊ฒ์"ํ ์ ์์ผ๋ฉฐ, ํด๋น ํ ํฝ์ "๊ตฌ๋ "ํ๋ ๋ค๋ฅธ ์ฅ์น(๋๋ ์๋ฒ)๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์์ ํฉ๋๋ค. ์ด๋ ์น ์๋ฒ๋ฅผ ์ง์์ ์ผ๋ก ํด๋งํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ ๋๋ค.
๊ณ ๊ธ ์ฃผ์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
ํ๋ก์ ํธ๊ฐ ์ฑ์ฅํจ์ ๋ฐ๋ผ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ์ ํ๊ณ๋ฅผ ์ ํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ฒฌ๊ณ ํ ์๋ฒ ๋๋ Python ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: RAM์ ๊ฐ์ฅ ๊ท์คํ ๋ฆฌ์์ค์
๋๋ค. ๋ฃจํ ๋ด์์ ๋ชฉ๋ก์ด๋ ๊ธด ๋ฌธ์์ด๊ณผ ๊ฐ์ ํฐ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ ํผํ์ญ์์ค.
gc๋ชจ๋(import gc; gc.collect())์ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ๊ฐ๋น์ง ์์ง์ ํธ๋ฆฌ๊ฑฐํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํฉ๋๋ค. - ์ ๋ ฅ ๊ด๋ฆฌ: ๋ฐฐํฐ๋ฆฌ๋ก ์๋ํ๋ ์ฅ์น์ ๊ฒฝ์ฐ ์ ๋ ฅ ํจ์จ์ฑ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋๋ถ๋ถ์ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ์๋ ์นฉ์ ๋๋ถ๋ถ์ ์ฐจ๋จํ์ฌ ์ ๋ ฅ ์๋น๋ฅผ ๋งค์ฐ ์ ๊ฒ ํ๊ณ ์ค์ ๋ ์๊ฐ ๋๋ ์ธ๋ถ ํธ๋ฆฌ๊ฑฐ์์ ๊นจ์ด๋ ์ ์๋ "์ ์ " ๋ชจ๋๊ฐ ์์ต๋๋ค.
- ํ์ผ ์์คํ : ์ผ๋ฐ ์ปดํจํฐ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์จ๋ณด๋ ํ๋์ ๋ฉ๋ชจ๋ฆฌ์ ํ์ผ์ ์ฝ๊ณ ์ธ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ก๊น ํ๊ฑฐ๋ ๊ตฌ์ฑ ์ค์ ์ ์ ์ฅํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
- ์ธํฐ๋ฝํธ: ๋ฒํผ ์ํ๋ฅผ ๋ฃจํ์์ ์ง์์ ์ผ๋ก ํ์ธํ๋ ๊ฒ(ํด๋ง์ด๋ผ๊ณ ํจ) ๋์ ์ธํฐ๋ฝํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ธํฐ๋ฝํธ ์์ฒญ(IRQ)์ ์ฃผ ์ฝ๋๋ฅผ ์ผ์ ์ค์งํ๊ณ ํน์ ํจ์๋ฅผ ์คํํ ๋ค์ ๋ค์ ์์ํ๋ ํ๋์จ์ด ์ ํธ์ ๋๋ค. ์ด๋ ํจ์ฌ ๋ ํจ์จ์ ์ด๊ณ ์๋ต์ฑ์ด ๋ฐ์ด๋ฉ๋๋ค.
์ค์ ํ๋ก์ ํธ ์์ด๋์ด ์ผ์ผ์ด์ค
๋ง๋ค ์ค๋น๊ฐ ๋์ จ๋์? ์ฐ๋ฆฌ๊ฐ ๋ ผ์ํ ๊ฐ๋ ์ ๊ฒฐํฉํ ๋ช ๊ฐ์ง ์์ด๋์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ค๋งํธ ๋ ์จ ์คํ ์ด์ : BME280 ์ผ์์ ESP32๋ฅผ ์ฌ์ฉํ์ฌ ์จ๋, ์ต๋ ๋ฐ ์๋ ฅ์ ์ธก์ ํฉ๋๋ค. ์์ OLED ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ณ Adafruit IO ๋๋ Home Assistant์ ๊ฐ์ ๋์๋ณด๋๋ก MQTT๋ฅผ ํตํด ๊ฒ์ํฉ๋๋ค.
- ์๋ ์๋ฌผ ๊ธ์ ์์คํ : Raspberry Pi Pico์ ํ ์ ์ต๋ ์ผ์๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค. ํ ์์ด ๊ฑด์กฐํ๋ฉด GPIO ํ์ ์ฌ์ฉํ์ฌ ์์ ๋ฌผ ํํ๋ฅผ ๋ช ์ด ๋์ ์ผ๋ ๋ฆด๋ ์ด๋ฅผ ํ์ฑํํฉ๋๋ค.
- ๋ง์ถคํ USB ๋งคํฌ๋ก ํจ๋: Pico ๋๋ ๋ง์ Adafruit ๋ณด๋์ ๊ฐ์ด USB HID(Human Interface Device)๋ฅผ ์ง์ํ๋ CircuitPython ๋ณด๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ฒํผ์ ํ๋ก๊ทธ๋๋ฐํ์ฌ ๋ณต์กํ ํค๋ณด๋ ๋จ์ถํค๋ฅผ ๋ณด๋ด๊ฑฐ๋ ๋ฏธ๋ฆฌ ์ ์๋ ํ ์คํธ๋ฅผ ์ ๋ ฅํ์ฌ ์์ฐ์ฑ์ ๋์ ๋๋ค.
๊ฒฐ๋ก : ๋ฏธ๋๋ Python์ ๋ด์ฅ๋์ด ์์ต๋๋ค
Python์ ์๋ฒ ๋๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ทผ๋ณธ์ ์ผ๋ก ๋ณํ์์ผฐ์ต๋๋ค. ์ง์ ์ฅ๋ฒฝ์ ๋ฎ์ถ์ด ์ํํธ์จ์ด ๊ฐ๋ฐ์๊ฐ ํ๋์จ์ด๋ฅผ ์ ์ดํ๊ณ ํ๋์จ์ด ์์ง๋์ด๊ฐ ๊ทธ ์ด๋ ๋๋ณด๋ค ๋น ๋ฅด๊ฒ ํ๋กํ ํ์ดํํ ์ ์๋๋ก ํ์ต๋๋ค. ์ฝ๊ธฐ ์ฌ์ด ๋ช ์ค์ ์ฝ๋๋ก ์ผ์๋ฅผ ์ฝ๊ฑฐ๋ ์ธํฐ๋ท์ ์ฐ๊ฒฐํ๋ ๋จ์์ฑ์ ๊ฒ์ ์ฒด์ธ์ ์ ๋๋ค.
๊น๋ฐ์ด๋ LED์์ ์์ ํ ๊ธฐ๋ฅ์ ๊ฐ์ถ IoT ์ฅ์น๊น์ง์ ์ฌ์ ์ ๋งค์ฐ ๋ณด๋ ์๋ ๊ฒฝํ์ ๋๋ค. ์ ์ธ๊ณ ์ปค๋ฎค๋ํฐ์ ํ๋ถํ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌธ์ ์ ์ง๋ฉดํ์ ๋ ๊ฒฐ์ฝ ์ธ๋กญ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ณด๋๋ฅผ ์ ํํ๊ณ , ํ์จ์ด๋ฅผ ํ๋์ฑํ๊ณ , Python๊ณผ ๋ฌผ๋ฆฌ์ ์ธ๊ณ์ ํฅ๋ฏธ๋ก์ด ๊ต์ฐจ์ ์์ ๋ชจํ์ ์์ํ์ธ์. ์ ์ผํ ํ๊ณ๋ ๋น์ ์ ์์๋ ฅ์ ๋๋ค.