์๋ , ํ๋ธ๋ฅด! ์ฐ๋ฆฌ๋ ์ด๋ฏธ LEGO MINDSTORMS Education EV3 ํ๋ซํผ์ ๋ํ์ฌ. ์ด ํ๋ซํผ์ ์ฃผ์ ๋ชฉํ๋ ์ค์ ์ฌ๋ก๋ฅผ ํตํด ํ์ตํ๊ณ , STEAM ๊ธฐ์ ์ ๊ฐ๋ฐํ๋ฉฐ, ๊ณตํ์ ์ฌ๊ณ ๋ฅผ ํ์ฑํ๋ ๊ฒ์ ๋๋ค. ์ญํ๊ณผ ๋์ญํ์ ์ฐ๊ตฌํ๋ ์คํ์ค ์์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ ๊ณ ๋ธ๋ก์ผ๋ก ๋ง๋ ์คํ์ค ์คํ ๋์ ๋ฐ์ดํฐ ๊ธฐ๋ก ๋ฐ ์ฒ๋ฆฌ์ฉ ์ ํธ๋ฆฌํฐ๋ ์คํ์ ๋์ฑ ํฅ๋ฏธ๋กญ๊ณ ์๊ฐ์ ์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ฉฐ, ์์ด๋ค์ด ๋ฌผ๋ฆฌํ์ ๋ ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์๋ค์ ๋ น๋์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ์ฑ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ ๋ฆฌํ์ฌ ๊ทธ๋ํ๋ก ํํํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ์์์ ๋ถ๊ณผํฉ๋๋ค. ์ค๋์ ์ด ํคํธ๋ฅผ MicroPython ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์ผ๋ก ํ์ฅํ์ฌ ๋ก๋ด๊ณตํ์ ๊ฐ๋ฅด์น๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.

EV3๋ก ํ๋ก๊ทธ๋๋ฐ์ ๋ฐฐ์ฐ์ธ์
ํ๋์ ํ์๋ค์ ๋ค์ฑ๋ก์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ถ์ดํฉ๋๋ค. ๊ทธ๋ ์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ฝ์์ ์ซ์๋ฅผ ์ถ๋ ฅํ๋ฉด ์ง๋ฃจํดํ๊ณ , ๋ค์ฑ๋ก์ด ๊ทธ๋ํ์ ์ฐจํธ๋ฅผ ๋ณด๊ณ , ๋ช ๋ น์ ๋ฐ๋ฅด๊ณ ์์ง์ด๋ ์ค์ ๋ก๋ด์ ๋ง๋ค๊ณ ์ถ์ดํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฝ๋๋ ์ด๋ฆฐ์ด์๊ฒ๋ ๋๋ฌด ๋ณต์กํด ๋ณด์ด๋ฏ๋ก, ์ข ๋ ์ฌ์ด ๊ฒ๋ถํฐ ๋ฐฐ์ฐ๋ ๊ฒ ์ข์ต๋๋ค.
EV3 ๊ธฐ๋ณธ ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์ LabVIEW ๊ทธ๋ํฝ ์ธ์ด์ ๊ธฐ๋ฐํ๋ฉฐ, ๋ก๋ด์ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ์ ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. ๋ช ๋ น์ ๋์ด์ ์ฐ๊ฒฐํ ์ ์๋ ๋ธ๋ก์ผ๋ก ํ์๋ฉ๋๋ค.

์ด ๋ฐฉ๋ฒ์ ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ป๊ฒ ๊ตฌ์ถ๋๋์ง ๋ณด์ฌ์ค ๋ ํจ๊ณผ์ ์ด์ง๋ง, ๋ง์ ์์ ๋ธ๋ก์ผ๋ก ๊ตฌ์ฑ๋ ํ๋ก๊ทธ๋จ์๋ ์ ํฉํ์ง ์์ต๋๋ค. ์๋๋ฆฌ์ค๊ฐ ๋ ๋ณต์กํด์ง์๋ก ์ฝ๋๋ฅผ ์ฌ์ฉํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ ํํ ํ์๊ฐ ์๋๋ฐ, ์ด ๋จ๊ณ๋ ์ด๋ฆฐ์ด์๊ฒ๋ ์ด๋ ต์ต๋๋ค.
์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ์๋ น์ด ์๋๋ฐ, ๊ทธ ์ค ํ๋๋ ์ฝ๋๊ฐ ๋ธ๋ก๊ณผ ๋์ผํ ์์ ์ ์ํํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋๋ค. EV3 ํ๊ฒฝ์ MicroPython๊ณผ์ ํตํฉ ๋๋ถ์ ์ด๋ฌํ ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฆฐ์ด๋ค์ ๊ธฐ๋ณธ ๋ธ๋ก ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ๊ณผ Microsoft Visual Studio Code์ Python์์ ๋์ผํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ค์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ์ง๋ง, ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ๋ ์ฝ๋๊ฐ ๋ ํธ๋ฆฌํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
MicroPython์ผ๋ก ์ ํ
EV3 ํ๊ฒฝ์ ARM9 ํ๋ก์ธ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ผ๋ฉฐ, ๊ฐ๋ฐ์๋ค์ ์๋์ ์ผ๋ก ์ํคํ ์ฒ๋ฅผ ๊ฐ๋ฐฉํ์ผ๋ก ๋จ๊ฒจ ๋์์ต๋๋ค. ์ด ์๋ฃจ์ ์ ํตํด ๋์ฒด ํ์จ์ด๋ฅผ ์ถ์ํ ์ ์์๋๋ฐ, ๊ทธ ์ค ํ๋๊ฐ MicroPython์์ ์ฌ์ฉํ๊ธฐ ์ํ ์ด๋ฏธ์ง์์ต๋๋ค. Python์ ์ฌ์ฉํ์ฌ EV3๋ฅผ ํ๋ก๊ทธ๋๋ฐํ ์ ์์ผ๋ฏ๋ก ํคํธ๋ฅผ ์ฌ์ฉํ๋ ์์ ์ด ์ค์ ์์ ์ ๋์ฑ ๊ฐ๊น์์ง๋๋ค.
์์ ์ ์์ํ๋ ค๋ฉด ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค. ๋ชจ๋ microSD ์นด๋์ EV3 ๋ธ๋ฆญ์ ์ค์นํ๊ณ ์ ์์ ์ผญ๋๋ค. ๊ทธ ๋ค์์๋ ์ค์น๊ฐ ํ์ํฉ๋๋ค. Visual Studio์ฉ. ๊ทธ๋ฆฌ๊ณ ์ผ์ ์์ํ ์ ์์ต๋๋ค.
MycroPython์ผ๋ก ์ฒซ ๋ฒ์งธ ๋ก๋ด ํ๋ก๊ทธ๋๋ฐํ๊ธฐ

์ฐ๋ฆฌ์ ๋ก๋ด๊ณตํ์ ๊ธฐ๋ณธ ๊ฐ๋
์ ์ตํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์์
์ด ์์ต๋๋ค. EV3 ๋ชจ๋ธ์ ์ด๋ฆฐ์ด์๊ฒ ์์จ์ฃผํ ์๋์ฐจ, ๊ณต์ฅ ์กฐ๋ฆฝ ๋ก๋ด, CNC ๊ธฐ๊ณ์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ์ฌํญ์ ์๊ฐํฉ๋๋ค.
ํจํด๊ณผ ๊ธฐํํ์ ๋ชจ์์ ๊ทธ๋ฆฌ๋๋ก ๊ฐ๋ฅด์น ์ ์๋ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๋ ๊ธฐ๊ณ๋ฅผ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ์ด ์ผ์ด์ค๋ ์ฑ์ธ์ฉ ๋ก๋ด ์ฉ์ ๊ธฐ๋ ๋ฐ๋ง ๋จธ์ ์ ๋จ์ํ๋ ๋ฒ์ ์ด๋ฉฐ, EV3๋ฅผ MicroPython๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ํ์๋ค์๊ฒ ๊ฐ๋ฅด์น๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๋ ๊ธฐ๊ณ๋ ์๋น ๋ฅผ ์ํด ์ธ์ ํ๋ก ๊ธฐํ์ ๊ตฌ๋ฉ์ ํ์ํ ์๋ ์์ง๋ง, ๊ทธ๊ฒ์ ์ํ์ ๊ณ์ฐ์ด ํ์ํ ๋ ๋ค๋ฅธ ์์ค์ ๋๋ค.
์ผ์ ์ํด์๋ ๋ค์์ด ํ์ํฉ๋๋ค.
- LEGO MINDSTORMS Education EV3 ๊ธฐ๋ณธ ์ธํธ;
- ํฐ ์ ์ฌ๊ฐํ ์ข ์ด ํ ์ฅ;
- ์๊น์๋ ๋ง์ปค.
๋ก๋ด ์์ฒด์ ์กฐ๋ฆฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. , ํ๋ก๊ทธ๋๋ฐ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ , EV3 Brick Library๋ฅผ ์ด๊ธฐํํด ๋ณด๊ฒ ์ต๋๋ค.
#!/usr/bin/env pybricks-micropython
from pybricks import ev3brick as brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor, GyroSensor)
from pybricks.parameters import Port, Stop, Direction, Color, ImageFile
from pybricks.tools import wait
ํธ๋ค์ ํ์ ์ํค๋ ํ๋ซํผ์ ํฌํธ B์ ๋ชจํฐ๋ก โโ์ค์นํ์ต๋๋ค. 20๋จ ๊ธฐ์ด ์ ๋ฌ ์ฅ์น์ ๊ธฐ์ด๋น๋ฅผ ๊ฐ๊ฐ ์ด๋นจ ์ 12-28-XNUMX๋ก ์ค์ ํ์ต๋๋ค.
turntable_motor = Motor(Port.B, Direction.CLOCKWISE, [20, 12, 28])
์ฐ๋ฆฌ๋ ํฌํธ C์ ๋ชจํฐ๋ก ํธ๋ค์ ๋ฆฌํํ ๋ฉ์ปค๋์ฆ์ ์ค์ ํ์ต๋๋ค:
seesaw_motor = Motor(Port.C)
ํฌํธ 2์ ์คํฑ์ ๊ธฐ์ธ๊ธฐ ๊ฐ๋๋ฅผ ์ธก์ ํ๋ ์์ด๋ก์ค์ฝํ๋ฅผ ์ค์ ํฉ๋๋ค.
gyro_sensor = GyroSensor(Port.S2)
ํฌํธ 3์ ์ปฌ๋ฌ ์ผ์๋ฅผ ์ค์นํ์ต๋๋ค. ์ผ์๋ ๋๋ฉด ๊ธฐ๊ณ ์๋์ ์๋ ํฐ์ ์ข ์ด๋ฅผ ๊ฐ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
color_sensor = ColorSensor(Port.S3)
ํฌํธ 4์ ํฐ์น ์ผ์๋ฅผ ์ค์นํ์ต๋๋ค. ์ผ์๋ฅผ ๋๋ฅด๋ฉด ๋ก๋ด์ด ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๊ธฐ ์์ํฉ๋๋ค.
touch_sensor = TouchSensor(Port.S4)
ํธ๋ค์ ์ฌ๋ฆฌ๊ณ ๋ด๋ฆฌ๋ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
def pen_holder_raise():
seesaw_motor.run_target(50, 25, Stop.HOLD)
wait(1000)
def pen_holder_lower():
seesaw_motor.run_target(50, 0, Stop.HOLD)
wait(1000)
์ฐ๋ฆฌ๋ ํธ๋ค์ ์ฃผ์ด์ง ๊ฐ๋ ๋๋ ํน์ ๊ฐ๋๋ก ํ์ ์ํค๋ ํจ์๋ฅผ ์ ์ํฉ๋๋ค:
def pen_holder_turn_to(target_angle):
if target_angle > gyro_sensor.angle():
๋ชฉํ ๊ฐ๋๊ฐ ํ์ฌ ์์ด๋ก ์ผ์ ๊ฐ๋๋ณด๋ค ํฐ ๊ฒฝ์ฐ, ์์ ์๋๋ก ์๊ณ ๋ฐฉํฅ์ผ๋ก ๊ณ์ ์ด๋ํฉ๋๋ค.
turntable_motor.run(70)
while gyro_sensor.angle() < target_angle:
pass
elif target_angle < gyro_sensor.angle():
๋ชฉํ ๊ฐ๋๊ฐ ํ์ฌ ์์ด๋ก ์ผ์ ๊ฐ๋๋ณด๋ค ์์ผ๋ฉด ์๊ณ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํฉ๋๋ค.
turntable_motor.run(-70)
while gyro_sensor.angle() > target_angle:
pass
๋ชฉํ ๊ฐ๋์ ๋๋ฌํ๋ฉด ํ์ ํ๋ซํผ์ ๋ฉ์ถฅ๋๋ค.
turntable_motor.stop(Stop.BRAKE)
ํธ๋ค์ ์ด๊ธฐ ์์น๋ฅผ ์์ชฝ์ผ๋ก ์ค์ ํฉ๋๋ค.
pen_holder_raise()
์ด์ ํ๋ก๊ทธ๋จ์ ํต์ฌ ๋ถ๋ถ์ธ ๋ฌดํ ๋ฃจํ๊ฐ ์์๋ฉ๋๋ค. ๋จผ์ , EV3๋ ์ปฌ๋ฌ ์ผ์๊ฐ ํฐ์ ์ข ์ด ๋๋ ํ๋์ ์์ ์ฌ๊ฐํ์ ๊ฐ์งํ๊ณ ํฐ์น ์ผ์๊ฐ ๋๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ทธ๋ ํจํด์ ๊ทธ๋ฆฐ ๋ค์ ์์ ์์น๋ก ๋์์ ๋ชจ๋ ๊ฒ์ ๋ค์ ๋ฐ๋ณตํฉ๋๋ค.
์ฅ์น๊ฐ ์ค๋น๋์ง ์์ ๊ฒฝ์ฐ ์ปจํธ๋กค๋ฌ์ LED๊ฐ ๋นจ๊ฐ์์ผ๋ก ๋ฐ๋๊ณ LCD ํ๋ฉด์ "์์ง์๊ฐ๋ฝ ์๋๋ก" ์์ด์ฝ์ด ํ์๋ฉ๋๋ค.
while True:
brick.light(Color.RED)
brick.display.image(ImageFile.THUMBS_DOWN)
์์ ์ผ์๊ฐ ํ๋์ ๋๋ ํฐ์์ ์ฝ์ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ LED ์์์ ๋ น์์ผ๋ก ์ค์ ํ๊ณ LCD ํ๋ฉด์ "์์ง์๊ฐ๋ฝ ์๋ก" ์ด๋ฏธ์ง๋ฅผ ํ์ํ๊ณ ์ฅ์น๊ฐ ์๋ํ ์ค๋น๊ฐ ๋์๋ค๊ณ ๋ณด๊ณ ํฉ๋๋ค.
while color_sensor.color() not in (Color.BLUE, Color.WHITE):
wait(10)
brick.light(Color.GREEN)
brick.display.image(ImageFile.THUMBS_UP)
ํฐ์น ์ผ์๊ฐ ๋๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์์ด๋ก์ค์ฝํ ์ผ์์ ๊ฐ๋ ๊ฐ 0์ ํ ๋นํ๊ณ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์์ํฉ๋๋ค.
while not touch_sensor.pressed():
wait(10)
gyro_sensor.reset_angle(0)
pen_holder_turn_to(15)
pen_holder_lower()
pen_holder_turn_to(30)
pen_holder_raise()
pen_holder_turn_to(45)
pen_holder_lower()
pen_holder_turn_to(60)
ํ ํ๋๋ฅผ ๋ค์ด ์ฌ๋ ค ์๋ ์์น๋ก ๋๋ ค๋์ต๋๋ค.
pen_holder_raise()
pen_holder_turn_to(0)</i>
์ฐ๋ฆฌ๊ฐ ์ป์ ๊ฐ๋จํ ํ๋ก๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ฐ์ฌํ์ฌ ๋ก๋ด ์ค๊ณ์๊ฐ ์ค์ ๋ก ํ๋ํ๋ ๋ชจ์ต์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฐ ์๋ค์ ๋ฌด์์ ๋ณด์ฌ์ฃผ๋์?

EV3๋ STEM ๋ถ์ผ ์ง๋ก ์๋ด ๋๊ตฌ์ด์ ์์ง๋์ด๋ง ๋ถ์ผ ์ง์
์ ์
๋๋ค. ์ค์ ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฆฐ์ด๋ ๊ธฐ์ ๊ฐ๋ฐ๊ณผ ์ฐ์
์ฉ ๋ก๋ด ์ ์์ ๋ํ ๊ฒฝํ์ ์ป๊ณ , ์ค์ ์ํฉ์ ๋ชจ๋ธ๋งํ๊ณ , ํ๋ก๊ทธ๋จ์ ์ดํดํ๊ณ ์๊ณ ๋ฆฌ์ฆ์ ๋ถ์ํ๋ ๋ฒ์ ๋ฐฐ์ฐ๋ฉฐ, ๊ธฐ๋ณธ ํ๋ก๊ทธ๋๋ฐ ๊ตฌ์กฐ๋ฅผ ์๋ฌํฉ๋๋ค.
MicroPython ์ง์์ผ๋ก EV3 ํ๋ซํผ์ ๊ณ ๋ฑํ๊ต ๊ต์ก์ ์ ํฉํฉ๋๋ค. ํ์๋ค์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ํ๋ ์ธ์ด ์ค ํ๋๋ฅผ ์ฌ์ฉํด ํ๋ก๊ทธ๋๋จธ๊ฐ ๋์ด ๋ณด๊ณ , ํ๋ก๊ทธ๋๋ฐ ๋ฐ ์์ง๋์ด๋ง ์ค๊ณ์ ๊ด๋ จ๋ ์ง์
์ ๋ํด ์์๋ณผ ์ ์์ต๋๋ค. EV3 ํคํธ๋ ์ฝ๋ฉ์ด ๋ฌด์ญ์ง ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ณ , ์ด๋ฆฐ์ด๋ค์ด ์ฌ๊ฐํ ์์ง๋์ด๋ง ๊ณผ์ ์ ๋๋นํ๋๋ก ๋๊ณ , ๊ธฐ์ ์ ๋ฌธ ๋ถ์ผ๋ฅผ ์ต๋ํ๊ธฐ ์ํ ์ฒซ ๊ฑธ์์ ๋ด๋๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ๊ต์์ ์ผํ๊ณ ๊ต์ก๊ณผ ๊ด๋ จ๋ ์ฌ๋๋ค์ ์ํด ์ฐ๋ฆฌ๋ ์ค๋นํ์ต๋๋ค. ๋ฐ ๊ต์ก ์๋ฃ. ๊ทธ๋ค์ ํน์ ์์
์ ์ํํ ๋ ์ด๋ค ๊ธฐ์ ์ด ๊ฐ๋ฐ๋๋์ง, ์ต๋ํ ๊ธฐ์ ์ด ํ์ต ๊ธฐ์ค๊ณผ ์ด๋ป๊ฒ ๊ด๋ จ์ด ์๋์ง ์์ธํ ์ค๋ช
ํฉ๋๋ค.
์ถ์ฒ : habr.com
