MINDSTORMS® EV3 코어 세트

무인 자동차 만들기

사용자 지정된 주행 명령에 따라 움직이는 자율주행 자동차를 설계하세요.

120분 이상
중급
중3-고3학년
roaming-vehicles-gps

수업 계획

준비
- 교사용 자료를 읽으세요.
- 필요에 따라 EV3 랩 소프트웨어 또는 프로그래밍 앱의 시작하기 자료를 이용해 수업을 계획하세요. 학생들이 레고® 마인드스톰® 에듀케이션 EV3와 친숙해지는 데 도움이 될 것입니다.

관심유도(30분)
- 아래의 토의 시작 섹션에 제시된 아이디어를 사용해 학생들에게 이 프로젝트에 대해 논의를 시작하게 하세요.
- 프로젝트를 설명하세요.
- 학생들이 두 명씩 팀을 이루게 하세요.
- 학생들에게 브레인스토밍을 위한 시간을 주세요.

탐구(30분)
- 학생들에게 여러 개의 프로토타입을 만들게 하세요.
- 조립과 프로그래밍을 모두 탐구하게 하세요.
- 각 팀별로 2가지 솔루션을 만들어 테스트하게 하세요.

설명(60분)
- 학생들이 생각한 솔루션들을 테스트하고 가장 최선의 솔루션을 고르게 하세요.
- 학생들에게 자신만의 테스트표를 만들게 하세요.
- 팀별로 프로젝트를 최종 완성하고 작업을 문서화하기 위해 필요한 자료들을 수집할 시간을 주세요.

정교화(60분)
- 학생들에게 최종 보고서를 작성하기 위한 시간을 주세요.
- 각 팀별로 결과를 발표하는 공유 세션을 진행하세요.

평가
- 학생 개개인의 성과에 대한 피드백을 제공하세요.
- 제공된 활동평가표를 사용하면 프로세스를 간소화할 수 있습니다.

토의 시작

오늘날 자동차에 사용되는 내비게이션 시스템은 그 종류가 매우 다양합니다. 이러한 시스템 중 일부는 승객들을 목적지까지 안전하게 실어 나르는 운전자들의 책임을 떠맡기도 합니다. 자율주행 자동차가 A 지점과 B 지점 사이의 최적 경로를 알아내려면 사용자의 입력에 기초하여 일련의 동작을 수행할 수 있어야 합니다.

roaming-vehicles-gps

적극적으로 브레인스토밍을 하게 하세요.

학생들에게 이러한 질문에 대해 생각해보게 하세요.

  • 자율주행 자동차가 무엇이며 어떻게 작동하나요?
  • 자율주행 자동차는 어디에서 길안내 정보를 얻을까요?
  • 자동차가 북쪽, 남쪽, 동쪽, 서쪽 눈금선을 기준으로 도시의 거리를 이동하려면 어떤 동작을 수행해야 할까요?

학생들에게 약간의 시간을 주고 이러한 질문에 답을 하게 하세요.

학생들에게 최초의 아이디어를 문서화하게 하고, 첫 번째 프로토타입에 사용할 솔루션을 선택한 이유를 물어보세요. 그리고 프로젝트가 진행되는 동안 자신의 아이디어를 어떻게 평가할 것인지를 설명해보라고 하세요. 이렇게 함으로써 학생들이 검토와 수정을 거치는 과정에서 솔루션을 평가할 때 활용 가능한 구체적인 정보를 얻을 수 있고 솔루션이 효과적인지 여부를 판단할 수 있습니다.

의사 코드는 학생들이 프로그래밍을 시작하기 전에 생각을 정리할 수 있도록 도와주는 훌륭한 도구입니다.

조립 팁

자동차를 조립하는 것부터 시작하세요. 레고® 마인드스톰® EV3 드라이빙 베이스 모델 중 하나를 골라 사용해도 좋고, 직접 모델을 디자인해도 좋습니다. EV3 브릭 버튼의 위를 가리지 않고 접근이 쉽도록 합니다. 이번 활동에서 버튼은 방향 제어에 사용됩니다.

ev3-robot-driving-base

코딩 팁

EV3의 각 버튼으로 기록한 명령어에 따라 로봇이 이동하도록 프로그램을 작성해야 한다는 점을 학생들에게 설명하세요. 아래의 파라미터를 사용하세요.

  • 위쪽 버튼 눌림(bumped), 로봇 30cm 전진
  • 아래쪽 버튼 눌림(bumped), 로봇 30cm 후진
  • 왼쪽 버튼 눌림(bumped), 로봇 90도 좌회전
  • 오른쪽 버튼 눌림(bumped), 로봇 90도 우회전

로봇을 움직이기 위한 하나의 동작 기록하기

coding-08-01

프로그램 설명

  1. 프로그램을 시작합니다.

  2. “Drive”라는 이름의 블록을 만듭니다.

  3. 브릭의 버튼이 눌릴 때까지(bumped) 기다립니다.

  4. “Click 2” 사운드를 재생합니다.

  5. 눌린 버튼의 숫자 값을 “Drive” 변수에 기록합니다.

  6. 2초간 대기합니다.

  7. “Go2” 사운드를 재생합니다.

  8. “Drive” 변수에 저장된 값을 읽고 해당 값을 스위치로 보냅니다.

  9. 숫자 스위치:

    a. Drive = 0(기본 값)이면 아무 것도 하지 않습니다.
    b. Drive = 1이면 로봇을 왼쪽으로 곡선 주행합니다.
    c. Drive = 3이면 로봇을 오른쪽으로 곡선 주행합니다.
    d. Drive = 4이면 로봇을 바퀴 2회전만큼 똑바로 전진시킵니다.
    e. Drive = 5이면 로봇을 바퀴 2회전만큼 똑바로 후진시킵니다.

  10. “Game Over 2” 사운드를 재생합니다.

로봇의 움직이기 위한 여러 가지 동작 기록하기

배열 연산 블록은 데이터의 순서를 저장할 때 사용됩니다. 배열은 하나의 행과 여러 개의 열로 구성된 표의 형태로 종종 묘사됩니다.

coding-08-02

솔루션 설명

  1. 프로그램을 시작합니다.
  2. “Drive”라는 이름의 블록을 만듭니다. “숫자형 배열 쓰기” 옵션을 선택합니다.
  3. 루프를 만듭니다. 예제 코드는 5번 실행하도록 설정되어 있습니다.
  4. 브릭의 버튼이 눌릴 때까지(bumped) 기다립니다.
  5. “Click” 사운드를 재생합니다.
  6. “Drive” 변수 블록을 읽습니다. “숫자형 배열 읽기” 옵션을 선택합니다.
  7. 배열 연산 블록을 사용합니다. “인덱스에 쓰기 - 숫자”를 선택합니다.

a. “Drive” 변수 블록에 선을 연결합니다.
b. 루프 앞쪽의 루프 인덱스를 배열 연산 블록의 인덱스 위치에 선으로 연결합니다.
c. EV3 브릭 버튼 대기 블록의 값을 배열 연산 블록의 값 위치에 선으로 연결합니다.

  1. 배열 연산 블록의 출력 값을 “Drive” 변수 블록에 선으로 연결합니다.
  2. 2초간 대기합니다.
  3. “Go” 사운드를 재생합니다.
  4. 두 번째 루프를 만듭니다. 예제 코드는 5번 실행하도록 설정되어 있으며, 첫 번째 루프와 횟수가 같습니다.
  5. “Drive” 변수 블록을 읽습니다. “숫자형 배열 읽기” 옵션을 선택합니다.
  6. 배열 연산 블록을 사용합니다. “인덱스로 읽기 - 숫자” 옵션을 선택합니다.
  7. 숫자 스위치:

a. Drive = 0(기본 값)이면 아무 것도 하지 않습니다.
b. Drive = 1이면 로봇을 왼쪽으로 곡선 주행합니다.
c. Drive = 3이면 로봇을 오른쪽으로 곡선 주행합니다.
d. Drive = 4이면 로봇을 바퀴 2회전만큼 똑바로 전진시킵니다.
e. Drive = 5이면 로봇을 바퀴 2회전만큼 똑바로 후진시킵니다.

  1. “Game Over 2” 사운드를 재생합니다.
샘플 프로그램 다운로드 32KB, EV3 랩 소프트웨어 필요

탭 “1”과 “2”

EV3 MicroPython 프로그램 솔루션

로봇을 움직이기 위한 하나의 동작 기록하기

#!/usr/bin/env pybricks-micropython

from pybricks import ev3brick as brick
from pybricks.ev3devices import Motor
from pybricks.parameters import Port, Stop, Button, SoundFile
from pybricks.tools import wait
from pybricks.robotics import DriveBase

# The Left, Right, Up, and Down Buttons are used to command the robot.
COMMAND_BUTTONS = (Button.LEFT, Button.RIGHT, Button.UP, Button.DOWN)

# Configure 2 motors with default settings on Ports B and C.  These
# will be the left and right motors of the Driving Base.
left_motor = Motor(Port.B)
right_motor = Motor(Port.C)

# The wheel diameter of the Robot Educator Driving Base is 56 mm.
wheel_diameter = 56

# The axle track is the distance between the centers of each of the
# wheels.  This is 118 mm for the Robot Educator Driving Base.
axle_track = 118

# The Driving Base is comprised of 2 motors.  There is a wheel on each
# motor.  The wheel diameter and axle track values are used to make the
# motors move at the correct speed when you give a drive command.
robot = DriveBase(left_motor, right_motor, wheel_diameter, axle_track)

# Wait until one of the command buttons is pressed.
while not any(b in brick.buttons() for b in COMMAND_BUTTONS):
    wait(10)

# Store the pressed button as the drive command.
drive_command = brick.buttons()[0]
brick.sound.file(SoundFile.CLICK)

# Wait 2 seconds and then play a sound to indicate that the robot is
# about to drive.
wait(2000)
brick.sound.file(SoundFile.GO)
wait(1000)

# Now drive the robot using the drive command.  Depending on which
# button was pressed, drive in a different way.

# The robot turns 90 degrees to the left.
if drive_command == Button.LEFT:
    robot.drive_time(100, -90, 1000) 

# The robot turns 90 degrees to the right.
elif drive_command == Button.RIGHT:
    robot.drive_time(100, 90, 1000)

# The robot drives straight forward 30 cm.
elif drive_command == Button.UP:
    robot.drive_time(100, 0, 3000) 
    
# The robot drives straight backward 30 cm.
elif drive_command == Button.DOWN:
    robot.drive_time(-100, 0, 3000)

# Play a sound to indicate that it is finished.
brick.sound.file(SoundFile.GAME_OVER)
wait(2000)

로봇의 움직이기 위한 여러 가지 동작 기록하기

#!/usr/bin/env pybricks-micropython

from pybricks import ev3brick as brick
from pybricks.ev3devices import Motor
from pybricks.parameters import Port, Stop, Button, SoundFile
from pybricks.tools import wait
from pybricks.robotics import DriveBase

# The Left, Right, Up, and Down Buttons are used to command the robot.
COMMAND_BUTTONS = (Button.LEFT, Button.RIGHT, Button.UP, Button.DOWN)

# Configure 2 motors with default settings on Ports B and C.  These
# will be the left and right motors of the Driving Base.
left_motor = Motor(Port.B)
right_motor = Motor(Port.C)

# The wheel diameter of the Robot Educator Driving Base is 56 mm.
wheel_diameter = 56

# The axle track is the distance between the centers of each of the
# wheels.  This is 118 mm for the Robot Educator Driving Base.
axle_track = 118

# The Driving Base is comprised of 2 motors.  There is a wheel on each
# motor.  The wheel diameter and axle track values are used to make the
# motors move at the correct speed when you give a drive command.
robot = DriveBase(left_motor, right_motor, wheel_diameter, axle_track)

# Pressing a button stores the command in a list.  The list is empty to
# start.  It will grow as commands are added to it.
drive_command_list = []

# This loop records the commands in the list.  It repeats until 5
# buttons have been pressed.  This is done by repeating the loop while
# the list contains less than 5 commands. 
while len(drive_command_list) < 5:
    # Wait until one of the command buttons is pressed.
    while not any(b in brick.buttons() for b in COMMAND_BUTTONS):
        wait(10)
    
    # Add the pressed button to the command list.
    drive_command_list.append(brick.buttons()[0])
    brick.sound.file(SoundFile.CLICK)

    # To avoid registering the same command again, wait until the Brick
    # Button is released before continuing.
    while any(brick.buttons()):
        wait(10)

# Wait 2 seconds and then play a sound to indicate that the robot is
# about to drive.
wait(2000)
brick.sound.file(SoundFile.GO)
wait(1000)

# Now drive the robot using the list of stored commands.  This is done
# by going over each command in the list in a loop.
for drive_command in drive_command_list:
    # The robot turns 90 degrees to the left.
    if drive_command == Button.LEFT:
        robot.drive_time(100, -90, 1000) 

    # The robot turns 90 degrees to the right.
    elif drive_command == Button.RIGHT:
        robot.drive_time(100, 90, 1000)

    # The robot drives straight forward 30 cm.
    elif drive_command == Button.UP:
        robot.drive_time(100, 0, 3000) 
        
    # The robot drives straight backward 30 cm.
    elif drive_command == Button.DOWN:
        robot.drive_time(-100, 0, 3000)

# Play a sound to indicate that it is finished.
brick.sound.file(SoundFile.GAME_OVER)
wait(2000)

확장 요소

국어교과 확장

옵션 1
텍스트 기반 프로그래밍의 활용:

  • 학생들이 다양한 프로그래밍 언어를 비교해 볼 수 있도록 텍스트 기반 프로그래밍 솔루션을 탐구할 기회를 제공하세요.

옵션 2
이번 수업에서는 학생들이 배열 형태로 전달되는 명령에 따라 움직이는 무인 자동차를 만들었습니다. 미래의 무인 자동차가 인간 운전자의 입력을 무시하도록 프로그래밍될 수 있다면 어떨까요?
국어교과 기술 개발의 통합을 위해 학생들에게 다음 과제를 부여하세요.

  • 무인 자동차가 탑승자의 입력을 무시한 채 속도를 자율적으로 제어할 수 있도록 해서는 안 된다는 주장의 근거를 글로 작성하세요.
  • 이 주장의 타당성을 뒷받침할 구체적인 증거를 포함시키고, 전술한 자율 기능이 탑승자에게 불리하게 작용할 수 있는 상황의 예를 인용하세요.
  • 무인 자동차의 자율 속도 제어 기능이 운전자 또는 교통 안전의 증진을 위한 효과적인 전략이 될 수 있다는 반대 주장을 세워보세요.

수학교과 확장

이번 수업에서 학생들은 무인 자동차의 이동을 위한 방향 전환 명령의 순차열을 만들었습니다. 무인 자동차는 센서와 기계학습을 사용하여 명령을 따르고 새로운 상황에 기초하여 명령의 실행을 수정할 수 있습니다.
수학 능력 개발 활동을 통합하고 무인 자동차에 사용될 기계학습 응용 프로그램을 조사하는 차원에서 학생들에게 방향 전환 횟수의 “예산”을 할당하고, 다음과 같은 과제를 부여하세요.

  • 도시의 거리를 나타내는 그리드를 만드세요(예: 동에서 서로 이어지는 다섯 가닥의 길과 북에서 남으로 이어지는 다섯 가닥의 길).
  • 출발지과 목적지를 선택하세요. · 방향 전환이 가장 적은 경로가 최적의 경로를 나타낸다는 점을 염두에 두고, 출발지와 목적지 사이의 교차로 세 개를 분석하세요.
  • 자신의 차량이 무작위적 방향으로 이동하며 “예산 범위 내”에서 목적지에 도착할 확률을 가늠해보세요.

평가 기회

교사 관찰 체크리스트
교사의 요구 사항에 맞는 척도를 만드세요(아래의 예 참조).

  1. 부분적으로 달성됨
  2. 충분히 달성됨
  3. 초과 달성됨

다음의 성공 기준을 사용해 학생들의 진척도를 평가하세요.

  • 학생들이 문제의 핵심 요소를 식별할 수 있다.
  • 학생들이 자율적인 태도로 창의적인 솔루션을 개발한다.
  • 학생들이 자신의 아이디어를 명확히 전달할 수 있다.

자기 평가
학생들이 어느 정도의 성과 데이터를 수집한 다음, 각자의 솔루션에 대해 깊이 생각해 볼 시간을 주세요. 다음과 같은 질문이 도움이 될 것입니다.

  • 솔루션이 디자인 브리핑의 기준을 충족하나요?
  • 로봇의 움직임을 더 정확하게 만들 수 있나요?
  • 다른 사람들은 이 문제를 어떤 방식으로 해결했나요?

학생들에게 솔루션을 개선할 두 가지 방법을 브레인스토밍하고 문서화하게 하세요.

동료 피드백
각 그룹이 자신과 타인의 프로젝트를 평가하는 동료 검토 프로세스를 진행하게 하세요. 이러한 검토 프로세스는 학생들이 건설적인 피드백을 제공하는 기술을 개발하고 그들의 분석 기술을 연마하며, 주장을 뒷받침하기 위해 객관적 데이터를 사용하는 능력을 향상하는 데 도움이 됩니다.

진로 연결

이 수업이 즐거웠던 학생이라면 아마 다음과 같은 진로 개발 영역에 대해서도 관심이 있을 것입니다.

  • 비즈니스 및 금융(기업가)
  • 제조 및 엔지니어링(예비 엔지니어링)

교사 지원

학생 과제:
디자인 프로세스를 사용해 현실 세계의 문제를 해결하세요

2015 개정 교육과정
공학의 기초[12공학 01-05]
-공학 문제의 다양한 해결책을 창의적으로 설계한다.
공학의 세계[12 공학 02-07]
-IT 기반 융합 공학의 원리를 이해하고 동향을 파악하며, 이 공학의 융합 사례를 탐색한다.
추상화와 알고리즘[12정보03-03]
-복잡하고 어려운 문제를 해결 가능한 작은 단위의 문제로 분해하고 모델링 한다.
프로그래밍[12정보04-09]
-다양한 학문 분야의 문제 해결을 위한 알고리즘을 협력하여 설계한다.

학생용 자료

학생용 워크시트

온라인 HTML 페이지 또는 인쇄 가능한 PDF 형식으로 다운로드하거나 살펴보거나 공유하세요.

공유하기:

Google 클래스룸Google 클래스룸