이번에는 번개가 쳤을 때 마이크로비트로 거리를 구하는 것을 해보겠습니다.
- 기본 개념
번개가 쳤을 때 번개가 친 지점과 내가 서있는 곳의 거리를 구하는 방법으로 빛의 속도와 소리의 속도의 차이를 이용하는 방법이 있습니다.
예를 들어 누군가가 들판의 중간에 서 있는데 저 먼 곳에서 번쩍이는 번개가 쳤다고 가정해 보겠습니다. 그러면 그 번개가 친 지점에서는
우르릉 쾅쾅 같은 소리와 아주 밝은 빛을 내게 되는데요, 빛의 속도가 소리의 속도보다 아주 빠르기 때문에 먼저 번쩍이는 것이 보이고 나중에 천둥소리가 들리는 것을 경험해 보셨을 것입니다. 이 빛이 보인 시간과 소리가 들리는 시간의 차이를 구하면 거리를 구할 수 있습니다.
- 코딩 알고리즘
이제 이것을 이용해서 마이크로비트로 거리를 구하는 것을 만들어 보겠습니다.
마이크로비트에는 코딩할 수 있는 스위치가 A,B 두개가 있습니다. 그래서
빛이 보이면 A를 누르고 소리가 들렸을 때 B를 누르면
번개가 친 지점과 그것을 관찰한 사람의 거리를 도트매트릭스에 출력하는 것
을 만들어 보겠습니다.
먼저 빛이 보이면 A를 누르는 것입니다. 빛이 보이는 순간 A를 누르는데 위의 기본 개념에서 말했다시피, 얻어야 하는 것은 A를 눌렀을 때와 B를 눌렀을때 사이의 "시간"입니다. "타이머"라는 개념을 사용할 것인데요, 타이머는 쉽게 말하면 시계, 또는 스탑워치 같은 것이라고 생각하시면 됩니다. 여기서는 A를 누르는 순간, 타이머를 작동시켜서 어떤 변수에 0초부터 계속 시간이 증가하는 값을 지정해 줍니다. 그리고 B를 누르는 순간의 어떤 변수의 값이 바로 A를 눌렀을 때와 B를 눌렀을때 사이의 "시간"입니다. - 만들기 1의 내용
그리고 얻은 "시간"을 이용해서 마이크로비트가 거리를 계산을 하면 도트매트릭스에 그 계산한 값을 넣을 것입니다. - 만들기 2의 내용
(어느정도 실력이 있는 분이 보고 계신다면 이 네모칸만 보고 한번 프로그래밍 해 보신 후 아래를 참조하는 것도 좋을 것 같습니다.)
- 만들기 1 (A버튼을 누르면 타이머 작동)
(만들기 1에 사용할 블럭들)
왼쪽 위부터 아래로
· A버튼을 눌렀을 때 작동하고 싶은 것을 안에 넣으면 되는 블럭
· 원하는 변수를 0으로 설정하는 블럭
· while 오른쪽의 값(조건) 이 true 이면 반복하고 false 이면 다음 문장으로 넘어가는 블럭 (여기서는 그냥 안의 내용을 계속 반복하는 블럭이라고 생각하시면 됩니다.)
· 오른쪽의 값ms 만큼 기다리는 블럭 (ms는 0.001초를 의미합니다. 그래서 1초동안 멈추기를 원하면 1000을 넣어주면 됩니다.)
· 2번과 같은 set블럭인데 오른쪽의 두 값을 더해서 그 값을 원하는 변수로 설정하는 블럭
· 같은 모양의 블럭에 time라는 값을 넣을 수 있는 블럭
이렇게 여섯개로 만들어 보겠습니다.
1. time 변수 만들기
먼저 A를 누르면 시작하는 타이머의 값을 저장할 변수를 만듭니다.
(time 변수를 만드는 방법 설명)
2. time의 값을 0으로 초기화
0으로 초기화 하는 이유는,
완성된 기기는 작동하고 맨 처음 A를 누르면 time가 작동하고, B를 누르면 시간 값을 이용해서 값을 출력합니다. 여기까진 별 문제 없이 잘 되는데 두 번째 A를 누르면 첫 번째 증가했던 time의 값을 그대로 다시 증가시키게 되서 원래 거리보다 더 크게 나올 것입니다. 이를 막기 위해서이고 쓰레기 값을 없애기 위한 이유도 있습니다.
(time을 0으로 초기화 하는 것 만들기)
3. time의 값을 1초에 1씩 증가시키기
변수의 이름이 time이라는 것에 걸맞게 1초에 1씩 증가시켜서 실제 시계처럼 만들어 줍니다. 만드는 방법은 1초동안 기다린 후에 time의 값을 이전 time의 값에 1을 더해서 계속 1초에 1씩증가하도록 해서 만듭니다. 컴퓨터로 실제 시간을 구현할 때 많이 쓰이는 개념이므로 잘 알아두시면 좋습니다. 계속 반복해야하므로 while(true)를 써줍니다.
(time의 값을 실제 시간과 매우 비슷하게 구현하는 방법 => 타이머 구현)
4. 블록 결합.
만들고자 했던 것은 A를 누르면 B를 누를 때 까지의 시간을 측정하고 싶기 때문에 필요한 실제 시간과 비슷한 time이라는 변수가 작동하도록 하는 것이므로 적절히 연결하면
(만들기 1의 결과)
-만들기 2 (B버튼을 누르면 time 값을 받아서 distance 계산 후 도트매트릭스에 출력)
(만들기2에 사용할 블럭들)
왼쪽 위부터 밑으로
· B버튼을 누르면 작동시키고 싶은 것을 안에 넣는 블록
· 원하는 값에 원하는 숫자를 저장하는 블럭
· 원하는 숫자를 도트 매트릭스에 출력하는 블록
· 거리 블록
· 타이머 블록
· 원하는 것의 곱을 구해주는 블록
1. 계산 결과인 distance 변수 만들기
계산 결과값을 저장하기 위한 distance라는 변수를 만듭니다. (위의 time 변수 만들기 참고)
(distance변수 만들기)
2. B버튼을 눌러서 누르는 순간의 time값을 이용해서 distance 값 정하기
-기본 개념에서 얻었던 식 distance = 340m/s * time 을 이용해서 마이크로비트로 구현하면
(마이크로비트로 만든 distance = 340m/s * time)
3. distance의 값을 도트매트릭스에 출력
도트매트릭스에 distance의 값인 숫자를 출력하기 위해 show number 블록을 이용하면
(distance의 값을 도트매트릭스에 출력하는 블록)
4. 블록 결합
만든 블록을 적절히 연결하면
(만들기 2 완성)
(완성)
심화 내용
위의 코드를 실행 시키면 1초, 2초의 거리는 잘 계산하지만 1.5초, 2.8초일 때의 거리는 1초, 2초일때의 거리과 같게 나옵니다.
이렇게 되는 이유를 생각해보고 어떻게 하면 이런 문제를 고칠 수 있을지 생각해보면 좋을 것 같습니다.
최대한 위에서부터 아래로 코딩을 하는 것이 제일 합리적이라고 생각하도록 글을 썼는데 만들기 1의 2는 바로 저런 내용까지 고려하지 않아도 무방합니다. 저 블록을 제외하고 한번 실행시켜본 후에 추가하는 것이 더 합리적이라고 생각합니다. 물론 바로 그런 문제까지 생각해 낼 수 있으면 훌륭합니다.
마무리
이번 예제를 포스팅하면서 정말 좋은 예제라고 생각했습니다. 타이머 개념, 초기화 개념은 실전 코딩에서 정말 꼭 알아야 하는 개념이라고 생각하는데 이번 예제를 통해서 이런게 있구나 하는 정도만 아셔도 좋을 것 같습니다.