중력가속도 측정 실험 학생 가이드
Arduino UNO와 GP1A57HRJ00F 포토인터럽터로 피켓펜스가 통과하는 시각을 기록하고, 위치-시간 자료에서 중력가속도 g를 구한다.
1. 준비물
아래 사진을 보며 준비물을 먼저 확인한다. 같은 기능의 부품이라도 제조사나 키트 구성에 따라 색, 모양, 크기가 조금 다를 수 있다.
| 분류 | 준비물 | 확인할 점 |
|---|---|---|
| 전자 부품 | Arduino UNO, USB 케이블, 브레드보드, 점퍼선, GP1A57HRJ00F 포토인터럽터, 220Ω 또는 330Ω 저항 | 저항은 GP1 1번 핀으로 들어가는 적외선 LED 전류를 제한한다. |
| 피켓펜스 | 투명 플라스틱 판, 검은색 테이프, 자, 칼 또는 가위 | 전체 길이가 약 30 cm라면 검은색 1.0 cm, 투명 1.0 cm 간격으로 만드는 것을 권장한다. |
| 분석 | Arduino IDE, 구글 스프레드시트 | 시리얼 모니터 결과를 CSV로 저장하고 그래프와 추세선을 만든다. |
2. Arduino IDE 준비
2-1. 설치하기
- 인터넷에서 Arduino 공식 Software 페이지를 연다.
- Windows Win 10 and newer, 64 bits 항목을 내려받는다.
- 설치 파일을 실행하고 기본값으로 설치한다. 학교 컴퓨터에서 관리자 권한을 요구하면 선생님에게 요청한다.
- 설치가 끝나면 Arduino IDE를 실행한다.
2-2. 한국어로 바꾸기
처음 설치한 Arduino IDE는 기본값이 영어이다. 따라서 한글 메뉴가 보이지 않는 것이 정상이며, 아래 순서대로 영어 메뉴에서 환경설정을 찾아 들어간다.
- Arduino IDE를 처음 열면 상단 메뉴가 File, Edit, Sketch, Tools, Help처럼 영어로 보인다.
- File을 누른 뒤 아래쪽의 Preferences...를 선택한다. 단축키 Ctrl + ,도 사용할 수 있다.
- Preferences 창에서 Language 드롭다운을 누른다.
- 목록에서 한국어를 선택한 뒤 OK를 누른다.
- 화면이 다시 로드되면 메뉴가 파일, 편집, 스케치, 도구, 도움말처럼 한국어로 바뀐다.
2-3. 화면 영역 알아보기
| 화면 위치 | 이름 | 이번 실험에서 하는 일 |
|---|---|---|
| 왼쪽 위 체크 표시 | 확인 | 코드에 문법 오류가 있는지 검사한다. |
| 왼쪽 위 오른쪽 화살표 | 업로드 | 작성한 코드를 Arduino UNO에 넣는다. |
| 상단 보드 선택 칸 | 보드/포트 선택 | Arduino UNO와 연결 포트를 선택한다. |
| 가운데 흰색 영역 | 코드 편집기 | 실험 코드를 붙여 넣고 수정한다. |
| 오른쪽 위 돋보기 모양 | 시리얼 모니터 | 센서가 기록한 CSV 데이터를 확인한다. |
2-4. 보드와 포트 선택하기
- Arduino UNO를 USB 케이블로 컴퓨터에 연결한다.
- 상단의 보드 선택 칸을 누른다.
- 목록에서 Arduino UNO와 COM 번호가 함께 표시된 항목을 선택한다. COM 번호는 컴퓨터마다 다를 수 있다.
- 오른쪽 아래 상태 표시줄에 Arduino UNO COM숫자 켜기처럼 표시되면 연결된 것이다.
2-5. 보드 정상 동작 테스트와 업로드
센서와 브레드보드를 연결하기 전에 Arduino UNO 보드만 먼저 확인한다. 이 단계에서는 USB 케이블만 연결하고, 다른 점퍼선이나 부품은 꽂지 않는다.
- 기존 예제 코드가 있다면 전체 선택 후 지운다.
- 아래 코드를 코드 편집기에 붙여 넣는다. 이 코드는 Arduino UNO 보드에 달린 내장 LED를 1초마다 깜빡이게 한다.
- 체크 표시 확인을 눌러 오류가 없는지 확인한다.
- 오른쪽 화살표 업로드를 눌러 Arduino UNO에 코드를 넣는다.
- 업로드가 끝난 뒤 보드 위의 L이라고 표시된 작은 LED가 1초 간격으로 켜졌다 꺼지면 보드와 업로드 기능이 정상이다.
// Arduino UNO 보드 자체가 정상인지 확인하는 가장 간단한 테스트입니다.
// 아무 부품도 연결하지 않고 USB 케이블만 연결한 상태에서 실행합니다.
// LED_BUILTIN은 Arduino UNO 보드 위의 'L' LED와 연결된 내장 핀입니다.
void setup() {
// setup()은 보드가 켜지거나 리셋될 때 딱 한 번 실행됩니다.
// 내장 LED 핀을 OUTPUT으로 설정해야 Arduino가 LED를 켜고 끌 수 있습니다.
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// loop()는 setup()이 끝난 뒤 계속 반복 실행됩니다.
// HIGH는 전압을 내보내라는 뜻이므로 내장 LED가 켜집니다.
digitalWrite(LED_BUILTIN, HIGH);
// 1000 ms = 1초 동안 기다립니다.
delay(1000);
// LOW는 전압을 내보내지 말라는 뜻이므로 내장 LED가 꺼집니다.
digitalWrite(LED_BUILTIN, LOW);
// 다시 1초 동안 기다린 뒤 loop()의 처음으로 돌아갑니다.
delay(1000);
}
내장 LED 테스트가 끝나면 같은 방법으로 이 문서의 센서 테스트 코드 또는 측정 코드를 다시 붙여 넣고 업로드한다.
3. 배선하기
3-1. GP1 핀 번호 먼저 확인하기
GP1A57HRJ00F의 핀은 총 5개이다. 부품 겉면에는 핀 기능이 자세히 적혀 있지 않기 때문에, 핀 번호를 잘못 잡으면 VCC와 GND를 반대로 연결하거나 적외선 LED에 저항 없이 전류가 흐를 수 있다.
| 핀 번호 | 위치 구분 | 연결 |
|---|---|---|
| 1번 | 핀이 2개 있는 쪽의 짧은 핀 | 브레드보드 10e에 연결한다. 10d와 위쪽 +레일(5V) 사이에 꽂은 220Ω 저항을 통해 5V와 이어진다. |
| 2번 | 핀이 2개 있는 쪽의 긴 핀 | 브레드보드 위쪽 -레일(GND)에 연결한다. |
| 3번 | 3개의 핀 중 1번 핀의 맞은편에 있는 핀 | 브레드보드 위쪽 -레일(GND)에 연결한다. |
| 4번 | 3개의 핀 중 가운데 핀 | 아두이노의 D2 핀에 직접 연결한다. |
| 5번 | 3개의 핀 중 2번 핀의 맞은편에 있는 핀 | 브레드보드 위쪽 +레일(5V)에 연결한다. |
3-2. 배선도대로 연결하기
| GP1 핀 | 기능 | 연결 위치 | 주의 |
|---|---|---|---|
| 1번 | 적외선 LED + | 브레드보드 10e | 10d와 위쪽 +레일(5V) 사이의 220Ω 저항을 통해 5V와 연결한다. |
| 2번 | 적외선 LED - | 브레드보드 위쪽 -레일(GND) | 3번과 같은 GND 레일에 연결해도 된다. |
| 3번 | 센서 회로 GND | 브레드보드 위쪽 -레일(GND) | GND는 모두 같은 기준 전압이다. |
| 4번 | 센서 출력 VO | Arduino D2 | 피켓펜스 통과 시각을 읽는 입력 핀이다. |
| 5번 | 센서 회로 VCC | 브레드보드 위쪽 +레일(5V) | 저항 없이 5V에 직접 연결한다. |
왜 5V 연결이 두 개인가?
GP1 내부에는 빛을 내는 적외선 LED와 빛을 감지하는 센서 회로가 따로 들어 있다. 그래서 5번 핀은 센서 회로 전원이고, 1번 핀은 적외선 LED 전원이다. 단, LED는 전류 제한이 필요하므로 1번 핀으로 가는 길에 저항을 넣는다.
Arduino 5V
├─ GP1 5번 핀: 센서 회로 전원
└─ 저항 ─ GP1 1번 핀: 적외선 LED 전원
GP1에서 5V에 연결되는 핀과 GND에 연결되는 핀이 각각 두 개씩인 이유는 무엇일까요?
GP1 안에는 빛을 내는 적외선 LED 부분과 빛을 감지해 신호를 만드는 센서 회로 부분이 따로 들어 있다. 1번·2번 핀은 적외선 LED 쪽 전원 경로이고, 5번·3번 핀은 센서 회로 쪽 전원 경로이다. 그래서 1번과 5번은 둘 다 5V 쪽으로 가지만, 1번은 LED 보호를 위해 저항을 거쳐야 한다. 2번과 3번은 둘 다 GND에 연결해 두 회로가 같은 기준 전압을 공유하게 한다.
4. 센서 테스트
피켓펜스를 떨어뜨리기 전에 검은색 테이프나 종이 조각으로 센서 틈을 막았다가 열면서 HIGH/LOW가 바뀌는지 확인한다.
- 아래 센서 테스트 코드를 Arduino IDE에 붙여 넣고 업로드한다.
- 그림의 ① 오른쪽 위 시리얼 모니터 아이콘을 누르거나 Ctrl + Shift + M을 누른다.
- ② 시리얼 모니터 패널이 열렸는지 확인한다.
- ③ 전송 속도를 115200 baud로 맞춘다. 코드의
Serial.begin(115200)과 같은 값이어야 한다. - 검은색 테이프나 종이 조각으로 센서 틈을 막았다가 열어 보며 출력이 바뀌는지 확인한다.
// GP1A57HRJ00F 포토인터럽터가 빛을 감지하는지 확인하는 테스트 코드입니다.
// 센서의 4번 핀(VO)을 Arduino의 D2 핀에 연결했기 때문에 sensorPin을 2로 정합니다.
const int sensorPin = 2;
// 직전에 읽은 센서값을 저장합니다.
// 처음에는 아직 읽은 값이 없으므로 HIGH도 LOW도 아닌 -1로 시작합니다.
int lastState = -1;
void setup() {
// 시리얼 모니터와 Arduino가 115200 baud 속도로 통신하도록 시작합니다.
// 시리얼 모니터의 속도도 115200 baud로 맞춰야 글자가 제대로 보입니다.
// 뒤에서 사용할 실제 측정 코드도 115200 baud를 사용하므로 여기서부터 같은 속도로 연습합니다.
Serial.begin(115200);
// D2 핀을 입력으로 사용합니다.
// 이 핀으로 센서 출력값 HIGH 또는 LOW를 읽습니다.
pinMode(sensorPin, INPUT);
// 시리얼 모니터에 테스트 시작 안내 문장을 출력합니다.
Serial.println("GP1A57HRJ00F photo interrupter test");
Serial.println("빛길이 열려 있으면 보통 HIGH, 막히면 LOW입니다.");
}
void loop() {
// 현재 센서값을 읽습니다.
// 빛길이 열려 있으면 보통 HIGH, 검은 종이나 테이프로 막으면 LOW가 됩니다.
int state = digitalRead(sensorPin);
// 센서값이 이전과 달라졌을 때만 출력합니다.
// 이렇게 하면 같은 문장이 너무 많이 반복되어 올라오는 것을 막을 수 있습니다.
if (state != lastState) {
if (state == HIGH) {
Serial.println("HIGH: 빛길 열림");
} else {
Serial.println("LOW: 빛길 차단");
}
// 이번에 읽은 값을 다음 비교를 위해 저장합니다.
lastState = state;
}
// 너무 빠르게 반복하지 않도록 20 ms만 쉬어 갑니다.
delay(20);
}
LOW, 다시 열 때 HIGH가 나오면 배선과 센서가 정상이다.센서가 막혔을 때 LOW가 나온다는 것은 실험에서 어떤 의미일까요?
검은색 테이프가 포토인터럽터의 빛길을 막는 순간을 Arduino가 전압 변화로 구분할 수 있다는 뜻이다. 피켓펜스가 떨어질 때 검은색 경계가 지나갈 때마다 이런 변화가 생기고, Arduino는 그 순간의 시간을 기록한다.
5. 피켓펜스 제작
피켓펜스는 포토인터럽터의 빛을 막았다가 다시 열어 주는 자 역할을 한다. 검은색 테이프의 앞쪽 경계가 센서를 지나는 순간을 차례대로 기록하면, 각 경계 사이의 실제 거리를 알고 있으므로 시간-위치 데이터를 만들 수 있다.
전체 길이를 약 30 cm로 만들 때는 검은색 1.0 cm, 투명 1.0 cm를 기본 규격으로 추천한다. 이렇게 하면 같은 종류의 경계 사이 거리가 2.0 cm가 되어 약 15개의 측정 지점을 얻을 수 있다. 0.5 cm + 0.5 cm처럼 너무 촘촘하게 만들면 데이터 수는 늘어나지만, 테이프를 정확히 붙이기 어렵고 낙하 후반부에서 센서가 경계를 놓칠 가능성이 커진다.
- 투명 플라스틱 판을 포토인터럽터 틈보다 충분히 좁게 자른다. 센서 몸체에 닿지 않도록 폭을 먼저 확인한다.
- 자와 가는 펜으로 플라스틱 판에 1.0 cm 간격 표시를 끝까지 한다.
- 표시선을 기준으로 검은색 테이프를 1.0 cm 폭으로 붙이고, 그다음 1.0 cm는 투명하게 비워 둔다.
- 검은색-투명-검은색-투명 순서가 끝까지 반복되도록 붙인다.
- 테이프가 비뚤어지거나 들뜬 부분이 있으면 센서가 잘못 인식할 수 있으므로 손으로 눌러 평평하게 정리한다.
| 구간 | 길이 | 의미 |
|---|---|---|
| 검은색 테이프 폭 | 1.0 cm = 10 mm | 센서 빛길을 차단하는 구간 |
| 투명 구간 폭 | 1.0 cm = 10 mm | 센서 빛길이 열리는 구간 |
| 같은 종류의 경계 사이 거리 | 2.0 cm = 0.020 m | 분석에서 사용하는 위치 간격 |
검은색 1.0 cm, 투명 1.0 cm로 만들면 분석에서 사용하는 위치 간격은 왜 2.0 cm일까요?
센서는 검은색 테이프의 같은 종류의 경계가 지나가는 순간을 차례로 기록한다. 한 검은색 테이프의 앞쪽 경계에서 다음 검은색 테이프의 앞쪽 경계까지는 검은색 1.0 cm와 투명 1.0 cm를 합친 거리이므로 2.0 cm이다. 그래서 위치 간격 d는 0.020 m로 입력한다.
6. 데이터 수집
- 아래 측정 코드를 Arduino IDE에 붙여 넣고 업로드한다.
- 그림의 ① 오른쪽 위 돋보기 모양을 누르거나 Ctrl + Shift + M을 누른다.
- ② 시리얼 모니터 패널이 열렸는지 확인한다.
- ③ 오른쪽 아래 전송 속도를 115200 baud로 맞춘다.
- 시리얼 모니터에
# 측정 준비 완료가 나오면 피켓펜스를 떨어뜨린다. - 피켓펜스를 10번 떨어뜨린다. 주워 오는 시간은 자동으로 무시되므로 천천히 다시 준비해도 된다.
- 측정이 끝나면 ④ 시리얼 모니터 우측 상단의 복사 버튼을 눌러 출력 내용을 한 번에 복사한다.
아래 코드는 피켓펜스의 맨 아래 검은색 칸을 센서에 끼워 둔 상태에서 시작한다. 센서가 검은색을 감지하면 # 측정 준비 완료라고 표시하고, 실제로 떨어뜨릴 때 처음 검은색 칸이 빠져나가는 변화는 버린다. 그다음 검은색 칸부터 index = 0으로 기록한다.
// 피켓펜스가 포토인터럽터를 지나갈 때의 시간을 CSV 형식으로 기록하는 코드입니다.
// 이 코드는 피켓펜스의 맨 아래 검은색 칸을 센서에 끼워 둔 상태에서 시작하도록 만들었습니다.
// 센서가 처음 검은색을 보고 있으면 "측정 준비 완료"라고 알려 줍니다.
// 실제로 떨어뜨릴 때 그 첫 검은색 칸이 빠져나가는 순간은 기록하지 않고,
// 그다음 검은색 칸이 센서에 들어오는 순간부터 index 0으로 기록합니다.
// GP1A57HRJ00F의 4번 핀(VO)이 Arduino D2에 연결되어 있으므로 2번 핀을 읽습니다.
const int sensorPin = 2;
// 이번 실험에서는 총 10번 떨어뜨릴 예정입니다.
const int maxTrials = 10;
// 피켓펜스의 경계가 아주 많이 감지되어도 한 번의 낙하에서 40개까지만 기록합니다.
// 실수로 손으로 센서를 계속 막았다 열 때 데이터가 끝없이 길어지는 것을 막기 위한 제한입니다.
const int maxEventsPerTrial = 40;
// 센서 신호가 아주 짧게 흔들릴 때 중복 기록되는 것을 막는 시간입니다.
// 1000 μs = 1 ms보다 짧은 간격의 변화는 같은 사건으로 보고 무시합니다.
const unsigned long debounceUs = 1000;
// 한 trial이 끝났다고 판단하는 기준 시간입니다.
// 마지막 경계가 지나간 뒤 300000 μs = 300 ms 동안 새 경계가 없으면 다음 낙하를 기다립니다.
const unsigned long trialEndGapUs = 300000;
// 현재 몇 번째 낙하 실험인지 저장합니다.
int trial = 1;
// 한 trial 안에서 몇 번째 경계가 지나갔는지 저장합니다.
int eventIndex = 0;
// 지금 피켓펜스가 지나가는 중이면 true, 기다리는 중이면 false입니다.
bool recording = false;
// 맨 아래 검은색 칸이 센서에 끼워져 있어서 떨어뜨릴 준비가 끝났는지 저장합니다.
bool readyToDrop = false;
// 준비 상태의 첫 검은색 칸이 빠져나갔는지 저장합니다.
// 이 값이 true가 된 뒤에 들어오는 다음 검은색 칸부터 실제 데이터로 기록합니다.
bool firstBlackReleased = false;
// 같은 안내 문장이 계속 반복 출력되지 않도록, 현재 안내 상태를 숫자로 기억합니다.
// 0: 아직 안내 없음, 1: 검은 칸을 끼우라는 안내 출력, 2: 측정 준비 완료 출력
int statusMessage = 0;
// 직전에 읽은 센서값입니다. HIGH/LOW 변화 순간을 찾는 데 사용합니다.
int lastState;
// 한 trial의 첫 번째 기록 경계가 지나간 절대 시각입니다.
unsigned long trialStartTime = 0;
// 가장 최근에 기록된 경계가 지나간 절대 시각입니다.
unsigned long lastEventTime = 0;
void setup() {
// 시리얼 모니터와 Arduino가 빠르게 통신하도록 115200 baud로 시작합니다.
// 시리얼 모니터에서도 반드시 115200 baud를 선택해야 합니다.
Serial.begin(115200);
// 센서 출력이 들어오는 D2 핀을 입력으로 설정합니다.
pinMode(sensorPin, INPUT);
// 시작 순간의 센서 상태를 먼저 저장합니다.
// 그래야 첫 loop()에서 이전 상태와 현재 상태를 비교할 수 있습니다.
lastState = digitalRead(sensorPin);
// #으로 시작하는 줄은 사람에게 보여 주는 안내문입니다.
// 스프레드시트에 붙여 넣을 때는 trial,index,...로 시작하는 줄부터 복사하면 됩니다.
Serial.println("# 피켓펜스의 맨 아래 검은색 칸을 센서 틈에 끼워 주세요.");
statusMessage = 1;
// 스프레드시트에 붙여 넣기 쉽도록 열 이름을 출력합니다.
Serial.println("trial,index,time_us,relative_us,delta_us");
}
void loop() {
// 정해진 횟수만큼 실험이 끝나면 더 이상 기록하지 않습니다.
if (trial > maxTrials) {
return;
}
// 현재 센서 상태와 현재 시간을 읽습니다.
// micros()는 Arduino가 켜진 뒤 지난 시간을 마이크로초(μs) 단위로 돌려줍니다.
int state = digitalRead(sensorPin);
unsigned long now = micros();
// 기록 중이 아닐 때는 먼저 "맨 아래 검은색 칸이 센서에 끼워졌는지" 확인합니다.
// GP1A57HRJ00F는 보통 빛길이 열려 있으면 HIGH, 검은색이 막고 있으면 LOW가 됩니다.
if (!recording && !firstBlackReleased) {
// 센서가 LOW라면 검은색 칸이 빛길을 막고 있다는 뜻입니다.
// 이 상태가 바로 학생이 손으로 피켓펜스를 잡고 대기하는 "측정 준비 완료" 상태입니다.
if (state == LOW && !readyToDrop) {
readyToDrop = true;
statusMessage = 2;
Serial.print("# trial ");
Serial.print(trial);
Serial.println(": 측정 준비 완료 - 손을 놓아 피켓펜스를 떨어뜨리세요.");
}
// 센서가 HIGH라면 아직 검은색 칸이 센서에 끼워져 있지 않은 상태입니다.
// 안내문이 너무 많이 반복되지 않도록 상태가 바뀔 때만 출력합니다.
if (state == HIGH && !readyToDrop && statusMessage != 1) {
statusMessage = 1;
Serial.print("# trial ");
Serial.print(trial);
Serial.println(": 맨 아래 검은색 칸을 센서 틈에 끼워 주세요.");
}
}
// 준비 상태에서 피켓펜스를 떨어뜨리면, 맨 아래 검은색 칸이 센서에서 빠져나갑니다.
// 이때 센서값은 LOW에서 HIGH로 바뀝니다.
// 이 변화는 "출발 신호"로만 사용하고, 데이터에는 기록하지 않습니다.
if (readyToDrop && !firstBlackReleased && lastState == LOW && state == HIGH) {
firstBlackReleased = true;
readyToDrop = false;
statusMessage = 0;
// 너무 빠르게 이어지는 흔들림을 거르기 위해 출발 시각을 저장합니다.
lastEventTime = now;
Serial.print("# trial ");
Serial.print(trial);
Serial.println(": 낙하 시작 - 첫 검은색 칸은 제외하고 다음 칸부터 기록합니다.");
}
// 첫 검은색 칸이 빠져나간 뒤에는 다음 검은색 칸부터 기록합니다.
// 직전에는 빛길이 열려 있었고(HIGH), 지금은 막혔다면(LOW)
// 다음 검은색 테이프의 앞쪽 경계가 센서를 지나간 순간으로 봅니다.
if (firstBlackReleased && lastState == HIGH && state == LOW) {
// 너무 짧은 시간 안에 반복된 신호는 흔들림으로 보고 기록하지 않습니다.
if (now - lastEventTime > debounceUs) {
recordEvent(now);
}
}
// 다음 loop()에서 비교할 수 있도록 현재 상태를 저장합니다.
lastState = state;
// 기록 중인데 오랫동안 새 경계가 들어오지 않으면 한 번의 낙하가 끝난 것입니다.
if (recording && (now - lastEventTime > trialEndGapUs)) {
endTrial();
}
// 시리얼 모니터 입력창에 r 또는 R을 보내면 처음부터 다시 측정할 수 있습니다.
if (Serial.available() > 0) {
char c = Serial.read();
if (c == 'r' || c == 'R') {
resetAll();
}
}
}
void recordEvent(unsigned long now) {
// 아직 기록 중이 아니었다면, 이번 경계가 새 trial의 첫 번째 기록 경계입니다.
if (!recording) {
recording = true;
eventIndex = 0;
trialStartTime = now;
}
// 한 trial에서 너무 많은 사건이 들어오면 더 이상 기록하지 않습니다.
if (eventIndex >= maxEventsPerTrial) {
return;
}
// 첫 번째 기록 경계가 지난 시각을 0으로 놓고, 그 뒤로 지난 시간을 계산합니다.
unsigned long relativeTime = now - trialStartTime;
// 바로 이전 기록 경계와 이번 기록 경계 사이의 시간 간격입니다.
// 첫 번째 기록 경계는 이전 기록 경계가 없으므로 0으로 기록합니다.
unsigned long deltaTime = (eventIndex == 0) ? 0 : now - lastEventTime;
// 한 줄을 CSV 형식으로 출력합니다.
// 쉼표로 구분되어 있으므로 스프레드시트에 붙여 넣기 쉽습니다.
Serial.print(trial);
Serial.print(",");
Serial.print(eventIndex);
Serial.print(",");
Serial.print(now);
Serial.print(",");
Serial.print(relativeTime);
Serial.print(",");
Serial.println(deltaTime);
// 다음 경계를 위해 번호와 시간을 갱신합니다.
eventIndex++;
lastEventTime = now;
}
void endTrial() {
// 현재 trial을 끝내고 다음 낙하를 기다리는 상태로 돌아갑니다.
recording = false;
readyToDrop = false;
firstBlackReleased = false;
statusMessage = 0;
eventIndex = 0;
trial++;
if (trial <= maxTrials) {
Serial.print("# trial ");
Serial.print(trial);
Serial.println(": 맨 아래 검은색 칸을 센서 틈에 끼워 주세요.");
statusMessage = 1;
} else {
Serial.println("# 모든 trial이 끝났습니다. 다시 시작하려면 r을 입력하세요.");
}
}
void resetAll() {
// 시리얼 모니터에서 r을 보냈을 때 모든 값을 처음 상태로 되돌립니다.
trial = 1;
eventIndex = 0;
recording = false;
readyToDrop = false;
firstBlackReleased = false;
statusMessage = 0;
trialStartTime = 0;
lastEventTime = 0;
lastState = digitalRead(sensorPin);
// 새로 복사해도 표 형태를 알 수 있도록 열 이름을 다시 출력합니다.
Serial.println("# 다시 시작합니다. 피켓펜스의 맨 아래 검은색 칸을 센서 틈에 끼워 주세요.");
statusMessage = 1;
Serial.println("trial,index,time_us,relative_us,delta_us");
}
맨 아래 검은색 칸을 먼저 센서에 끼워 두는데, 왜 그 칸은 측정에서 제외할까요?
맨 아래 검은색 칸은 “준비 완료”를 확인하기 위한 기준점이다. 이 칸을 끼워 둔 상태에서는 이미 센서가 막혀 있으므로, 실제 낙하가 시작된 뒤의 정상적인 통과 시간으로 보기 어렵다. 그래서 첫 검은색 칸이 빠져나간 뒤 다음 검은색 칸부터 index 0으로 기록한다.
7. 데이터 정제
시리얼 모니터에서 복사한 내용에는 실제 측정값뿐 아니라 # 측정 준비 완료 같은 안내문도 함께 들어 있다. 이 장에서는 안내문을 제거하고, 쉼표로 이어진 원자료를 계산 가능한 숫자 표로 바꾼다.
구글 클래스룸 과제에 첨부된 중력가속도 실험 데이터 정제 양식을 확인하고, 학생별로 제공된 자신의 사본에서 작업한다.
7-1. 원자료 시트에 붙여넣기
- 아래쪽 탭에서 원자료 시트를 선택한다.
- 안내 문장을 확인한다. 실제 데이터는 A3 셀부터 붙여 넣는다.
- 6장에서 시리얼 모니터의 복사 버튼으로 복사한 내용을 A3 아래에 그대로 붙여 넣는다. 안내문이 섞여 있어도 괜찮다.
- 붙여 넣기가 끝나면 정제결과 시트로 이동한다.
7-2. 정제결과 시트 확인하기
정제결과 시트의 A:E 열은 원자료 시트에서 숫자 데이터만 골라 자동으로 정리한다. 이 시트는 원자료를 정제하는 역할만 맡는다. 시간, 위치, 시간제곱, 속도, 회귀선 같은 분석용 계산은 뒤의 물리 시트와 수학 시트에서 따로 수행한다.
| 영역 | 의미 |
|---|---|
| 정제결과 탭 | 원자료를 분석 가능한 숫자 표로 바꾼 결과를 확인한다. |
| A:E 열 | 회차, 순번, 측정시각_μs, 상대시간_μs, 구간시간_μs만 남긴 정제 데이터이다. |
| 물리·수학 시트 | 정제결과의 A:E 열을 바탕으로 물리량 계산과 회귀분석을 각각 수행한다. |
7-3. 정제 공식의 의미
정제결과 시트의 A2 셀에는 다음 공식이 들어 있다. 지워졌다면 A2에 다시 입력한다.
=ARRAYFORMULA(VALUE(SPLIT(FILTER('원자료'!A:A,REGEXMATCH('원자료'!A:A,"^[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+$")),",")))
| 부분 | 역할 |
|---|---|
REGEXMATCH(...) | 쉼표로 구분된 숫자 5개로 이루어진 줄만 찾는다. #으로 시작하는 안내문은 제외된다. |
FILTER(...) | 조건에 맞는 측정 데이터 줄만 가져온다. |
SPLIT(...,",") | 한 줄의 CSV 데이터를 쉼표 기준으로 5개 열로 나눈다. |
VALUE(...) | 문자로 들어온 숫자를 계산 가능한 숫자값으로 바꾼다. |
ARRAYFORMULA(...) | 여러 줄의 데이터를 한 번에 처리한다. |
원자료에 안내문이 섞여 있어도 정제결과 시트에서 숫자 데이터만 남는 이유는 무엇일까요?
정제 공식은 쉼표로 구분된 숫자 5개로 이루어진 줄만 골라낸다. #으로 시작하는 안내문이나 사람이 읽는 설명 줄은 이 조건에 맞지 않으므로 제외된다. 그래서 원자료에는 전체 출력을 그대로 붙여 넣고, 정제결과에서 분석 가능한 숫자 줄만 확인하면 된다.
8. 물리학적 해석
이 장에서는 계산 방법보다 먼저 “왜 물체가 떨어지는가”를 물리 이론으로 정리한다. 출발점은 뉴턴의 만유인력 법칙이다. 그다음 지표면 근처에서 중력가속도 g를 거의 일정한 값으로 보고, 등가속도 운동과 역학적 에너지 보존을 이용해 실험 데이터에서 g를 추론한다.
8-1. 만유인력과 중력가속도
지구와 물체 사이에는 서로 끌어당기는 힘이 작용한다. 이 힘을 중력이라고 하고, 뉴턴의 만유인력 법칙은 두 물체 사이의 중력 크기를 다음과 같이 나타낸다.
| 기호 | 뜻 | 이번 실험에서의 의미 |
|---|---|---|
G | 만유인력 상수 | 자연에 정해진 상수이다. |
M | 지구의 질량 | 실험 중 변하지 않는다. |
m | 떨어지는 물체의 질량 | 피켓펜스의 질량이다. |
r | 지구 중심에서 물체까지의 거리 | 교실 안 낙하 높이는 지구 반지름에 비해 매우 작으므로 거의 일정하다고 본다. |
물체에 작용하는 중력은 동시에 \(F = mg\)복사용: F = m g 로도 나타낼 수 있다. 두 식이 같은 힘을 나타내므로 다음 관계가 나온다.
여기서 중요한 점은 m이 약분된다는 것이다. 공기저항이 작고 다른 힘이 무시된다면, 무거운 물체와 가벼운 물체는 같은 위치에서 같은 중력가속도를 가진다. 이 실험은 지구의 질량을 직접 구하는 실험은 아니지만, 지표면 근처에서 거의 일정하게 작용하는 g를 낙하 운동으로 측정하는 실험이다.
8-2. 실험에서 사용할 두 가지 해석
교실에서 피켓펜스가 떨어지는 높이는 지구 반지름에 비해 매우 작다. 그래서 낙하하는 동안 g가 거의 변하지 않는다고 보고, 피켓펜스를 등가속도 운동을 하는 물체로 해석할 수 있다.
| 해석 관점 | 출발 이론 | 기본식 | 실험에서 확인하는 방법 |
|---|---|---|---|
| 등가속도 운동 | 가속도 g가 거의 일정하면 속도는 시간에 따라 일정하게 증가한다. |
\(v = v_0 + gt\)복사용: v = v0 + g t | 시간-속도 그래프를 그렸을 때 직선에 가까운지 보고, 그 기울기를 g로 해석한다. |
| 역학적 에너지 보존 | 공기저항과 충돌이 작으면 위치에너지 감소가 운동에너지 증가로 바뀐다. | \(mgh = \frac{1}{2}mv^2\)복사용: m g h = (1/2) m v^2 | 위치-속도제곱 그래프를 그렸을 때 직선에 가까운지 보고, 그 기울기의 절반을 g로 해석한다. |
에너지 식에서 물체가 정지 상태에서 출발한다고 보면 mgh = 1/2 mv²이고, 질량 m은 양쪽에서 약분된다. 따라서 \(v^2 = 2gh\)복사용: v^2 = 2 g h 가 된다. 실제 실험에서는 손을 놓는 순간의 초기속도가 완전히 0이 아닐 수 있으므로, 그래프 해석에서는 더 일반적인 형태인 \(v^2 = v_0^2 + 2gx\)복사용: v^2 = v0^2 + 2 g x 를 사용한다.
8-3. 단위 맞추기
물리 계산에서는 숫자만 맞아도 단위가 틀리면 결과가 완전히 달라진다. 이 가이드에서는 모든 계산을 SI 단위로 통일한다. 즉 시간은 초(s), 길이는 미터(m), 속도는 m/s, 가속도는 m/s²로 계산한다.
| 원래 값 | 시트에서 사용할 값 | 변환 방법 | 예시 |
|---|---|---|---|
정제결과의 상대시간_μs | 시간_s | 마이크로초를 초로 바꾼다. | 27292 μs = 0.027292 s |
검정+투명 간격 d | 피켓펜스 간격_m | 센티미터를 미터로 바꾼다. | 2.0 cm = 0.020 m |
| 위치 차이 / 시간 차이 | 구간 속도_m/s | m를 s로 나눈다. | 0.020 m / 0.020 s = 1.0 m/s |
| 속도의 제곱 | 속도제곱_m^2/s^2 | m/s를 제곱한다. | (1.0 m/s)^2 = 1.0 m²/s² |
피켓펜스 간격을 2가 아니라 0.020으로 입력해야 하는 이유는 무엇일까요?
물리 계산에서는 길이를 미터 단위로 통일한다. 2라고 입력하면 2 cm가 아니라 2 m로 계산되어 위치, 속도, g값이 모두 100배 크게 해석된다. 검은색 1.0 cm와 투명 1.0 cm의 한 주기는 2.0 cm이므로 0.020 m를 입력해야 한다.
8-4. 센서 데이터로 위치와 속도 만들기
센서가 직접 측정한 것은 속도나 가속도가 아니라 각 검은색 경계가 센서를 지나는 시각이다. 피켓펜스의 일정한 간격이 위치 정보가 되고, 시간 자료와 결합되면서 위치와 속도 자료를 만들 수 있다.
여기서 d는 검은색 테이프의 앞쪽 경계와 다음 검은색 테이프의 앞쪽 경계 사이 거리이다. 이 가이드의 권장 규격처럼 검은색 1.0 cm, 투명 1.0 cm로 만들었다면 d = 0.020 m이다. 만약 검은색 0.5 cm, 투명 0.5 cm로 만들었다면 d = 0.010 m로 바꿔야 한다. 구글 시트 물리 시트의 B2 값은 반드시 자신이 실제로 만든 피켓펜스 간격과 같아야 한다.
속도는 한 순간에 직접 측정한 값이 아니라, 두 경계 사이를 지나는 동안의 구간 평균속도로 계산한다. 따라서 그 속도를 어느 시각에 대응시킬지 정해야 한다. 가장 자연스러운 선택은 구간의 시작 시각과 끝 시각의 한가운데인 중간시간이다.
에너지 관점에서도 같은 이유로 v_i^2를 위치 하나에 대응시켜야 한다. 이때는 두 위치의 한가운데인 중간위치를 사용한다.
8-5. 그래프에서 g 추론하기
왜 어떤 그래프는 (0, 0)을 지나지 않을까요?
이 실험에서 t = 0은 피켓펜스를 손에서 놓은 순간이 아니라, 첫 검은색 칸을 제외한 뒤 분석을 시작한 순간이다. 따라서 그 순간 피켓펜스는 이미 아래로 움직이고 있으므로 초기속도 v0는 0이 아니다. 시간-위치 그래프가 (0, 0)에서 시작하는 것은 “정지 상태에서 출발했다”는 뜻이 아니라, 분석 시작 위치를 새 위치 기준점 x = 0으로 정했다는 뜻이다.
\(x = v_0t + \frac{1}{2}gt^2\), \(v = v_0 + gt\), \(v^2 = v_0^2 + 2gx\)복사용: x = v0 t + (1/2) g t^2, v = v0 + g t, v^2 = v0^2 + 2 g x
그래서 시간-속도 그래프는 t = 0에서 양수 절편 v0를 갖고, 위치-속도제곱 그래프도 x = 0에서 양수 절편 v0²를 갖는 것이 자연스럽다.
| 그래프 | 가로축 | 세로축 | 물리적 의미 |
|---|---|---|---|
| 시간-위치 그래프 | 시간_s | 실제 위치_m | 시간이 지날수록 피켓펜스가 얼마나 내려갔는지 확인한다. 점들이 직선보다 점점 가파른 곡선에 가까운지 본다. |
| 시간-속도 그래프 | 중간시간_s | 구간 속도_m/s | 속도가 시간에 따라 거의 일정하게 증가하는지 확인한다. 검정 회귀선의 기울기가 운동학 관점의 g이다. |
| 위치-속도제곱 그래프 | 중간위치_m | 속도제곱_m^2/s^2 | 낮아진 위치가 속도제곱 증가와 어떤 관계를 갖는지 확인한다. \(v^2 = v_0^2 + 2gx\)복사용: v^2 = v_0^2 + 2gx 이므로 회귀선 기울기의 절반이 에너지 관점의 g이다. |
그래프를 읽을 때는 먼저 세 그래프가 낙하 운동의 특징을 잘 보이는지 확인한다. 그다음 시간-속도 그래프의 기울기에서 운동학 관점의 g를 읽고, 위치-속도제곱 그래프의 기울기를 2로 나누어 에너지 관점의 g를 구한다.
우리가 측정한 g는 만유인력만으로 정해지는 완벽한 값일까? 지구가 자전하고, 공기가 낙하를 방해한다면 그래프와 g값은 어떻게 달라질까?
- 지구의 자전은 측정되는 중력가속도를 크게 만들까, 작게 만들까?
- 공기저항은 시간-속도 그래프의 기울기를 어떻게 바꿀까?
- 후반부 점들이 회귀선 아래로 처지면 어떤 물리적 원인을 의심할 수 있을까?
9. 수학적 해석
수학적 해석에서는 같은 시간-위치 자료를 여러 가지 함수로 설명해 본다. 자유낙하가 정말 등가속도 운동에 가깝다면, 시간-위치 그래프는 직선보다 곡선에 더 잘 맞아야 한다. 이 장에서는 실제 측정점, 1차식, 2차식을 비교하고, 왜 2차식이 더 알맞은지 그래프와 잔차로 판단한다.
9-1. 수학 시트에서 먼저 볼 것
수학 시트에서는 한 회차의 시간-위치 데이터를 두 가지 모델로 설명한다. 하나는 속도가 일정하다고 보는 1차식이고, 다른 하나는 가속도가 일정하다고 보는 2차식이다. 먼저 분석할 trial 번호와 피켓펜스 간격이 실제 실험 조건과 맞는지 확인한다.
왼쪽 표의 실제 위치는 센서가 기록한 시간과 피켓펜스 간격으로 만든 측정값이다. 예측값과 잔차는 두 모델이 실제 데이터를 얼마나 잘 설명하는지 판단하기 위한 값이다. 모든 숫자를 외우기보다, 잔차가 어느 모델에서 더 작고 0 주변에 고르게 모이는지 보는 것이 중요하다.
| 확인할 부분 | 무엇을 볼까? | 생각할 점 |
|---|---|---|
| 분석 조건 | trial 번호와 피켓펜스 간격이 맞는지 확인한다. | 조건이 틀리면 그래프 모양과 g값이 모두 달라진다. |
| 실제 위치 | 센서 시간과 피켓펜스 간격으로 만든 측정점이다. | 그래프에서 파란 점으로 나타나는 자료이다. |
| 1차 예측과 잔차 | 속도가 일정하다고 보았을 때의 예측값과 실제값의 차이이다. | 잔차가 규칙적으로 휘면 1차식이 자료를 충분히 설명하지 못한다. |
| 2차 예측과 잔차 | 가속도가 일정하다고 보았을 때의 예측값과 실제값의 차이이다. | 잔차가 더 작고 0 주변에 모이면 자유낙하 자료에 더 알맞다. |
| 회귀 요약 | 1차식과 2차식의 비교 결과, 2차식에서 얻은 g값을 확인한다. | 계산값만 보지 말고 그래프와 잔차를 함께 근거로 삼는다. |
9-2. 시간-위치 그래프에서 1차식과 2차식 비교하기
자유낙하에서는 위치가 시간에 정비례하지 않는다. 처음에는 느리게 이동하다가 점점 빠르게 이동하므로, 시간-위치 그래프는 직선보다 휘어진 곡선에 가깝다. 이를 확인하려면 같은 그래프에서 실제 위치 점, 1차 회귀선, 2차 회귀선을 함께 비교한다.
- 분석할 trial을 하나 정하고, 수학 시트의 표와 그래프가 그 trial의 자료인지 확인한다.
- 파란 점
실제 위치(측정값)_m은 센서가 기록한 시간과 피켓펜스 간격으로 만든 실제 데이터이다. - 빨간 선 \(x = mt + b\)복사용: x = m t + b 은 속도가 일정하다고 가정한 1차 모델이다.
- 초록 선 \(x = at^2 + bt + c\)복사용: x = a t^2 + b t + c 은 가속도가 일정하다고 가정한 2차 모델이다.
- 각 점에서
잔차 = 실제 위치 - 예측 위치를 계산한다. - 잔차가 한쪽에서는 양수, 다른 쪽에서는 음수처럼 규칙적인 패턴을 보이면 모델이 자료의 모양을 제대로 설명하지 못한 것이다.
2차식의 R²가 크더라도 잔차 그래프를 함께 봐야 하는 이유는 무엇일까요?
R²는 전체적으로 얼마나 잘 맞는지를 숫자 하나로 보여 주지만, 오차가 어떤 모양으로 남는지는 보여 주지 못한다. 잔차가 0 주변에 불규칙하게 흩어지면 모델이 자료의 경향을 잘 설명한 것이다. 반대로 잔차가 한쪽으로 휘거나 일정한 패턴을 보이면, R²가 커도 모델이 놓친 경향이나 실험 구조의 오차가 있을 수 있다.
그래프에서 “가장 잘 맞는 선”은 눈대중으로 정한 것일까? 스프레드시트는 어떤 기준으로 1차식과 2차식의 계수를 계산할까?
- 회귀선은 어떤 기준으로 정해질까?
LINEST함수는 어떤 계산을 대신 해 줄까?R²와SSE는 왜 모델 비교에 쓰일까?
9-3. 이계도함수로 g 구하기
시간-위치 자료를 2차식으로 근사하면 다음과 같이 쓸 수 있다.
이 식을 한 번 미분하면 속도 함수가 되고, 두 번 미분하면 가속도 함수가 된다.
자유낙하에서 가속도는 중력가속도이므로, 시간-위치 이차회귀식의 t² 계수가 a라면 g = 2a이다.
| 확인할 값 | 뜻 | 해석 |
|---|---|---|
2차식의 이차항 계수 a | 시간-위치 곡선이 얼마나 휘어 있는지 나타낸다. | 값이 클수록 같은 시간 동안 위치가 더 빠르게 증가한다. |
g = 2a | 위치 함수를 두 번 미분하면 가속도가 되기 때문이다. | 이 값이 수학적 해석에서 얻은 중력가속도이다. |
시간-위치 식 x(t)=at²+bt+c에서 왜 g=2a가 될까요?
위치를 시간으로 한 번 미분하면 속도 v(t)=2at+b가 되고, 다시 한 번 미분하면 가속도 x''(t)=2a가 된다. 자유낙하에서 이 가속도를 중력가속도 g로 해석하므로 g=2a가 된다.
10. 신뢰도와 신뢰구간
한 번의 실험값이 9.8 m/s²에 가까운지만 보는 것은 충분하지 않다. 같은 조건에서 여러 번 떨어뜨렸을 때 g 값들이 얼마나 비슷하게 나오는지 확인해야 실험의 신뢰도를 말할 수 있다. 이 장에서는 각 trial에서 얻은 g값을 비교하고, 어떤 값을 최종 평균에 사용할지 판단한 뒤 평균과 95% 신뢰구간을 해석한다.
10-1. trial마다 g값 하나씩 구하기
신뢰도 분석에서는 각 trial에서 g값을 하나씩 얻은 뒤, 그 값들이 서로 얼마나 가까운지 확인한다. 같은 장치와 같은 방법으로 반복했다면 g값들은 비슷한 범위에 모여야 한다.
단, 데이터 개수가 너무 적은 trial은 대표값으로 쓰지 않는다. 예를 들어 피켓펜스가 센서를 한두 번만 지나간 trial은 전체 낙하 운동을 설명하기 어렵기 때문이다. 이런 trial은 평균 계산에서 제외하고, 제외한 이유를 기록한다.
왜 한 번의 g값보다 여러 trial의 평균과 흩어짐을 함께 봐야 할까요?
한 번의 측정값은 우연히 실제값에 가깝거나 멀 수 있다. 여러 번 반복하면 값들이 어느 범위에 모이는지 볼 수 있고, 평균은 대표값을, 표준편차와 신뢰구간은 그 대표값의 불확실성을 알려 준다. 그래서 좋은 보고서는 평균 g뿐 아니라 반복값의 흩어짐도 함께 제시한다.
10-2. 이상치 판정: IQR과 z-score
반복 측정값 중에는 센서 충돌, 경계 누락, 손으로 넣었다 뺐다 한 테스트 데이터처럼 다른 trial과 성격이 다른 값이 섞일 수 있다. 이런 값을 무조건 평균에 넣으면 평균이 한쪽으로 끌려간다.
신뢰도 시트는 기본 이상치 기준으로 IQR 기준을 사용한다. IQR은 가운데 50% 데이터의 폭이다.
g값이 이 하한보다 작거나 상한보다 크면 IQR 판정 열에 이상치로 표시된다. IQR 기준은 평균과 표준편차보다 극단값에 덜 흔들리므로, 표본 수가 10개 정도로 적을 때 쓰기 좋다.
z-score는 각 g값이 전체 평균에서 표준편차 몇 개만큼 떨어져 있는지 나타낸다.
보통 |z| ≥ 2이면 의심값, |z| ≥ 3이면 강한 이상치 후보로 본다. 하지만 표본이 적으면 평균과 표준편차 자체가 이상치의 영향을 크게 받으므로, 이 실험에서는 IQR 판정을 기본으로 사용하고 z-score는 참고값으로 본다.
10-3. 평균, 표준편차, 표준오차
이상치를 제외하고 사용 여부가 TRUE인 값만 모아 평균을 낸다. 이 평균이 이 실험에서 얻은 중력가속도의 대표값이다.
| 통계량 | 의미 | 계산 방법 |
|---|---|---|
| 사용 n | 이상치와 데이터 부족 trial을 제외하고 실제 평균 계산에 사용한 g값 개수 | =COUNTIF(사용여부범위,TRUE) |
| 사용 평균 | 사용한 g값들의 대표값 | =AVERAGE(FILTER(g범위,사용여부범위=TRUE)) |
| 사용 표준편차 | 반복 측정값들이 평균 주변에 얼마나 흩어져 있는지 | =STDEV.S(FILTER(g범위,사용여부범위=TRUE)) |
| 표준오차 | 평균값 자체의 불확실성. 같은 실험을 다시 반복했을 때 평균이 얼마나 흔들릴지 나타낸다. | =표준편차/SQRT(사용 n) |
10-4. 95% 신뢰구간
신뢰구간은 반복 측정으로 얻은 평균 g가 어느 범위에 있을지 추정하는 구간이다. 먼저 학생들이 이미 알고 있는 정규분포를 기준으로 계산한다. 정규분포에서 가운데 95%에 해당하는 범위는 평균에서 대략 ±1.96 표준오차만큼 떨어진 구간이다.
| 항목 | 뜻 | 계산 방법 |
|---|---|---|
| z값(95%) | 정규분포에서 95% 신뢰구간을 만들 때 사용하는 값 | =NORM.S.INV(0.975), 약 1.96 |
| 신뢰구간 반폭 | 평균에서 위아래로 더하고 빼는 폭 | z값 × 표준오차 |
| 신뢰구간 하한·상한 | 평균 g의 추정 범위 | 평균 ± 반폭 |
예시 자료에서는 이상치 제외 뒤 사용한 값이 5개이고, 최종 사용 평균은 I2:J2, 정규분포 기준 95% 신뢰구간은 I3:J3에 크게 표시된다. 이 예시의 신뢰구간은 약 8.523 ~ 9.381 m/s²이며, 보고서에는 “우리 조가 반복 측정으로 얻은 평균 g는 이 정도 범위에 있을 것으로 추정된다”처럼 쓴다.
반복 측정 횟수가 적을 때도 정규분포의 1.96을 그대로 써도 될까? 표본이 적으면 신뢰구간의 폭은 어떻게 달라질까?
11. 오차 원인과 개선
이 실험의 오차는 단순히 “실수해서 생긴 오차”만이 아니다. 센서의 틈이 좁고, 피켓펜스가 실제로는 완벽한 직선 낙하를 하지 않으며, 시간 자료에서 속도와 가속도를 계산하는 과정 자체가 작은 오차를 키울 수 있다. 따라서 오차 분석에서는 실험 장치의 구조와 데이터 처리 과정을 함께 보아야 한다.
11-1. 실험 구조에서 생기는 오차
GP1A57HRJ00F의 틈은 좁기 때문에 피켓펜스가 조금만 기울어도 센서 몸체에 닿는다. 이 충돌은 단순한 우연 오차가 아니라, 장치 구조 때문에 반복적으로 생기기 쉬운 오차이다. 피켓펜스가 센서에 닿으면 낙하 속도가 줄어들고, 그 결과 계산된 g는 실제값보다 작게 나오는 경향이 생긴다.
| 구조적 오차 원인 | 왜 문제가 되는가 | g값에 주는 영향 |
|---|---|---|
| 포토인터럽터 틈이 좁음 | 피켓펜스가 센서와 부딪히거나 한쪽 면을 스치기 쉽다. | 마찰과 충돌로 속도가 줄어들어 g가 작게 추정되기 쉽다. |
| 피켓펜스가 회전함 | 센서를 지나는 경계가 비스듬해지고, 센서가 보는 유효 간격이 달라진다. | 어떤 구간은 실제보다 길거나 짧게 측정된 것처럼 보인다. |
| 테이프 간격이 완벽히 일정하지 않음 | 시트에서는 모든 간격을 같은 d로 계산하지만 실제 간격은 조금씩 다를 수 있다. | 위치값에 체계적 오차가 들어가며, 모든 그래프의 기울기가 영향을 받는다. |
| 검은 테이프 경계가 흐리거나 들뜸 | 센서가 빛이 막히는 순간을 항상 같은 기준으로 잡지 못한다. | 시간값이 앞뒤로 흔들리고, 속도 계산에서 더 크게 드러난다. |
| 공기저항 | 속도가 커질수록 운동을 방해하는 힘도 커진다. | 낙하 후반부 속도 증가가 작아져 g가 작게 추정될 수 있다. |
11-2. 차분과 미분에서 오차가 커지는 이유
센서가 직접 기록하는 값은 위치나 속도가 아니라 시간이다. 위치는 피켓펜스 간격으로 정하지만, 속도는 두 시간값의 차이를 이용해 계산한다.
여기서 중요한 점은 Δt가 분모에 있다는 것이다. 센서 시간이 아주 조금만 흔들려도, 그 값이 분모에 들어가기 때문에 속도 오차가 커질 수 있다. 특히 낙하 후반부에는 피켓펜스가 빠르게 지나가므로 Δt가 작아진다. 분모가 작을수록 같은 시간 오차가 더 큰 속도 오차로 바뀐다.
예를 들어 어떤 구간 시간이 0.010 s인데 센서 판단이 0.0005 s만 흔들려도 상대 오차는 약 5%이다. 하지만 구간 시간이 0.050 s라면 같은 0.0005 s 오차는 약 1%에 불과하다. 그래서 빠르게 지나가는 후반부 데이터일수록 속도값이 더 민감하게 흔들릴 수 있다.
가속도는 속도가 시간에 따라 얼마나 변하는지를 다시 계산한 값이다. 즉 위치 자료에서 속도를 만들고, 속도 자료에서 다시 가속도를 만드는 과정은 수학적으로 미분에 가깝다. 미분은 자료의 전체적인 흐름보다 가까운 두 점 사이의 작은 차이를 크게 보기 때문에, 측정 노이즈가 증폭되기 쉽다.
11-3. 그래프별로 확인해야 할 오차의 흔적
| 그래프 | 정상적인 경향 | 오차가 의심되는 모습 | 가능한 원인 |
|---|---|---|---|
| 시간-위치 그래프 | 점들이 점점 가파르게 증가하는 곡선에 가깝다. | 중간에 위치 증가가 갑자기 둔해지거나 점 하나가 흐름에서 벗어난다. | 센서 충돌, 테이프 간격 불균일, 경계 누락 |
| 시간-속도 그래프 | 구간 속도 점들이 대체로 직선 주변에 놓인다. | 한두 구간 속도가 갑자기 튀거나 내려간다. | 시간차 Δt 오차 증폭, 피켓펜스 흔들림 |
| 위치-속도제곱 그래프 | 점들이 대체로 직선에 가깝다. | 후반부 점들이 직선 아래로 처진다. | 공기저항, 센서와의 마찰, 충돌로 인한 에너지 손실 |
| 잔차 그래프 | 잔차가 0 주변에 비교적 작고 불규칙하게 흩어진다. | 잔차가 한쪽 방향으로 휘거나 일정한 패턴을 보인다. | 모델이 실제 운동을 충분히 설명하지 못함, 구조적 오차 |
11-4. 개선 방안
| 개선할 부분 | 구체적인 방법 | 기대되는 효과 |
|---|---|---|
| 수직 낙하 안정화 | 책, 상자, 빨대, 클램프 등으로 피켓펜스가 센서 틈을 곧게 지나가도록 가이드를 만든다. | 센서 충돌과 회전을 줄인다. |
| 피켓펜스 제작 정밀도 | 각 칸을 하나씩 재기보다 여러 칸의 전체 길이를 재고 평균 간격을 사용한다. | 테이프 간격 오차가 평균화된다. |
| 센서 신호 안정화 | 검은색 테이프를 빛이 통과하지 않게 붙이고, 들뜬 부분을 눌러 경계를 선명하게 만든다. | 경계 인식 시각의 흔들림이 줄어든다. |
| 데이터 처리 | 각 구간 가속도를 직접 믿기보다 그래프와 회귀선을 이용하고, 명백히 충돌한 trial은 별도로 표시한다. | 미분 과정에서 증폭된 오차의 영향을 줄인다. |
| 반복 측정 | 같은 조건에서 여러 번 측정하고 평균과 신뢰구간을 함께 제시한다. | 우연 오차의 영향을 줄이고 결과의 신뢰도를 판단할 수 있다. |
구간시간_μs가 대체로 줄어드는 모습을 보인다. 아래로 갈수록 속도가 커지기 때문이다. 다만 구간시간_μs가 줄어드는 전체 경향이 있어도, 특정 구간이 갑자기 커지거나 작아지면 그 지점의 센서 인식이나 충돌 여부를 함께 의심해야 한다.왜 위치 자료보다 속도 자료나 가속도 자료와 같이 가공된 자료일수록 오차가 더 증폭될까요?
속도는 위치의 차이를 시간 차이로 나누어 만든 값이고, 가속도는 다시 속도의 변화를 이용해 만든 값이다. 이렇게 차이를 반복해서 계산하면 전체 흐름보다 가까운 두 점 사이의 작은 흔들림에 더 민감해진다. 그래서 원래 위치 자료에서는 작아 보이던 센서 시간 오차나 경계 인식 오차가 속도 자료, 가속도 자료에서는 더 크게 튀어 보일 수 있다.
12. 심화탐구
이 장은 앞 장에서 던진 질문을 원래 학습 순서대로 더 깊게 다룬다. 먼저 8장의 물리학적 해석에서 나온 지구 자전과 공기저항을 살펴보고, 그다음 9장의 수학적 해석에서 나온 최소제곱법과 LINEST, 마지막으로 10장의 신뢰도 분석에서 나온 t분포를 다룬다.
12-1. 물리 심화: 지구 자전과 공기저항을 고려한 g
- 지구의 자전은 측정되는 중력가속도를 크게 만들까, 작게 만들까?
- 공기저항은 시간-속도 그래프의 기울기를 어떻게 바꿀까?
- 후반부 점들이 회귀선 아래로 처지면 어떤 물리적 원인을 의심할 수 있을까?
8장에서는 지표면 근처에서 g가 거의 일정하고, 공기저항이 작다고 가정했다. 이 가정은 교실 실험을 이해하기에는 충분하지만, 더 엄밀하게 보면 우리가 측정하는 g에는 지구의 자전, 지구의 모양, 공기저항 같은 요인이 함께 들어간다.
지구의 자전
만유인력만 생각하면 지구가 물체를 지구 중심 방향으로 끌어당긴다. 그런데 우리는 지구와 함께 하루에 한 바퀴씩 회전하고 있다. 회전하는 관찰자 입장에서는 바깥쪽으로 밀려나는 효과가 생기며, 이 효과가 중력을 조금 상쇄한다. 그래서 실제로 측정되는 유효 중력가속도는 순수한 만유인력으로 계산한 값보다 아주 조금 작다.
| 기호 | 뜻 | 해석 |
|---|---|---|
GM/R² | 만유인력에 의한 중력가속도 | 지구가 물체를 끌어당기는 효과이다. |
ω²R cos²φ | 자전에 의한 감소 효과 | 지구와 함께 회전하기 때문에 측정되는 g가 조금 작아지는 효과이다. |
φ | 위도 | 적도에서 효과가 가장 크고, 극지방에서는 거의 없다. |
우리나라 위도에서는 자전에 의한 차이가 대략 0.02 m/s² 정도 수준이다. 이는 정밀한 중력 측정에서는 의미가 있지만, 이번 실험에서 가장 큰 오차 원인인 센서 충돌, 피켓펜스 회전, 테이프 간격 오차에 비하면 훨씬 작은 편이다.
공기저항
공기저항은 항상 운동 방향의 반대쪽으로 작용한다. 피켓펜스가 아래로 떨어질 때 공기저항은 위쪽으로 작용하므로, 실제 알짜힘은 중력보다 작아진다.
공기저항 F_D는 보통 속도가 커질수록 커진다. 따라서 낙하 초반보다 후반에 더 큰 영향을 주며, 실제 속도 증가가 이상적인 등가속도 운동보다 조금 둔해진다.
| 그래프 | 공기저항이 작을 때 | 공기저항이 커지면 |
|---|---|---|
| 시간-속도 그래프 | 속도 점들이 거의 직선 위에 놓인다. | 후반부 속도 점들이 직선보다 아래쪽에 놓일 수 있다. |
| 위치-속도제곱 그래프 | v²-x 관계가 거의 직선이다. | 후반부 점들이 회귀선 아래로 처질 수 있다. |
| 계산된 g | 실제 중력가속도에 가까워진다. | 속도 증가가 작아져 g가 작게 추정될 수 있다. |
다만 이번 장치에서는 공기저항보다 피켓펜스가 포토인터럽터와 스치거나 부딪히는 효과가 더 클 가능성이 높다. 따라서 그래프 후반부가 아래로 처졌다면 공기저항만 떠올리기보다, 센서 접촉이나 피켓펜스 회전도 함께 확인해야 한다.
12-2. 수학 심화: 회귀선은 어떤 기준으로 정해질까?
- 회귀선은 어떤 기준으로 정해질까?
LINEST함수는 어떤 계산을 대신 해 줄까?R²와SSE는 왜 모델 비교에 쓰일까?
실험점들은 완벽한 직선이나 곡선 위에 놓이지 않는다. 회귀분석은 여러 가능한 식 중에서 실제 점들과 가장 잘 맞는 식을 찾는 과정이다. 먼저 개념을 단순하게 보기 위해, 같은 자료를 두 개의 1차식으로 각각 근사해 보자.
잔차는 실제값에서 예측값을 뺀 값이다. 잔차를 그냥 더하면 양수와 음수가 서로 상쇄될 수 있으므로, 최소제곱법은 잔차를 제곱해서 더한다. 이렇게 더한 값을 잔차제곱합, 즉 SSE라고 한다.
아래 예시에서는 두 후보 함수가 있다. 둘 다 1차식이지만 기울기와 절편이 다르다.
같은 실제 자료에 대해 두 함수의 예측값을 각각 계산하고, 실제값과 예측값의 차이를 제곱한다. 그 제곱값을 모두 더했을 때 더 작은 함수가 실제 점들을 더 정확히 근사한 함수이다.
| 시간 t | 실제값 y | 후보 A 예측 | A 잔차제곱 | 후보 B 예측 | B 잔차제곱 |
|---|---|---|---|---|---|
| 0 | 0.2 | 0.1 | 0.01 | 0.2 | 0.00 |
| 1 | 1.1 | 1.1 | 0.00 | 1.0 | 0.01 |
| 2 | 2.2 | 2.1 | 0.01 | 1.8 | 0.16 |
| 3 | 3.0 | 3.1 | 0.01 | 2.6 | 0.16 |
| SSE | 0.03 | 0.33 |
후보 A의 잔차제곱합은 0.03이고, 후보 B의 잔차제곱합은 0.33이다. 따라서 이 자료에서는 후보 A가 후보 B보다 실제값을 더 정확히 근사한다고 판단할 수 있다. 최소제곱법은 이 생각을 확장해서, 가능한 여러 함수 중 SSE가 가장 작아지는 함수를 찾는 방법이다.
12-3. LINEST 함수는 무엇을 계산할까?
Google Sheets의 LINEST 함수는 최소제곱법 계산을 대신 해 준다. 기본 구조는 다음과 같다.
| 분석 | 회귀식 | 시트에서의 의미 |
|---|---|---|
| 1차 회귀 | x = mt + b | LINEST로 기울기 m, 절편 b, R²를 함께 구한다. SLOPE, INTERCEPT로도 같은 1차 회귀를 계산할 수 있지만, 이 양식에서는 2차 회귀와 같은 방식으로 읽기 위해 LINEST를 사용한다. |
| 2차 회귀 | x = at² + bt + c | t와 t²를 두 개의 입력 열로 넣어 a, b, c를 한 번에 구한다. |
2차식은 곡선이지만, LINEST 입장에서는 다음과 같은 형태의 다중 회귀로 처리된다.
즉 t²와 t를 서로 다른 두 입력값처럼 넣고, 실제 위치 x를 가장 잘 예측하는 계수를 찾는다. Google Sheets에서는 여러 입력 열을 넣을 때 계수의 반환 순서가 헷갈릴 수 있으므로, 양식에 들어 있는 공식을 그대로 사용하는 것이 안전하다.
12-4. R², SSE, 잔차 그래프 읽기
| 항목 | 뜻 | 해석 방법 |
|---|---|---|
R² | 결정계수. 회귀식이 실제 데이터의 변화를 얼마나 잘 설명하는지 나타낸다. | 1에 가까울수록 설명력이 크다. 다만 R²가 높다고 해서 실험 오차가 없다는 뜻은 아니다. |
SSE | 잔차제곱합. 모든 잔차를 제곱해서 더한 값이다. | 같은 데이터에서 두 모델을 비교할 때 작을수록 실제 점에 더 가깝게 맞은 것이다. |
잔차 그래프 | 각 점의 잔차를 시간에 따라 그린 그래프이다. | 좋은 모델이라면 잔차가 0 기준선 주변에 작고 불규칙하게 흩어진다. 한쪽으로 휘는 패턴이 보이면 모델이 자료의 모양을 놓치고 있는 것이다. |
R²는 “이 모델이 실제 데이터의 변화를 얼마나 설명했는가”를 나타내는 값이다. 계산할 때는 먼저 실제값들이 평균에서 얼마나 흩어져 있는지, 즉 전체 변동을 구한다. 그다음 회귀식으로 설명하지 못하고 남은 잔차제곱합을 비교한다.
만약 회귀식의 예측값이 실제값과 거의 같다면 SSE가 매우 작아지고, R²는 1에 가까워진다. 반대로 회귀식이 평균값으로 대충 예측하는 것과 별 차이가 없다면 SSE가 SST와 비슷해지고, R²는 0에 가까워진다.
R²와 SSE는 서로 보완해서 본다. 2차식의 R²가 1에 더 가깝고 SSE가 더 작으며, 잔차 그래프도 0 주변에 더 작게 모이면 시간-위치 자료에는 1차식보다 2차식이 더 적절하다고 말할 수 있다.12-5. 수학 시트 공식과 연결하기
9장에서는 수학 시트의 그래프를 보고 1차식과 2차식을 비교했다. 여기서는 그 화면의 오른쪽 요약표가 어떤 계산을 담고 있는지 확인한다. 아래 그림에서 ③ 영역이 회귀식의 계수, g = 2a, R², SSE를 모아 놓은 부분이다.
흐름은 다음과 같다. 먼저 선택한 trial의 시간-위치 자료를 가져온다. 그다음 1차식과 2차식이 각각 예측한 위치를 계산한다. 실제 위치에서 예측 위치를 빼면 잔차가 되고, 잔차를 제곱해서 더하면 SSE가 된다. LINEST는 이 과정을 통해 SSE가 작아지도록 회귀식의 계수를 찾는다.
| 셀 | 공식 예시 | 의미 |
|---|---|---|
| O9 | =INDEX(LINEST(위치범위,{시간범위,시간제곱범위},TRUE,TRUE),1,1) | 2차식 x = at² + bt + c에서 이차항 계수 a를 가져온다. |
| O12 | =2*O9 | 이계도함수 x''(t)=2a를 이용해 g를 구한다. |
| O13 | =INDEX(LINEST(...),3,1) | 2차식이 자료를 얼마나 잘 설명하는지 나타내는 결정계수 R²이다. |
| O14 | =SUM(2차잔차제곱범위) | 2차식의 잔차제곱합이다. 1차식의 잔차제곱합과 비교한다. |
12-6. 통계 심화: 표본이 적을 때 t분포를 쓰는 이유
반복 측정 횟수가 적을 때도 정규분포의 1.96을 그대로 써도 될까? 표본이 적으면 신뢰구간의 폭은 어떻게 달라질까?
10장에서는 학생들이 이미 알고 있는 정규분포를 기준으로 95% 신뢰구간을 계산했다. 하지만 실제 실험에서는 사용 가능한 trial이 5개나 8개처럼 적을 수 있다. 이때는 표준편차 s 자체도 불안정하게 추정되므로, 정규분포보다 조금 더 넓은 신뢰구간을 잡는 t분포가 더 엄밀하다.
정규분포 기준 95% 신뢰구간은 평균에서 1.96 × 표준오차만큼 위아래로 떨어진 범위를 사용한다. t분포에서는 1.96 대신 표본 수에 따라 달라지는 t값을 사용한다.
| 항목 | 뜻 | 구글 스프레드시트 예시 |
|---|---|---|
| 자유도 | 표준편차를 추정할 때 독립적으로 변할 수 있는 값의 개수이다. 표본 평균을 이미 사용했으므로 보통 n-1을 쓴다. | =사용n-1 |
| t값 | 표본이 적을 때 신뢰구간을 넓히기 위해 사용하는 값이다. n이 커질수록 1.96에 가까워진다. | =T.INV.2T(0.05, 자유도) |
| t분포 신뢰구간 반폭 | t값을 사용해 계산한 평균의 불확실성이다. | =t값*표준오차 |
자유도가 n-1인 이유는 평균을 먼저 계산했기 때문이다. 예를 들어 g값 5개가 있고 그 평균이 이미 정해져 있다고 하자. 이때 앞의 4개 값은 어느 정도 자유롭게 달라질 수 있지만, 평균을 그대로 유지하려면 마지막 1개 값은 자동으로 정해진다. 즉 5개 값이 모두 독립적으로 움직일 수 있는 것이 아니라, 평균이라는 조건 하나를 이미 사용했기 때문에 독립적으로 남는 정보는 5-1=4개이다.
표준편차는 각 값이 평균에서 얼마나 떨어져 있는지로 계산한다. 그런데 그 평균도 같은 표본에서 구했기 때문에, 표준편차를 계산할 때는 평균을 정하는 데 정보 하나를 이미 쓴 것으로 본다. 그래서 표본 표준편차와 t분포에서는 자유도를 n이 아니라 n-1로 둔다.
예를 들어 사용한 trial이 n = 5개이면 자유도는 4이고, 95% 신뢰구간의 t값은 약 2.776이다. 정규분포의 1.96보다 크기 때문에 신뢰구간도 더 넓어진다. 이전 예시 데이터에서는 정규분포 기준 반폭이 약 0.429였지만, t분포 기준 반폭은 약 0.607로 커진다.
12-7. 탐구를 확장하는 질문
아래 질문은 기본 보고서를 마친 뒤 추가 탐구 주제로 사용할 수 있다. 새 실험을 설계하거나, 이미 얻은 데이터를 다른 방식으로 다시 분석해 보면서 답을 찾는다.
| 확장 질문 | 탐구 방법 | 생각할 점 |
|---|---|---|
| 피켓펜스 간격을 1.0 cm, 2.0 cm, 3.0 cm로 바꾸면 g값의 평균과 흩어짐은 어떻게 달라질까? | 간격이 다른 피켓펜스를 각각 만들어 같은 방식으로 10회씩 측정한다. | 간격이 너무 짧으면 센서가 놓칠 수 있고, 너무 길면 데이터 점 수가 줄어든다. |
| 피켓펜스가 센서에 스치는 정도를 줄이면 시간-속도 그래프의 기울기는 실제값에 가까워질까? | 낙하 가이드를 만든 경우와 만들지 않은 경우의 그래프를 비교한다. | 장치 개선이 평균 g뿐 아니라 표준편차와 잔차 모양도 개선하는지 본다. |
| 시간-속도 그래프에서 앞부분만 사용한 g와 전체 데이터를 사용한 g는 어떻게 다를까? | 초반부 점만 선택한 회귀선과 전체 점 회귀선을 비교한다. | 후반부에 공기저항, 충돌, 센서 누락이 커진다면 두 값이 달라질 수 있다. |
| 1차식, 2차식, 3차식 중 가장 R²가 큰 모델을 고르면 항상 좋은 해석일까? | 같은 시간-위치 자료에 여러 차수의 회귀식을 적용하고 잔차와 물리적 의미를 비교한다. | 차수가 높으면 점에는 잘 맞을 수 있지만, 자유낙하의 물리 법칙과 맞지 않는 과적합이 생길 수 있다. |
| 검은색 테이프의 폭과 투명 구간의 폭이 서로 다르면 센서가 기록하는 위치 간격을 어떻게 정해야 할까? | 경계의 종류를 정하고, 같은 종류의 경계 사이 거리를 실제로 재서 분석한다. | 분석에서 쓰는 d는 “센서가 반복해서 기록하는 같은 기준점 사이 거리”여야 한다. |
| 단진자를 이용해 구한 중력가속도는 포토인터럽터로 구한 값과 얼마나 비슷할까? | 실의 길이 L과 작은 진폭에서의 주기 T를 측정하고, g = 4π²L/T²로 계산한다. | 자유낙하 실험은 짧은 시간의 위치 변화를 분석하고, 단진자 실험은 여러 번 왕복하는 주기를 이용한다. 두 방법의 오차 원인이 어떻게 다른지 비교한다. |