SPIKE™ Prime with Python

AI 개념의 시작: 점프 리스트

리스트를 사용하여 물리적 성능 데이터를 캡처하기 위한 프로그램을 만듭니다

90-120분
중급
초3-중3학년

탐색을 위한 질문

• 개인적 성과 통계를 나타내는 리스트를 어떻게 만들 수 있을까요?

준비

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

관심유도

(그룹 활동, 5분)

스쿼트 도중의 신체 움직임에 대한 대화를 통해 학생들의 관심을 불러일으켜주세요. (예를 들어, 다리가 구부러지고 몸통이 지면에 더 가까워짐) 학생들에게 자리에서 일어나 스쿼트를 해보라고 하세요.

그 다음, 학생들에게 제자리 점프를 해보라고 하고, 점프를 할 때 몸이 어떻게 움직였는지 물어보세요.

스쿼트 중에 몸이 얼마나 낮아지고 점프할 때 몸이 얼마나 높이 솟구치는지를 측정할 방법으로 어떤 것들이 있을까요?

탐구

(소규모 그룹, 45분)

학생들이 리스트에 넣을 데이터를 생성할 방법을 조사합니다.

학생들에게 스파이크 앱의 조립 섹션을 찾아보라고 하세요. 스마트 케틀벨 모델의 조립 가이드가 제시되어 있을 것입니다.  학생들에게 모델을 조립하게 하세요. 조립 가이드는 https://education.lego.com/en-us/support/spike-prime/building-instructions 페이지에서도 볼 수 있습니다.   

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

1부: 리스트에 넣을 데이터 만들기
학생들이 여러 가지 점프 높이를 기록할 수 있도록 케틀벨 모델을 프로그래밍하고, 이 정보를 사용하여 이후에 사용할 리스트를 만들 것입니다.

학생들과 함께 샘플 프로그램을 살펴보고, 이 프로그램에서 힘 센서와 거리 센서가 어떻게 사용되는지에 대해 토의를 진행하세요. 뒤이어 학생들이 힘 센서를 사용하여 점프가 시작되는 시점을 표시하고, 거리 센서를 사용하여 점프 높이를 측정합니다. 학생들에게 프로그램을 실행하고, 점프 값이 어떻게 나타나는지 살펴보라고 하세요.

샘플 프로그램:

from hub import port, light_matrix
import runloop
import distance_sensor
import force_sensor

def is_force_sensor_pressed():
    # 힘 센서로부터 입력 값을 수집합니다
    return force_sensor.pressed(port.B)

def is_force_sensor_released():
    # 힘 센서로부터 입력 값을 수집합니다
    return not force_sensor.pressed(port.B)

async def main():
    runloop.until(is_force_sensor_pressed)
    await light_matrix.write('JUMP!')

    runloop.until(is_force_sensor_released)
    dist_cm = distance_sensor.distance(port.F)/10
    print(str(dist_cm) + ' cm')

runloop.run(main())

참고: 학생들이 힘 센서를 누르고 있다가 점프 높이가 최고점에 이르는 시점에 맞춰 센서에서 손을 떼야 합니다. 참고로, 바닥에 카펫이 깔려 있을 경우 거리 센서가 제대로 읽히지 않을 수 있습니다. 점프 값이 -0.1cm로 나타나거든 장소를 바꿔보세요.

학생들이 프로그램에 대한 검토를 마치는 대로 팀원마다 세 번씩 점프를 하게 하고, 각각의 점프 값을 표에 기록하게 하세요.

예제 표:

Unit_10_Lesson_4_Table.jpg

2부: 리스트 만들기
학생들이 1부에서 생성한 데이터를 사용하여 새 프로그램에 두 개의 리스트를 만듭니다.
매 학생별로 리스트가 하나씩 있고 개인별 점프 데이터가 리스트의 값으로 사용되도록 하려면 새 프로그램을 어떻게 만들어야 할지에 대해 학생들과 토의를 진행하세요. 프로그래밍 중에 쉽게 구별이 되도록 변수와 리스트의 이름을 정하는 것이 중요하다는 것을 학생들에게 상기시켜주시고요. 자신의 개인 리스트에 자신의 이름을 사용하는 것도 좋은 방법이 될 수 있겠죠.

이제 학생들이 두 개의 리스트를 모두 넣어서 프로그램을 만들고, 각 리스트의 최대값을 표시한 다음, 허브에서 각각의 값이 공유되게 할 것입니다. max(name1) 코드 행이 리스트의 최대값을 표시해주는 역할을 한다는 것을 학생들에게 알려주세요.

샘플 프로그램(학생들이 각자 자신의 이름과 표의 데이터를 사용해야 함):

from hub import port, light_matrix
import runloop
import force_sensor

def is_force_sensor_pressed():
    # 힘 센서로부터 입력 값을 수집합니다
    return force_sensor.pressed(port.B)

async def main():

    # 표의 값을 사용하여 개인별 리스트를 만듭니다
    name1 = [trial1, trial2, trial3]
    name2 = [trial1, trial2, trial3]

    # 개인별 리스트의 최대값을 출력합니다
    print('Name 1: ' + str(max(name1)))
    print('Name 2: ' + str(max(name2)))
    
    # 힘 센서를 누르면 허브에 최대값이 표시됩니다
    await runloop.until(is_force_sensor_pressed)
    await light_matrix.write(str(max(name1)))
    await runloop.sleep_ms(2000)
    light_matrix.show_image(light_matrix.IMAGE_YES)
    await runloop.sleep_ms(1000)
    await light_matrix.write(str(max(name2)))
    await runloop.sleep_ms(2000)
    light_matrix.show_image(light_matrix.IMAGE_YES)

runloop.run(main())

학생들에게 프로그램을 살펴볼 시간을 주고, 각 리스트의 출력값 또는 최대값을 표시하기 위한 여러 가지 방법을 시도해보라고 하세요.

3부: 리스트 합치기
학생들이 두 개의 리스트를 합쳐 하나의 리스트를 만들 수 있도록 프로그램을 수정합니다.
concatenating 함수를 학생들에게 보여주고, + 기호를 사용하여 두 개의 리스트를 하나로 합칠 수 있다는 것을 알려주세요. 리스트를 한데 합치는 방법의 예로는 list3 = list1 + list 2 코드 행을 보면 되겠죠. 뒤이어 학생들에게 리스트를 concatenate하고 두 리스트의 최대값 또는 가장 큰 숫자를 찾아보라고 하세요.

샘플 프로그램:

from hub import port, light_matrix
import runloop
import force_sensor

def is_force_sensor_pressed():
    # 힘 센서로부터 입력 값을 수집합니다
    return force_sensor.pressed(port.B)

async def main():
    # 표의 값을 사용하여 개인별 리스트를 만듭니다
    name1 = [trial1, trial2, trial3]
    name2 = [trial1, trial2, trial3]

    # 개인별 리스트의 최대값을 출력합니다
    print('Name 1: ' + str(max(name1)))
    print('Name 2: ' + str(max(name2)))

    # 힘 센서를 누르면 리스트가 합쳐집니다
    # 새 리스트의 합계를 표시합니다
    await runloop.until(is_force_sensor_pressed)
    combo_list = name1 + name2
    print(combo_list)
    await light_matrix.write(str(sum(combo_list)))
    print(sum(combo_list))
    light_matrix.show_image(light_matrix.IMAGE_YES)

runloop.run(main())

학생들에게 프로그램을 살펴볼 시간을 주고, 합쳐진 리스트의 값 합계를 출력해 보여주기 위한 여러 가지 방법을 시도해보라고 하세요. 리스트별 합계와 전체 합계를 보여줄 방법도 함께 찾아보면 좋겠죠.

설명

(전체 그룹, 15분)

프로그램이 어떻게 작동했는지에 대해 학생들과 이야기를 나눠보세요.
이런 질문을 던져보세요.
• 리스트에 넣을 데이터를 어떻게 생성할 수 있었나요?
• 힘 센서를 푸시 버튼으로 사용하여 작동을 시작하는 방식을 어떻게 포함시킬 수 있었나요?
• 리스트에 관한 여러 가지 정보(예: 합계 또는 최대값)를 어떻게 찾을 수 있었나요? 또 어떤 값을 찾을 수 있다고 생각하나요?
• 리스트를 어떻게 합칠 수 있나요? 이것이 어떤 경우에 유용할까요?

다듬기

(소규모 그룹, 25분)

학생들에게 자신의 리스트에 특정한 숫자가 포함되어 있는지 여부를 표시해보라고 하세요.

리스트에서 정보를 찾아보는 방법에 대해 학생들과 토의를 진행하세요. 프로그램에서 리스트를 보는 것은 쉽지만, 경우에 따라서는 리스트에 무엇이 들어 있는지를 알아봐야 할 상황이 생길 수도 있습니다. 어떻게, 그리고 왜 그런 일이 일어날 수 있을지를 그룹 토의에 부치세요.

학생들에게 콤보 리스트가 들어 있는 프로그램을 수정하여 콤보 리스트에 숫자 20이 포함되어 있는지 여부를 확인해보라고 하세요. 참고: 학생들의 데이터를 보고 숫자를 적절히 조정하세요.
샘플 프로그램을 학생들과 공유하고, 프로그램이 리스트를 어떻게 점검하여 숫자의 포함 여부를 인식하는지를 알아내보라고 하세요.

샘플 프로그램:

from hub import port, light_matrix
import runloop
import force_sensor

def is_force_sensor_pressed():
    # 힘 센서로부터 입력 값을 수집합니다
    return force_sensor.pressed(port.B)

async def main():
    # 표의 값을 사용하여 개인별 리스트를 만듭니다
    name1 = [trial1, trial2, trial3]
    name2 = [trial1, trial2, trial3]

    # 개인별 리스트의 최대값을 출력합니다
    print('Name 1: ' + str(max(name1)))
    print('Name 2: ' + str(max(name2)))

    # 힘 센서를 누르면 리스트가 합쳐집니다
    # 새 리스트의 합계를 표시합니다
    await runloop.until(is_force_sensor_pressed)
    combo_list = name1 + name2
    print(combo_list)
    await light_matrix.write(str(sum(combo_list)))
    print(sum(combo_list))
    light_matrix.show_image(light_matrix.IMAGE_YES)
    await runloop.sleep_ms(2000)
    light_matrix.clear()

    if (20 in combo_list):
        print('The number 20 is in the list.')
        light_matrix.show_image(light_matrix.IMAGE_YES)
    else:
        print('The number 20 is not in the list')
        light_matrix.show_image(light_matrix.IMAGE_NO)

runloop.run(main())

학생들에게 샘플 프로그램과 유사하게 프로그램을 수정하고, 여러 가지 값을 검색하여 어떤 값들이 프로그램에 들어 있는지/없는지 확인해보라고 하세요. 학생들이 얼마든지 다른 방식으로 프로그램을 수정하여 포함 여부를 표시해도 무방합니다.

평가

(그룹 실습, 10분)

교사 관찰:
학생들과 프로그램에 대해 토의를 진행하세요.
이런 질문을 던져보세요.
• 여러 리스트를 사용하여 데이터를 볼 수 있는 방식으로 어떤 것들이 있나요?
• 프로그램에 포함된 리스트가 어떤 식으로 유용한 기능을 제공하나요?
• 리스트에서 가져올 수 있는 다른 유형의 정보로 어떤 것들이 있을까요?

자기 평가:
학생들에게 다음 질문에 대한 답을 기록장에 적으라고 하세요.
• 오늘 여러 개의 리스트를 활용하는 방법에 대해 무엇을 배웠는가?
• 좋은 팀원의 특성은 무엇이며, 오늘 내가 그중 몇 가지를 보여주었는가?
• 학생들에게 오늘의 시간 관리에 대해 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-11 Create clearly named variables that represent different data types and perform operations on their values.
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.