News Download Tutorial FAQ Reference Buy

스크래치 : 센서 사용하기

햄스터 로봇의 양쪽 바퀴는 똑같지 않다. 양쪽 모터의 성능도 다르고 기어의 효율, 바닥과 바퀴의 마찰계수도 다르다. 따라서 앞으로 갈 때 미세하나마 좌우로 방향이 틀어짐을 관찰할 수 있다. 왜 내 로봇은 똑바로 가지 못하나? 이것이 실제의 로봇이다.

그렇다면 사람은 똑바로 걸을 수 있나? 아무도 없는 복도를 눈 감고 걸어 가보자. 물론 위험하니까 친구에게 봐 달라고 하자. 복도의 중앙에서 출발하면 아마 20 걸음도 채 못 가고 벽과 부딪칠 것이다. 이번에는 눈을 뜨고 복도를 보면서 걸어 가보자. 복도 끝까지 문제 없이 갈 수 있을 것이다. 그 이유는 사람은 걸으면서 주위의 상황을 끊임없이 인지하고 자신의 방향을 조정하기 때문이다.

로봇의 센서는 똑바로 가지 못하는 로봇을 잘 조종하여 인간처럼 가게 할 수 있다. 하지만 지능이 없는 로봇은 이 일도 매우 어려운 일이다. 이러한 지능을 여러분이 직접 프로그래밍하여 햄스터 로봇에게 넣어 주도록 하자.
장애물 감지
햄스터 로봇의 전방에 있는 근접 센서는 적외선을 방출하는 IR-LED와 적외선을 감지하는 광 트랜지스터로 이루어져 있다. 광 트랜지스터는 IR-LED가 방출하는 적외선이 전방의 물체에 반사되어 들어오는 광량을 검출한다. 장애물이 가까이 있으면 반사된 광량이 많아져서 측정되는 값이 증가하고, 장애물이 멀면 반사된 광량이 적어져서 측정되는 값이 감소하게 된다. 즉, 장애물까지의 거리에 반비례한다고 할 수 있다. 장애물이 없으면 반사된 빛이 없어 0의 값을 가진다.

햄스터 로봇의 근접 센서는 다음 그림과 같이 IR-LED가 로봇의 앞면 좌우에 하나씩 설치되어 있으며, 중앙 아래에 광 트랜지스터가 있어서 좌우의 IR-LED에 대한 광량을 번갈아 측정한다. 전방의 1cm 이상, 30cm 이하의 거리에 있는 물체나 장애물을 감지할 수 있으며, 0부터 255까지의 값을 가진다.

햄스터 로봇이 앞으로 이동하다가 앞에 장애물이 나타나면 정지하는 프로그램을 작성하시오.

좌우 근접 센서의 값을 읽기 위해서는 '왼쪽 근접 센서' 블록과 '오른쪽 근접 센서' 블록을 사용하면 된다. 프로그램을 구현하기 전에 우선 장애물과의 거리에 따라 근접 센서의 값이 어떻게 변하는지 관찰해 보도록 하자. 스크래치의 경우에는 다음 그림과 같이 블록 팔레트에서 왼쪽 또는 오른쪽 근접 센서 블록을 체크하면 화면에 값이 표시되기 때문에 센서 값의 변화를 쉽게 알 수 있다.
햄스터 로봇의 앞을 손으로 막고, 손을 앞뒤로 움직여 로봇과의 거리를 다르게 하면서 좌우 근접 센서의 값이 어떻게 바뀌는지 살펴 보도록 하자. 하얀색 종이로 하였을 때, 다양한 색상의 물체로 하였을 때 어떤 변화가 생기는지도 살펴 보도록 하자. 같은 거리에서 장애물의 색이 밝을수록 근접 센서의 값이 더 커진다는 것을 알 수 있는데, 밝은 색일수록 반사되는 광량이 많아지기 때문이다.

센서의 값들을 관찰하고 분석하는 것은 매우 중요하기 때문에 앞으로 새로운 센서를 사용할 때마다 이와 같은 방법으로 관찰하는 것을 게을리 하지 않도록 하자.

우선 좌우 근접 센서 중에서 하나만 사용하여 근접 센서의 값이 40보다 크면 정지하도록 만들어 보자. 즉, 근접 센서의 값이 40보다 커질 때까지 햄스터 로봇을 앞으로 이동시키면 된다.
'~까지 반복하기' 블록은 조건이 참이 될 때까지 내부의 블록들을 반복하여 실행한다.

위 프로그램을 자세히 살펴 보면 문제가 있다. 앞으로 이동하고 있는 동안에는 근접 센서의 값을 얻지 못하기 때문이다. 이를 좀 더 자세히 알아보기 위해 다음과 같이 1초를 10초로 수정하고 실행해 보도록 하자.

프로그램을 실행해 보면 앞으로 이동하는 10초 동안에는 앞에 장애물이 있어도 감지하지 못한다. 빠르게 반복적으로 근접 센서의 값을 읽기 위해서는 '~까지 반복하기' 블록 내에 시간이 많이 걸리는 블록은 넣지 않아야 한다. 다음과 같이 프로그램을 수정하도록 하자.

햄스터 로봇이 제자리에서 회전하다가 장애물을 만나면 제자리 돌기를 중지하고 양쪽 LED를 파란색으로 깜박이는 프로그램을 작성하시오.

햄스터 로봇의 LED는 '~ LED를 ~색으로 하기' 블록을 사용하여 7가지 색으로 표시할 수 있다. '무한 반복하기' 블록은 프로그램을 종료할 때까지 내부의 블록들을 반복하여 실행한다.

이제 근접 센서의 값이 40보다 크면 뒤로 물러났다가 다시 앞으로 가는 프로그램을 만들어 보자.

햄스터 로봇이 앞으로 이동하다가 앞에 장애물이 나타나면 일정 거리를 뒤로 이동한 후 다시 앞으로 이동하는 프로그램을 작성하시오.

프로그램을 실행하고 앞으로 달려가는 햄스터 로봇의 앞을 손으로 막으면 근접 센서의 값이 40보다 커져서 뒤로 물러나게 되고, 뒤로 물러나 근접 센서의 값이 40보다 작아지게 되면 다시 앞으로 달려가는 일을 반복하게 될 것이다. 이때, 너무 가까이 막지는 말고 약간 거리를 두어 손으로 막도록 하자. 햄스터 로봇은 전방의 1cm 이내에 있는 장애물은 감지하지 못하기 때문이다. 숫자 40을 0부터 255까지 변경하면서 장애물과의 거리를 조정해 보도록 하자.

전방에 장애물이 있을 때 그냥 순순히 뒤로 물러나면 재미없다. 햄스터 로봇이 놀란 듯한 모습을 표현하기 위해 뒤로 물러날 때는 LED를 빨간색으로 표시해 보자. 화가 나서 눈이 빨갛게 되었다고 생각해도 좋다. 대신, 전진할 때는 LED를 초록색으로 표시하도록 하자.
정지선 지키기
다음 그림에 표시된 바닥 센서는 종이 위에 그려진 선이나 책상의 가장자리 등을 검출할 때 사용된다. 바닥 센서는 근접 센서와 마찬가지로 적외선을 방출하는 IR-LED와 적외선을 감지하는 광 트랜지스터로 이루어져 있다. 다른 점은 IR-LED와 광 트랜지스터가 한 쌍으로 이루어져 좌우 바닥 센서 각각 별도로 구성되어 있다는 것이다. IR-LED가 방출하는 적외선이 바닥에 반사되어 들어오는 광량을 광 트랜지스터가 검출한다. 바닥 센서가 밝은 색의 종이 또는 물체 위에 있으면 반사된 광량이 많아져서 측정되는 값이 증가하고, 어두운 색 위에 있으면 반사된 광량이 적어져서 측정되는 값이 감소하게 된다. 햄스터 로봇이 공중에 떠 있으면, 즉 바닥 센서 아래에 아무 것도 없으면 반사된 빛이 없어 0의 값을 가진다.

실험을 하기 위해 다음 그림과 같이 A4 용지를 준비하고, 검은색 테이프 또는 펜으로 정지선을 표시하자. 미리 제작된 정지선을 프린터로 인쇄하여도 된다. 이때 바닥 센서가 정지선을 놓치지 않고 감지할 수 있도록 정지선의 폭은 1cm 이상으로 하자.

좌우 바닥 센서의 값을 읽기 위해서는 '왼쪽 바닥 센서' 블록과 '오른쪽 바닥 센서' 블록을 사용하면 된다. 프로그램을 구현하기 전에 우선 바닥 센서의 값을 관찰해 보도록 하자. 스크래치의 경우에는 다음 그림과 같이 블록 팔레트에서 왼쪽 또는 오른쪽 바닥 센서 블록을 체크하면 화면에 값이 표시되기 때문에 센서 값의 변화를 쉽게 알 수 있다. 햄스터 로봇의 바닥 센서가 A4 용지의 하얀색 위에 있을 때와 검은색 위에 있을 때 센서 값이 어떻게 다른지 확인해 보도록 하자. 바닥 센서가 하얀색과 검은색의 경계 위에 있을 때, 즉 하얀색과 검은색이 바닥 센서에 반 쯤 걸쳐 있을 때 센서 값이 어떻게 되는지도 살펴 보자.

햄스터 로봇이 앞으로 이동하다가 정지선을 만나면 정지하는 프로그램을 작성하시오.

우선 좌우 바닥 센서 중에서 하나만 사용하여 바닥 센서의 값이 20보다 작으면 정지하는 프로그램을 만들어 보자. 즉, 바닥 센서의 값이 20보다 작아질 때까지 햄스터 로봇을 앞으로 이동시키면 된다.

햄스터 로봇을 A4 용지의 하얀색 위에 올려 놓고 방향을 검은색 선 쪽으로 향하게 한 후 프로그램을 실행해 보자. 햄스터 로봇이 앞으로 달려가다가 검은색 선 위로 올라가면 바닥 센서의 값이 20보다 작아져서 '~까지 반복하기' 블록을 빠져 나와 정지하게 된다. 숫자 20을 조금씩 변경하면서 햄스터 로봇이 정지하는 지점을 조정해 보도록 하자.

햄스터 로봇이 검은 색 선을 네 번 지나간 후 정지하는 프로그램을 작성하시오.

검은색 선 4개가 필요하다. 실험을 위해 다음 그림과 같이 하얀색 A4 용지와 검은색 테이프 또는 펜을 사용하여 실험 환경을 제작하도록 하자. 각 검은색 선 간의 거리는 햄스터 로봇이 1초 동안 전진하는 거리보다 멀어야 한다. 미리 제작된 파일을 프린터로 인쇄하여 사용해도 된다.

검은색 선을 감지하는 것은 앞에서 한 것과 같은 방법으로 하면 된다. 검은색 선을 지나가는 것은 여러 가지 방법이 있는데, 여기서는 우선 쉽게 하기 위해 일정 시간 동안 앞으로 이동하는 방법으로 검은색 선을 지나가도록 하자.

프로그램을 실행하면 햄스터 로봇이 앞으로 이동한다. 왼쪽 바닥 센서가 검은색 선을 지나갈 때, 센서 값이 20보다 작게 되어 '~까지 반복하기' 블록을 빠져 나온다. '~초 기다리기' 블록을 사용하여 1초 동안 기다리게 하는 것은 햄스터 로봇이 1초 정도 앞으로 이동하면 현재 올라가 있는 검은색 선을 벗어날 수 있기 때문이다. 이와 같이 하지 않으면, 햄스터 로봇이 검은색 선을 지나가는 동안 '~까지 반복하기' 블록의 조건이 계속 참이 되어서 제일 바깥쪽의 '~번 반복하기' 블록의 반복 횟수가 증가하게 되고, 우리가 원하는 동작을 수행할 수 없게 된다. 이때, 햄스터 로봇에게 앞으로 이동하라는 명령을 내릴 뿐 정지하라는 명령을 내리지는 않기 때문에 '~초 기다리기' 블록에서 1초 동안 기다리더라도 햄스터 로봇은 계속 앞으로 이동하는 상태가 된다. 이러한 과정을 4번 반복하면 햄스터 로봇을 정지하고 프로그램이 종료된다.

검은색 선을 언제 감지하는지 알 수가 없기 때문에 검은 색 선을 감지할 때마다 삐 소리를 내도록 하자.

이번에는 마지막 검은색 선을 지나가지 않고 정지하는 프로그램을 만들어 보자.

햄스터 로봇이 앞으로 이동하다가 네 번째 검은색 선을 만나면 정지하는 프로그램을 작성하시오.

앞의 프로그램에서는 매 반복할 떄마다 검은 색 선을 감지한 후 1초를 기다리기 때문에 마지막 검은색 선을 지나갈 수밖에 없다. 다음 그림과 같이 1초 기다리기를 먼저 하면 1초를 기다린 다음 출발하긴 하지만 마지막 검은색 선을 만났을 때 정지하게 된다.
어둠이 무서워요
옛날 노래 중에 "나 오늘, 오늘밤은 어둠이 무서워요..." 하는 노래가 있었다. 햄스터 로봇도 어둠을 무서워할까?

어두우면 햄스터 로봇이 소리를 내도록 프로그램을 작성하시오.

다음 그림과 같이 햄스터 로봇의 앞면에는 근접 센서의 광 트랜지스터와 같은 위치에 빛의 밝기를 감지하는 밝기 센서가 있다. 밝기 센서는 0부터 65535까지의 값을 가지며, 밝을 수록 값이 커진다.

밝기 센서의 값을 읽기 위해서는 '밝기 센서' 블록을 사용하면 된다. 프로그램을 구현하기 전에 우선 밝기 센서의 값을 관찰해 보도록 하자. 스크래치의 경우에는 다음 그림과 같이 블록 팔레트에서 밝기 센서 블록을 체크하면 화면에 값이 표시되기 때문에 센서 값의 변화를 쉽게 알 수 있다. 햄스터 로봇의 밝기 센서를 손으로 가리거나 모니터 화면 또는 형광등과 같이 밝은 곳을 향했을 때 센서 값이 어떻게 변하는지 관찰해 보도록 하자.

어둠을 무서워하는 햄스터 로봇을 옷이나 종이 박스로 덮으면 어떤 행동을 할까? 아마도 비명을 지르지 않을까? 진짜 비명 소리를 출력하기는 어려우니 여기서는 간단하게 하기 위해 햄스터 로봇의 버저를 사용해 보자.
버저는 0부터 167772.15까지의 값을 가진다. 정확하지는 않지만 주파수 Hz를 나타내므로 값이 커질 수록 높은 음의 소리를 낸다. 시끄러워서 버저 소리를 끄기 위해서는 0을 입력하면 된다.

어두워졌을 때 똑같은 소리를 내니까 좀 심심한 것 같다. 이번에는 어두워질 수록 높은 비명 소리를 지르게 해보자. 밝기 센서 값의 범위를 5부터 20 정도로 해서 밝기 값이 20일 때 버저 음은 500, 밝기 값이 5일 때 버저 음은 2000이 되도록 하고, 그 사이를 일정 비율로 버저 음이 높아지도록 하면 (버저 음) = 2500 - (밝기) * 100이 된다.
긴급구조
햄스터 로봇이 길을 가다가 넘어지거나 납치를 당하면 빨리 달려가 구해 주어야 한다.

햄스터 로봇이 넘어지면 삐삐삐 소리를 내도록 프로그램을 작성하시오.

우선 햄스터 로봇이 넘어졌다는 것을 알 수 있어야 하는데 이를 위해 햄스터 로봇에 내장된 가속도 센서를 사용해 보자. 햄스터 로봇은 3축 가속도 센서를 가지고 있으며, 각각의 축 방향에 대해 -32768부터 32767까지의 값을 가진다. 다음 그림과 같이 가속도 센서의 X축은 로봇의 정면 방향이 양수 값이고 뒷면 방향이 음수 값이다. Y축은 왼쪽 방향이 양수 값, 오른쪽 방향이 음수 값이며, Z축은 위쪽 방향이 양수 값, 아래쪽 방향이 음수 값이다.

각 축에 대한 가속도 값은 'x축 가속도', 'y축 가속도', 'z축 가속도' 블록을 사용하여 알 수 있다. 프로그램을 구현하기 전에 우선 가속도 센서의 값을 관찰해 보도록 하자. 스크래치의 경우에는 다음 그림과 같이 블록 팔레트에서 x축 가속도 블록과 y축 가속도 블록, z축 가속도 블록을 체크하면 화면에 값이 표시되기 때문에 센서 값의 변화를 쉽게 알 수 있다. 햄스터 로봇을 뒤집거나 옆으로 눕게 했을 때 가속도 값이 어떻게 변하는지 관찰해 보도록 하자. 또는 햄스터 로봇을 손에 쥐고 이리저리 손목을 움직이면서 가속도 값을 확인해 보자.

햄스터 로봇이 똑바로 서있으면 중력에 의해 아래쪽으로만 가속도가 생기므로 가속도의 Z축 성분만 음수로 크기가 큰 값을 가지고 X축과 Y축 성분의 크기는 작은 값을 가지게 된다. 햄스터 로봇이 앞뒤로 혹은 왼쪽, 오른쪽으로 넘어졌을 때는 Z축 성분의 크기가 작아지고 X축 또는 Y축 성분의 크기는 커진다는 것을 알 수 있다. 따라서, Z축 성분의 크기가 작거나 양수이면 햄스터 로봇이 넘어졌다고 판단할 수 있다.
목차
Hardware
  1. Hamster robot
  2. USB dongle
Preparation for Class
  1. Software installation   Windows · MacOS · Linux
  2. Robot to PC connection
  3. Software execution   Windows · MacOS · Linux
Basic
  1. Standing and singing
  2. My precious ass
  3. Moving an object with the accelerometer
Advanced
  1. Moving an object with the accelerometer
  2. Line follower with one sensor
Previous Lectures
  1. Ordering in sequence
  2. Repeat
  3. Debugging
  4. Repeat until hand found
  5. Move a robot
  6. Use sensors
  7. Use the default board
  8. Braitenberg's robot
Copyright Robot Software Education Institute. All rights reserved.
Please contact prof. Kwang-Hyun Park (akaii@kw.ac.kr) if you have any problem.