SPIKE™ Prime with Python

AI 개념의 시작: 걸음 수 세기

걸음 수 세기를 통해 변수와 데이터의 사용법을 조사합니다

45분
초급
초3-중3학년

탐색을 위한 질문

• 프로그램에 어떻게 수학적 계산을 추가할 수 있을까요?

준비

• 스파이크 프라임 허브가 충전되어 있는지 확인하세요(특히 블루투스로 연결되어 있는 경우).

관심유도

(그룹 활동, 5분)

걷기와 걸음 수 세기에 관한 대화를 통해 학생들의 관심을 불러일으켜주세요. 얼마나 많은 학생들이 걸음 수 측정 장치를 갖고 있나요? 앱을 사용할 수 있는 학생이 몇 명이나 되나요?

몇 명의 학생들을 불러내서 동일 선상에 세운 후, 앞으로 5-10걸음을 걷게 하세요. 왜 최종 위치가 서로 다를까요? 응용 프로그램이 이런 상황을 어떻게 처리하나요? 모든 사람의 보폭이 다 똑같을까요?

탐구

(소규모 그룹, 20분)

걷기가 주된 교통수단이라고 가정하고, 학생들이 스마트 장치를 사용하여 걸음 수를 추적하는 방법에 대해 조사를 수행합니다.

학생들에게 스파이크 앱의 조립 섹션을 찾아보라고 하세요. 만보계 모델의 조립 가이드가 제시되어 있을 것입니다. 스탠드는 빼고 만보계만 조립하면 된다는 것을 미리 알려주고,  학생들에게 모델을 조립하게 하세요. 조립 가이드는 https://education.lego.com/en-us/support/spike-prime/building-instructions 페이지에서도 볼 수 있습니다.   

학생들에게 파이썬 프로그래밍 캔버스에서 새 프로젝트를 열게 하세요. 혹시 프로그래밍 영역에 이미 코드가 들어 있다면 일단 그것부터 다 지우고, 허브를 연결하게 하세요.  

학생들에게 자신이 몇 걸음을 걸었는지를 어떻게 확인할 수 있을지 생각해본 후, 걸음 수를 알아낼 목적으로 어떤 센서를 사용하면 좋을지를 브레인스토밍하게 하세요. 물론 정답은 동작 센서겠죠. 학생들이 바른 선택을 하고 나아가 허브의 롤, 피치 및 요에 대해서까지 생각이 미치도록 이끌어주세요.

몸에 부착된 모델이 어떤 식으로 움직일 수 있을지를 토의에 부치세요. 허브의 피치는 허브의 전면이 앞이나 뒤로 기울어지는 것을 말합니다. (예: 팔을 곧게 뻗은 상태에서 손을 위나 아래로 까딱거림.) 허브의 롤은 허브의 전면이 오른쪽 아래 또는 왼쪽 아래로 움직이는 것을 말합니다. (예: 팔을 곧게 뻗고 손을 돌리면 새끼손가락이 위나 아래로 움직임.) 허브의 요는 허브의 상단이 오른쪽이나 왼쪽으로 비스듬히 기울어지는 것을 말합니다. (예: 손가락이 전방을 가리키도록 팔을 곧게 뻗은 상태에서 손가락을 좌우로 움직임.)

이제 학생들에게 걸음 수를 측정하기 위한 프로그램을 작성하게 하세요.

샘플 프로그램:

from hub import light_matrix, motion_sensor, button
import runloop

async def main():
    step = 0
    # 요 각도를 0으로 초기화합니다
    motion_sensor.reset_yaw(0)
    await light_matrix.write('Walk!')

    while True:
        # 기울기 값을 가져옵니다
        tilt = motion_sensor.tilt_angles()
        # 기울기 투플에서 가져온 요 값을 저장합니다
        yaw = tilt[0]

        if yaw > 75:
            step += 1
        elif yaw <-75:
            step += 1
        elif button.pressed(button.LEFT):
            await light_matrix.write(str(step))
            break

runloop.run(main())

학생들에게 프로그램을 살펴볼 시간을 주고, 여러 가지 값을 시험해보게 하세요.
데이터를 만들고 비교할 때 사용할 수 있는 몇 가지 새로운 수학 함수를 학생들에게 알려주세요.

Unit_9_Lesson_3_Table.jpg

이러한 새 함수들이 걸음 수 세기 프로그램에서 어떻게 사용되었는지에 대해 토의를 진행하세요.

프로그램 다듬기
수집된 요 각도 값을 보세요. 만보계가 초당 여러 번에 걸쳐 데이터를 수집했을 것입니다. 각도가 걸음의 일부라는 것을 프로그램이 알지 못한다는 뜻이겠죠. 따라서 걸음을 식별하기 위한 목적으로 변수를 하나 추가해줘야 합니다. 학생이 한 걸음을 걸을 때 요 각도가 한 번만 수집되도록 해야 한다는 것이죠.

샘플 프로그램:

from hub import light_matrix, motion_sensor, button
import runloop
import , time

def time_since(some_time):
    return time.ticks_diff(time.ticks_ms(), some_time)

async def main():
    # 변수를 정의합니다
    step = 0
    true_step = False

    await light_matrix.write('Walk!')

    while True:
        # 기울기 값을 가져옵니다
        tilt = motion_sensor.tilt_angles()
        # 기울기 투플에서 가져온 요 값을 저장합니다
        yaw = tilt[0]

        if yaw > 75 and true_step is False:
            step += 1
            true_step = True

        elif yaw <-75 and true_step is True:
            step += 1
            true_step = False

        elif button.pressed(button.LEFT):
            await light_matrix.write(str(step))
            break

runloop.run(main())

학생들에게 시간을 주고 프로그램을 살펴보게 하세요.

설명

(그룹 전체, 5분)

프로그램이 어떻게 작동했는지에 대해 학생들과 이야기를 나눠보세요.
이런 질문을 던져보세요.
• 걸음 수를 세기 위해 무엇을 사용했나요?
• 만보계가 얼마나 정확한가요? 설명해보세요.
• 만보계가 센 걸음 수가 너무 많다는 생각이 왜 들었을까요?

다듬기

(소규모 그룹, 10분)

학생들에게 속도의 계산을 위한 수학적 산술식을 프로그램에 추가하게 하세요. 속도가 거리 대 경과 시간의 비율이라는 점을 상기시켜주시고요.

프로그램을 테스트하는 동안 콘솔에 정보를 출력하여 데이터가 정확하고 프로그램이 계획대로 실행되고 있는지를 확인하는 것이 좋습니다.

샘플 프로그램:

from hub import light_matrix, motion_sensor, button
import runloop
import time

def time_since(some_time):
    return time.ticks_diff(time.ticks_ms(), some_time)

async def main():
    # 변수를 정의합니다
    step = 0
    true_step = False
    stride = 3
    distance_walked = 0
    time_walked = 0
    speed = 0
    start_time = 0
    elasped = 0
    
    await light_matrix.write('Walk!')

    # 타이머를 시작합니다
    start_time = time.ticks_ms()

    while True:
        # 기울기 값을 가져옵니다
        tilt = motion_sensor.tilt_angles()
        # 기울기 투플에서 가져온 요 값을 저장합니다
        yaw = tilt[0]

        if yaw > 75 and true_step is False:
            step += 1
            true_step = True  
        elif yaw <-75 and true_step is True:
            step += 1
            true_step = False
        elif button.pressed(button.LEFT):
            await light_matrix.write(str(step))
            break
    # 타이머를 멈춥니다
    elasped = time_since(start_time)

    # 계산을 합니다
    distance_walked = step * stride
    time_walked = elasped/1000
    speed = distance_walked / time_walked
    
    # 걸은 시간과 속도를 소수점 두 번째 자리에서 반올림합니다
    time_walked = str(round(time_walked, 2))
    speed = str(round(speed, 2))
    
    # 변수를 문자열로 캐스팅하고 거기에 단위를 더한 후 데이터를 출력합니다
    print('You took ' + str(step) + ' steps')
    print('Your stride is ' + str(stride) + ' feet')
    print('You walked for ' + str(time_walked) + ' seconds')
    print('You walked ' + str(distance_walked) + ' feet')
    print('Your speed is ' + str(speed) + ' feet per second')

runloop.run(main())

평가

(그룹 실습, 5분)

교사 관찰:
학생들과 프로그램에 대해 토의를 진행하세요.
이런 질문을 던져보세요.
• true_step 변수를 추가하자 어떤 일이 일어났나요?
• 동작 센서가 값을 읽는 것을 true_step 변수가 어떻게 막아주었나요?
• 프로그래밍 계산에 대해 무엇을 배웠나요?
• 어떤 반복 기능을 이용해 만보계를 개선할 수 있을까요?

자기 평가:
학생들에게 다음 질문에 대한 답을 기록장에 적으라고 하세요.
• 오늘 프로그램에 계산식을 사용하는 방법에 대해 무엇을 배웠는가?
• 좋은 팀원의 특성은 무엇이며, 오늘 내가 그중 몇 가지를 보여주었는가?
• 학생들에게 오늘의 시간 관리에 대해 1-3점 척도로 자기 평가를 해보라고 하세요.
• 학생들에게 오늘의 재료(부품) 관리에 대해 1-3점 척도로 자기 평가를 해보라고 하세요.

교사 지원

학생 과제:
• 변수를 사용하여 수학적 계산을 프로그램에 통합합니다
• 걸음 수를 측정하는 프로그램을 만듭니다

• 학생이 즉각 사용 가능한 상태의 스파이크 프라임 세트
• 스파이크 앱이 설치된 장치
• 학생용 기록장

CSTA
2-CS-02 Design projects that combine hardware and software components to collect and exchange data.
2-AP-10 Use flowcharts and/or pseudocode to address complex problems as algorithms
2-AP-13 Decompose problems and subproblems into parts to facilitate the design, implementation, and review of programs.
2-AP-16 Incorporate existing code, media, and libraries into original programs, and give attribution.
2-AP-17 Systematically test and refine programs using a range of test cases.
2-AP-19 Document programs in order to make them easier to follow, test, and debug.