P. 224 활동노트 플러그드 : 팔 굽혀 펴기 자동 측정 시스템 만들기 II(비상교육 정보교과서)

From Arduwiki

본 위키는 비상교육 고교 정보교과서 P. 224 활동노트 플러그드 : 팔 굽혀 펴기 자동 측정 시스템 만들기 II에 대한 내용을 서술합니다.


P. 224 활동노트 플러그드 : 팔 굽혀 펴기 자동 측정 시스템 만들기 II

다음과 같은 조건의 '팔 굽혀 펴기 자동 측정 시스템'을 만들려고 한다. 이 문제를 해결하기 위해 피지컬 컴퓨팅을 설계하고 오른쪽과 같은 회로를 완성하였다. 제어 프로그램을 작성하여 피지컬 컴퓨팅을 완성해보자.

조건 완성된 회로도
  • 초음파 센서를 이용해서 가슴과 지면 사이의 거리를 측정한다.
  • 측정 거리가 10cm 이하일 경우 발광 다이오드가 켜지고, 팔 굽혀 펴기 횟수가 한 개 올라간다.
  • 팔을 펼 때에는 20cm 이상이어야 한다.
  • 측정을 시작하거나 종료할 때는 버튼을 누른다.
  • 반 아이들이 모두 실행한 후, 횟수를 비교하는 그래프를 출력한다.
329x329픽셀

※ 교과서의 회로에서 버튼 회로는 수정했으니 참고바랍니다.

풀업 저항을 사용했으며 저항 및 플로팅 현상에 대한 자세한 내용은 택트 스위치 문서에서 확인하세요.


1. 주어진 문제의 '현재 상태'와 '목표 상태'를 각각 적어 보자.

현재 상태
  • 초음파 센서를 통해 가슴과 지면 사이의 거리를 측정하고 있다.
  • 현재 측정된 거리가 10cm 이하일 경우 발광 다이오드가 켜진다.
  • 측정된 거리가 10cm 이하일 때 팔 굽혀 펴기 횟수가 증가한다.
  • 팔을 펼 때는 반드시 거리가 20cm 이상이어야 한다.
  • 측정 시작 및 종료는 버튼을 눌러야 한다.
  • 현재까지 팔 굽혀 펴기 횟수는 개인별로 기록되고 있다.
목표 상태
  • 모든 반 아이들이 초음파 센서를 이용하여 팔 굽혀 펴기를 수행한 후, 각자의 횟수를 기록한다.
  • 각 아이들의 팔 굽혀 펴기 횟수를 비교할 수 있는 그래프를 출력한다.
  • 측정이 원활하게 이루어져야 하며, 버튼을 통해 시작과 종료가 명확히 구분되어야 한다.
  • 발광 다이오드의 상태가 팔 굽혀 펴기 동작의 유효성을 나타내야 한다.


2. 피지컬 컴퓨팅을 제어하는 프로그램을 작성해 보자.

(1) 입력 자료 만들기

#define TRIGGER_PIN  10
#define ECHO_PIN     11
#define LED_PIN      12
#define BUTTON_PIN   8

int count = 0;
bool measuring = false;
bool isInPosition = false;  // 10cm 이하에 있는지 여부

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  Serial.begin(9600);
}


(2) 계산하기

단순히 초음파 센서 값을 확인하고 카운트를 한다면 몸이 10cm 이내에 있는 동안 계속 카운트가 되어 측정 횟수에 오류가 생깁니다.

IsInPosition 변수를 사용하여 초음파 센서 값 10cm 이내에 들어온 이후 몸을 다시 들어올려 20cm 밖으로 나가면 카운트가 1 올라가도록 했습니다.

void loop() {
  if (digitalRead(BUTTON_PIN) == LOW) {
    measuring = !measuring;
    if (measuring) {
      count = 0;
      isInPosition = false;  // 초기화
      Serial.println("측정 시작!");
    } else {
      Serial.print("총 팔 굽혀 펴기 횟수: ");
      Serial.println(count);
    }
    delay(500); // debounce delay
  }

  if (measuring) {
    delay(50); // 측정 간격
    long duration, distance;

    // 초음파 발사
    digitalWrite(TRIGGER_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIGGER_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIGGER_PIN, LOW);

    // 반사된 초음파 수신
    duration = pulseIn(ECHO_PIN, HIGH);

    // 거리 계산 (cm 단위)
    distance = (duration / 2) * 0.0343; // 소리의 속도: 0.0343 cm/μs

    if (distance > 0) {
      if (distance <= 10) {
        digitalWrite(LED_PIN, HIGH);
        if (!isInPosition) {
          isInPosition = true;  // 10cm 이하로 들어옴
        }
      } else if (distance >= 20) {
        digitalWrite(LED_PIN, LOW);
        if (isInPosition) {
          count++;  // 다시 10cm 이상으로 나가면 카운트 증가
          isInPosition = false;  // 상태 초기화
        }
      }
    }
  }
}


(3) 출력 자료 만들기

import matplotlib.pyplot as mplot

# Sample data
names = ['Student A', 'Student B', 'Student C']
counts = [5, 8, 3]

# Create bar graph
mplot.bar(names, counts, color=['blue', 'orange', 'green'])

# Set graph title and axis labels
mplot.xlabel('Students')
mplot.ylabel('Push-up Count')
mplot.title('Push-up Count Comparison')

# Show the graph
mplot.show()


실행 결과

○ 작동 영상


○ 시리얼 모니터

파일:팔굽혀펴기측정장치비상교육.jpg


○ 그래프 출력(Matplot)

파일:비상교육p224그래프.jpg