마이크로폰 액션

01. 소리 질러~~

스마트 폰의 마이크로 입력되는 소리의 크기에 따라 알버트 로봇을 움직여 보자.

스마트 폰의 마이크에 입으로 후~ 불면 알버트 로봇이 뒤로 물러나는 프로그램을 작성하시오.

웹 페이지 만들기를 참고하여 안드로이드 프로젝트와 웹 페이지 파일을 만들자. onInitialized(robot) 콜백 함수와 onExecute() 콜백 함수를 만들고, 웹 페이지가 닫힐 때 호출되는 window.onunload 함수도 만들자.

 <script type="text/javascript">

 function onInitialized(robot)
 {
 }

 function onExecute()
 {
 }

 window.onunload = function()
 {
 }
 </script>

Microphone 액션의 객체를 얻기 위해서는 Action 객체의 obtain(actionId) 함수에서 actionId에 Action.Microphone.ID를 입력하면 된다.

 <script type="text/javascript">

 var action = Action.obtain(Action.Microphone.ID); // 액션 객체를 얻는다.
 action.activate(); // 액션을 시작한다.

 function onInitialized(robot)
 {
 }

 function onExecute()
 {
 }

 window.onunload = function()
 {
     action.deactivate(); // 액션을 중지한다.
     action.dispose(); // 액션을 폐기한다.
 }
 </script>

window.onunload 함수에서 액션을 중지 및 폐기하였지만 어디에서 해도 상관은 없다. 웹 페이지가 닫히기 전에 액션을 모두 폐기하여야 한다는 것만 잊지 않도록 하자.

Microphone 액션에는 스마트 폰의 마이크로 입력된 소리의 크기를 읽는 디바이스로 SENSOR_LEVEL이 있다. 입력된 소리의 파워를 데시벨로 나타내며, -100부터 0까지의 값을 가지는데 소리의 파워가 커질수록 값이 커진다.

 <script type="text/javascript">

 var action = Action.obtain(Action.Microphone.ID);
 var levelDevice = action.findDeviceById(Action.Microphone.SENSOR_LEVEL);
 action.activate();

 function onInitialized(robot)
 {
 }

 function onExecute()
 {
     var level = levelDevice.readFloat();
 }

 window.onunload = function()
 {
     action.deactivate();
     action.dispose();
 }
 </script>

이제 스마트 폰의 마이크로 입력된 소리의 크기에 따라 알버트 로봇을 움직여 보도록 하자.

 <script type="text/javascript">

 var leftWheelDevice;
 var rightWheelDevice;
 var action = Action.obtain(Action.Microphone.ID);
 var levelDevice = action.findDeviceById(Action.Microphone.SENSOR_LEVEL);
 action.activate();

 function onInitialized(robot)
 {
     leftWheelDevice = robot.findDeviceById(Albert.EFFECTOR_LEFT_WHEEL);
     rightWheelDevice = robot.findDeviceById(Albert.EFFECTOR_RIGHT_WHEEL);
 }

 function onExecute()
 {
     var level = levelDevice.readFloat();
     if(level > -10)
     {
         leftWheelDevice.write(-20);
         rightWheelDevice.write(-20);
     }
     else
     {
         leftWheelDevice.write(0);
         rightWheelDevice.write(0);
     }
 }

 window.onunload = function()
 {
     action.deactivate();
     action.dispose();
 }
 </script>

스마트 로봇 론처를 실행하여 로봇과 연결한 후 애플리케이션을 실행하자. 스마트 폰을 알버트 로봇에 올려 놓고 스마트 폰의 마이크에 입으로 후~ 불면 작고 앙증맞은 알버트 로봇이 바람에 날려 뒤로 밀리는 것을 볼 수 있다. 너무 세게 불면 머리가 아프니까 경계값 -10을 변경하면서 적절한 값을 찾아 보도록 하자.

액션의 경우에도 로봇과 마찬가지로 onDeviceDataChanged(device, values, timestamp) 콜백 함수를 통해 디바이스의 데이터를 얻을 수 있다.

 <script type="text/javascript">

 var leftWheelDevice;
 var rightWheelDevice;
 var action = Action.obtain(Action.Microphone.ID);
 action.activate();

 function onInitialized(robot)
 {
     leftWheelDevice = robot.findDeviceById(Albert.EFFECTOR_LEFT_WHEEL);
     rightWheelDevice = robot.findDeviceById(Albert.EFFECTOR_RIGHT_WHEEL);
 }

 function onDeviceDataChanged(device, values, timestamp)
 {
     var level;
     switch(device.getId())
     {
     case Action.Microphone.SENSOR_LEVEL:
         level = values[0];
         if(level > -10)
         {
             leftWheelDevice.write(-20);
             rightWheelDevice.write(-20);
         }
         else
         {
             leftWheelDevice.write(0);
             rightWheelDevice.write(0);
         }
         break;
     }
 }

 window.onunload = function()
 {
     action.deactivate();
     action.dispose();
 }
 </script>