이번에는 흔들면 가위, 바위, 보 중 하나를 도트매트릭스에 띄우기를 해보겠습니다. 


- 기본 개념


마이크로비트 안에는 가속도 센서가 내장되어 있어서 기울기나 기기가 흔들리고 있는 정보를 가지고 코딩을 할 수 있습니다. 이번에는 마이크로비트를 이용해서 가위바위보를 할 것인데 기기를 흔드는 것으로 가위바위보 중 하나를 내개 해서 구현할 것입니다. 



- 코딩 알고리즘


마이크로비트를 흔들면 가위,바위,보 중 하나를 출력하는 것


을 만들어 보겠습니다. 



- 만들기 


(만들기에 사용할 블럭들)


  왼쪽 위부터 아래로

· 기기를 흔들면(shake) 안의 내용을 수행하는 블록

· 원하는 변수를 0으로 설정하는 블럭

· 원하는 변수를 0부터 원하는 숫자 사이의 숫자로 무작위로 저장해주는 블록 

· if 오른쪽 내용이 true이면 안의 내용을 실행하고 아니면 실행하지 않는 블록

· 두 수의 크기를 비교하는 블록 

· 도트매트릭스에 출력할 내용을 직접 그릴 수 있는 블록 

· 변수


무작위로 변하는 가위바위보 만들기


 우선 가위바위보는 랜덤으로 나와야 하기 때문에 무작위변수 설정을 해주겠습니다. 가위바위보는 3가지 경우가 있으므로 0에서 부터 2까지로 하면 0,1,2의 경우가 무작위로 나오기 때문에 0~2까지로 설정해 주시면 됩니다. 


(0부터 2사이의 숫자중 하나인 가위바위보를 만드는 블록)



  가위, 바위, 보 출력하기


이제 가위바위보를 출력해 보겠습니다. 앞에서 가위바위보 변수에 0~2사이의 숫자를 저장했기 때문에 각각 경우를 가위,바위,보라고 생각하고 (저는 0은 바위, 1은 가위, 2는 보라고 정하겠습니다.) 가위바위보 변수가 0이면 바위를 출력, 가위바위보 변수가 1이면 가위를 출력, 가위바위보 변수가 2이면 보를 출력하게 하면 됩니다. 



(가위, 바위, 보를 출력하는 블록)



  모든 블록 연결하기

이제 모든 블록을 연결해 보겠습니다. 우선 기기를 흔들면 시작해야 하므로 그 블록 안에 모든 블록을 넣어야 합니다. 그리고 가장먼저 0~2사이의 변수를 가위바위보 변수에 넣어야 하므로 그다음 이 블록을 넣겠습니다. 마지막으로 그 변수의 값에 따라 가위바위보를 출력해야 하므로 방금짰던 블록을 그 밑에 연결하면 완성입니다. 


(완성)

 

마무리

  

  이번 예제에서는 가속도 센서를 이용한 간단한 코딩을 해봤습니다. 가속도 센서를 이용해서 할 수 있는 것은 이것 말고도 재미있는 것들이 많은데 다음에 다루도록 하겠습니다. 이 다음 포스트에서는 이 코드를 그대로 가져가서 다른 마이크로비트와 통신해서 승패까지 출력해주는 것을 만들어 보겠습니다.

이번에는 두사람의 우정을 구해주는 측정기를 만들어 보겠습니다.


- 기본 개념


  서로의 우정을 측정해주는 것을 만들어 보겠습니다. 실제로 우정을 측정하는 것은 아니고, 두 사람이 신호를 주면 무작위로 우정 좋음, 보통, 낮음으로 표시하게 해서 우정을 측정하는 장난감 같은 것을 만들어 보겠습니다. 


- 코딩 알고리즘


  마이크로비트에는 핀(PIN)이란 것이 있습니다. 이 핀은 P0~P3와 GND로 구성되어 있는데 핀에는 구멍이 있습니다. 이 핀이 작동하려면 P0부터 P3중 하나와 GND가 전기가 통하는 물질로 연결되어있어야 하는데요, 쉽게 건전지의 +(PIN)와 -(GND)가 연결되어야 회로에 전기가 흐르는 것과 같은 개념입니다. 여기서는 그 전기가 통하는 물질을 '사람의 몸' 으로 하겠습니다. 그래서

한 사람이 P0를 왼손으로 잡고 상대편이 오른손으로 GND를 잡은 후, 

남은 손을 서로 잡으면 좋음 보통 낮음 중 하나의 우정을 도트매트릭스에 표현해 주는 것

을 만들어 보겠습니다. 


  먼저 좋음, 보통, 나쁨에 대한 것을 만들어 보겠습니다. 만드는 방법은 무작위로 값이 변하는 수(Random variable)를 만들어 매번 핀을 잡았을 때 다른 우정을 표현해 줄 수 있도록 무작위변수를 만들겠습니다.  - 만들기 1의 내용


 그리고 얻은 무작위 변수에 따라 우정을 도트매트릭스에 표현해 보겠습니다. - 만들기 2의 내용


- 만들기 1 (우정도 변수 만들기)



(만들기 1에 사용할 블럭들)


  왼쪽 위부터 아래로

· 연결한 블록을 0 부터 원하는 수 사이중 하나로 저장하는 블록 (지금 보이는 블럭은 0부터 4 사이의 한 숫자를 저장)

· 우정도를 원하는 수로 설정하는 블록


이렇게 두 개로 만들어 보겠습니다. 


무작위로 변하는 우정도 만들기


 우정도는 더 세세하게 정해주어도 되지만 우선 좋음, 보통, 나쁨 세가지로 구분할 것이기 때문에 무작위 변수는 3가지 값 중 하나를 가져야 합니다. 그래서 0부터 2까지로 설정해 주어서 0(나쁨), 1(보통), 2(좋음) 3가지로 구분해 보겠습니다. 


(0부터 2사이의 숫자중 하나인 우정도를 만드는 블록)



-만들기 2 (얻은 무작위 변수 값에 따라 핀을 잡았을 때 적절한 표정 도트매트릭스에 표시하기)


(만들기2에 사용할 블럭들)



  왼쪽 위부터 아래로

· 핀0와 GND가 연결되면 블록 안의 내용을 실행하게하는 블록

· if 오른쪽의 값이 true이면 안의 내용을 실행하고 false이면 실행하지 않는 블록

· 두 수를 비교하는 블록

· 우정도 블록

· 숫자를 도트매트릭스에 표현해주는 블록



   1. 얻은 무작위 변수값 비교하는 블록 만들기


만들기 1을 통해서 이제 우정도안에는 0에서 2사이의 수가 저장되었습니다. 이 우정도가 0이면 나쁨을 출력, 1이면 보통을 출력, 2이면 좋음을 출력하게하기 위해 if 블록을 사용합니다. 먼저 연결 그림부터 보겠습니다. 


(두 수를 비교해서 true 아니면 false라는 값을 가지는 블록)


이 블록이 의미하는 것은 "우정도가 0과 같으면 true, 아니면 false" 입니다. 앞의 블록 설명에서 if 오른쪽에는 true 또는 false란 값이 들어간다고 했는데요, 이 블록을 그 부분에 연결하면 우정도가 0일때만 원하는 동작을 하게 할 수 있습니다. 나머지 1과 2도 동일합니다. 


(우정도의 값을 비교해서 원하는 값을 출력하게 하기 위한 블록 연결)


 2. 블록안에 적절한 표현 넣기


  위의 사용하는 블록에서는 가지고 있는 우정도의 값을 도트매트릭스에 표현하는 것을 이용하였습니다. 그림부터 보면 조건문은 다 완성했으므로 적절히 연결하면 


(완성)


  숫자 말고 각각 표정을 넣을 수도 있습니다. Basic 의 show icon 이란 블록을 보면 안에 


(show icon)


이렇게 다양한 그림을 출력 할 수 있습니다. 저는 각각 우는표정, 무표정, 웃는 표정을 넣어 봤습니다. 


(완성2)


마무리

  

  이번 예제에서는 또 실전 코딩에서 사용할 수 있는 중요한 것인 무작위변수와 if를 사용해봤습니다. 그리고 PIN 과 GND를 통해 회로가 동작하기 위한 간단한 조건에 대해서도 알게 되셨으면 좋겠습니다. 

이번에는 번개가 쳤을 때 마이크로비트로 거리를 구하는 것을 해보겠습니다.


- 기본 개념


번개가 쳤을 때 번개가 친 지점과 내가 서있는 곳의 거리를 구하는 방법으로 빛의 속도와 소리의 속도의 차이를 이용하는 방법이 있습니다.

예를 들어 누군가가 들판의 중간에 서 있는데 저 먼 곳에서 번쩍이는 번개가 쳤다고 가정해 보겠습니다. 그러면 그 번개가 친 지점에서는 

우르릉 쾅쾅 같은 소리와 아주 밝은 빛을 내게 되는데요, 빛의 속도가 소리의 속도보다 아주 빠르기 때문에 먼저 번쩍이는 것이 보이고 나중에 천둥소리가 들리는 것을 경험해 보셨을 것입니다. 이 빛이 보인 시간과 소리가 들리는 시간의 차이를 구하면 거리를 구할 수 있습니다. 


- 코딩 알고리즘


이제 이것을 이용해서 마이크로비트로 거리를 구하는 것을 만들어 보겠습니다. 

마이크로비트에는 코딩할 수 있는 스위치가 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는 바로 저런 내용까지 고려하지 않아도 무방합니다. 저 블록을 제외하고 한번 실행시켜본 후에 추가하는 것이 더 합리적이라고 생각합니다. 물론 바로 그런 문제까지 생각해 낼 수 있으면 훌륭합니다. 




마무리


  이번 예제를 포스팅하면서 정말 좋은 예제라고 생각했습니다. 타이머 개념, 초기화 개념은 실전 코딩에서 정말 꼭 알아야 하는 개념이라고 생각하는데 이번 예제를 통해서 이런게 있구나 하는 정도만 아셔도 좋을 것 같습니다. 





+ Recent posts