News Download Tutorial FAQ Reference Buy

자바스크립트 : 센서 사용하기

개요
왜 내 로봇은 똑바로 가지 못할까요? 로봇의 양쪽 바퀴는 똑같지 않습니다. 양쪽 모터의 성능도 다르고 기어가 빡빡하거나 느슨한 정도, 바퀴와 바닥 간의 마찰력, 타이어의 마모 상태 등에 따라 실제로 바퀴가 이동하는 속도는 달라질 수 있습니다. 양쪽 바퀴가 이동하는 속도가 조금만 달라도 로봇은 똑바로 이동하지 못합니다. 이것이 실제의 로봇입니다.

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

센서를 사용하면 똑바로 가지 못하는 로봇을 잘 조종하여 인간처럼 가게 할 수 있습니다. 하지만 지능이 없는 로봇은 이 일도 매우 어려운 일입니다. 이러한 지능을 직접 코드로 작성하여 햄스터 로봇을 똑똑하게 만들어 줍시다.
장애물 감지하기
햄스터 로봇의 전방에 있는 근접 센서는 적외선을 방출하는 IR-LED와 적외선을 감지하는 광 트랜지스터로 이루어져 있습니다. 광 트랜지스터는 IR-LED가 방출하는 적외선이 전방의 물체에 반사되어 들어오는 광량을 측정합니다. 장애물이 가까이 있으면 반사된 광량이 많아서 측정되는 값이 증가하고, 장애물이 멀면 반사된 광량이 적어서 측정되는 값이 감소합니다. 장애물이 없으면 반사된 빛이 없어 0의 값을 가집니다. 햄스터 로봇의 근접 센서는 IR-LED가 로봇의 앞면 좌우에 하나씩 설치되어 있으며, 중앙 아래에 광 트랜지스터가 있어서 좌우의 IR-LED에 대한 광량을 번갈아 측정합니다. 전방의 1cm 이상, 30cm 이하의 거리에 있는 물체나 장애물을 감지할 수 있으며, 0부터 255까지의 값을 가집니다.

코드를 작성하기 전에 우선 장애물과의 거리에 따라 근접 센서의 값이 어떻게 달라지는지 관찰해 봅시다. 자바스크립트의 console.log() 메소드를 사용하면 콘솔 창에 문자열을 출력할 수 있습니다.

var hamster = Hamster.create();

function execute() {
    console.log(hamster.leftProximity() + ', ' + hamster.rightProximity());
}

햄스터 로봇의 앞을 손으로 막고 손을 앞뒤로 움직여 로봇과의 거리를 다르게 하면서 왼쪽 근접 센서와 오른쪽 근접 센서의 값이 어떻게 달라지는지 관찰해 봅시다. 손을 너무 가까이 가져 가면 센서 값이 측정되지 않을 수도 있습니다. 하얀색 종이로 하였을 때, 다양한 색상의 물체로 하였을 때 어떤 변화가 생기는지도 관찰해 봅시다. 같은 거리에서 장애물의 색이 밝을수록 근접 센서의 값이 더 커진다는 것을 알 수 있는데, 밝은 색일수록 반사되는 광량이 많아지기 때문입니다. 센서의 값들을 관찰하고 분석하는 것은 매우 중요하기 때문에 앞으로 새로운 센서를 사용할 때마다 반드시 이와 같은 방법으로 관찰하도록 합시다.

햄스터 로봇이 앞으로 이동하다가 앞에 장애물이 나타나면 정지하게 해봅시다. 40이라는 숫자는 장애물과의 거리에 따라 센서 값이 어떻게 되는지 관찰하여 정해주면 됩니다.

var hamster = Hamster.create();

function execute() {
    if(hamster.leftProximity() > 40 || hamster.rightProximity() > 40) {
        hamster.wheels(0, 0); // 정지한다.
    } else {
        hamster.wheels(30, 30); // 앞으로 이동한다.
    }
}

손을 치우면 햄스터 로봇이 다시 앞으로 이동하게 되는데 다시 이동하지 않게 하려면 플래그 변수를 사용하면 됩니다.

var hamster = Hamster.create();
var quit = false;

function execute() {
    if(quit) {
        hamster.wheels(0, 0); // 정지한다.
    } else {
        hamster.wheels(30, 30); // 앞으로 이동한다.
    }
    if(hamster.leftProximity() > 40 || hamster.rightProximity() > 40) {
        quit = true;
    }
}

햄스터 로봇이 제자리에서 왼쪽으로 돌다가 앞에 장애물이 있으면 정지하게 해봅시다.
밀당 로봇
햄스터 로봇이 앞으로 이동하다가 앞쪽의 장애물과 가까우면 뒤로 물러나고 장애물과 멀어지면 다시 앞으로 이동하여, 장애물과 일정 거리를 두고 앞뒤로 이동하게 해봅시다.

var hamster = Hamster.create();

function execute() {
    if(hamster.leftProximity() > 40 || hamster.rightProximity() > 40) {
        hamster.wheels(-30, -30); // 뒤로 이동한다.
    } else {
        hamster.wheels(30, 30); // 앞으로 이동한다.
    }
}

장애물과 가까우면 근접 센서의 값이 40보다 커져서 뒤로 물러나고, 뒤로 물러나 장애물과 멀어지면 근접 센서의 값이 40보다 작아져서 다시 앞으로 이동하는 것을 반복합니다.

숫자 40을 변경하여 장애물과의 거리를 조정해 봅시다.
손으로 연주하기
햄스터 로봇과 손 간의 거리에 따라 음정을 변경해 봅시다. 자바스크립트의 Math.floor() 메소드를 사용하여 소수점 이하는 버리도록 합시다.

var hamster = Hamster.create();
var pitch = 0;

function execute() {
    var proximity = hamster.leftProximity();
    if(proximity < 10) { // 거리가 너무 멀면 0으로 한다.
        proximity = 0;
    }
    // 이전의 음정과 현재 근접 센서 값을 조합하여 음정이 부드럽게 변하도록 한다.
    pitch = (pitch * 9 + proximity) / 10;
    hamster.note(Math.floor(pitch));
}
애완 로봇
햄스터 로봇의 앞에 손을 멀리 가져가면 따라 오고 가깝게 가져가면 뒤로 도망가는 애완 로봇을 만들어 봅시다.

var hamster = Hamster.create();

function execute() {
    var left = hamster.leftProximity(); // 왼쪽 근접 센서 값
    var right = hamster.rightProximity(); // 오른쪽 근접 센서 값

    if(left > 10) {
        hamster.leftWheel((40 - left) * 3); // 거리가 멀면 앞으로, 가까우면 뒤로 이동한다.
    } else {
        hamster.leftWheel(0); // 거리가 너무 멀면 정지한다.
    }

    if(right > 10) {
        hamster.rightWheel((40 - right) * 3); // 거리가 멀면 앞으로, 가까우면 뒤로 이동한다.
    } else {
        hamster.rightWheel(0); // 거리가 너무 멀면 정지한다.
    }
}

햄스터 로봇과 손 간의 거리가 가까우면 근접 센서의 값이 40보다 커져서 바퀴의 속도가 음수가 되고, 거리가 멀면 근접 센서의 값이 40보다 작아져서 바퀴의 속도가 양수가 됩니다. 왼쪽 바퀴의 속도는 왼쪽 근접 센서 값에 의해 결정되고, 오른쪽 바퀴의 속도는 오른쪽 근접 센서 값에 의해 결정되기 때문에 손을 가져가는 방향에 따라 햄스터 로봇의 움직임이 달라집니다.

손바닥을 약간 둥근 모양으로 하면 햄스터 로봇이 더 잘 움직입니다.

정지선 지키기
햄스터 로봇의 바닥 센서는 종이 위에 그려진 선이나 책상의 가장자리 등을 검출할 때 사용합니다. 바닥 센서는 근접 센서와 마찬가지로 적외선을 방출하는 IR-LED와 적외선을 감지하는 광 트랜지스터로 이루어져 있습니다. 다른 점은 IR-LED와 광 트랜지스터가 한 쌍으로 이루어져 왼쪽 바닥 센서와 오른쪽 바닥 센서, 각각 별도로 구성되어 있다는 것입니다. IR-LED가 방출하는 적외선이 바닥에 반사되어 들어오는 광량을 광 트랜지스터가 측정합니다. 바닥 센서가 밝은 색의 종이 또는 물체 위에 있으면 반사된 광량이 많아서 측정되는 값이 증가하고, 어두운 색 위에 있으면 반사된 광량이 적어서 측정되는 값이 감소합니다. 햄스터 로봇이 공중에 떠 있으면, 즉 바닥 센서 아래에 아무 것도 없으면 반사된 빛이 없어 0의 값을 가집니다. 바닥 센서가 출력하는 값의 범위는 0 ~ 255이지만 바닥에서 가장 밝은 색(흰색에 가까운 색 중에서 가장 밝은 색)을 100으로 자동 보정하기 때문에 코드 작성 시 사용하는 값의 범위는 0 ~ 100입니다.

A4 용지를 준비하고 검은색 테이프 또는 펜으로 정지선을 표시합시다. 미리 제작된 파일을 프린터로 인쇄해도 됩니다. 이때 바닥 센서가 정지선을 놓치지 않고 감지할 수 있도록 정지선의 폭은 1cm 이상으로 합시다.

코드를 작성하기 전에 우선 바닥의 색상에 따라 바닥 센서의 값이 어떻게 달라지는지 관찰해 봅시다. 바닥 센서가 A4 용지의 하얀색 위에 있을 때와 검은색 위에 있을 때 센서 값이 어떻게 다른지 확인해 봅시다. 바닥 센서가 하얀색과 검은색의 경계 위에 있을 때, 즉 하얀색과 검은색이 바닥 센서에 반 쯤 걸쳐 있을 때 센서 값이 어떻게 되는지도 관찰해 봅시다.

var hamster = Hamster.create();

function execute() {
    console.log(hamster.leftFloor() + ', ' + hamster.rightFloor());
}

햄스터 로봇이 앞으로 이동하다가 정지선을 만나면 정지하게 해봅시다.

var hamster = Hamster.create();

function execute() {
    if(hamster.leftFloor() < 20 || hamster.rightFloor() < 20) {
        hamster.wheels(0, 0); // 정지한다.
    } else {
        hamster.wheels(30, 30); // 앞으로 이동한다.
    }
}

숫자 20을 변경하여 햄스터 로봇이 정지하는 지점을 조정해 봅시다.
일정 간격의 검은색 선 개수 세기
A4 용지를 준비하고 검은색 테이프 또는 펜으로 검은색 선을 여러 개 표시합시다. 미리 제작된 파일을 프린터로 인쇄해도 됩니다. 이때 바닥 센서가 검은색 선을 놓치지 않고 감지할 수 있도록 검은색 선의 폭은 1cm 이상으로 합시다. 검은색 선 간의 거리는 햄스터 로봇이 1초 동안 앞으로 이동하는 거리보다 멀어야 합니다.

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

var hamster = Hamster.create();
var count = 0;
var forward = false;

hamster.wheels(30, 30); // 앞으로 이동한다.

function execute() {
    if(hamster.leftFloor() < 20 || hamster.rightFloor() < 20) { // 검은색 선 위에 있으면
        if(forward == false) { // 1초 이동하는 것을 시작하지 않았으면
            forward = true;
            setTimeout(function() {
                forward = false;
            }, 1000); // 1초 후에 forward를 false로 변경한다.

            // 개수를 하나 증가시키고 콘솔 창에 출력한다.
            ++count;
            console.log('count: ' + count);
        }
    }
}

검은색 선의 개수를 세다가 네 번째 검은색 선을 만나면 정지하도록 해봅시다.
임의 간격의 검은색 선 개수 세기
검은색 선 간의 거리를 임의로 하면 햄스터 로봇이 1초 동안 앞으로 이동할 때 검은색 선을 하나 이상 지나갈 수 있습니다. 하얀색과 검은색의 경계를 감지해 봅시다. 하얀색에서 검은색으로 바뀔 때 개수를 세면 됩니다.

var hamster = Hamster.create();
var count = 0;
var white = false;

hamster.wheels(30, 30); // 앞으로 이동한다.

function execute() {
    if(hamster.leftFloor() > 80 && hamster.rightFloor() > 80) {
        white = true; // 하얀색 종이 위에 있다.
    } else if(white == true && (hamster.leftFloor() < 20 || hamster.rightFloor() < 20)) { // 하얀색에서 검은색으로 바뀌면
        white = false;

        // 개수를 하나 증가시키고 콘솔 창에 출력한다.
        ++count;
        console.log('count: ' + count);
    }
}
바코드 읽기
검은색 선 위에 있는 동안 시간을 측정하여 선의 두께를 알아 봅시다. 굵은 선과 가는 선, 두 가지로 구분하여 바코드를 인식합시다.

var hamster = Hamster.create();
var count = 0;
var tick = 0;
var code = '';

hamster.wheels(30, 30); // 앞으로 이동한다.

function execute() {
    if(hamster.leftFloor() > 80 && hamster.rightFloor() > 80) { // 하얀색 종이 위에 있으면
        if(tick > 0) {
            if(tick > 40) { // 선이 굵다.
                code += '-';
            } else { // 선이 가늘다.
                code += '.';
            }

            // 바코드 확인
            console.log(code);
            if(code == '.--.') {
                console.log('peanut');
                code = '';
            } else if(code == '-..-') {
                console.log('cheese');
                code = '';
            }
        }
        tick = 0;
    } else if(hamster.leftFloor() < 20 || hamster.rightFloor() < 20) { // 검은색 선 위에 있으면
        ++tick;
    }
}
어둠이 무서워요
햄스터 로봇의 앞면에는 근접 센서의 광 트랜지스터와 같은 위치에 빛의 밝기를 감지하는 밝기 센서가 있습니다. 밝기 센서는 0부터 65535 Lux까지의 값을 가지며, 밝을 수록 값이 커집니다.

코드를 작성하기 전에 우선 밝기 센서의 값을 관찰해 봅시다. 햄스터 로봇의 밝기 센서를 손으로 가리거나 모니터 화면 또는 형광등과 같이 밝은 곳을 향했을 때 센서 값이 어떻게 달라지는지 관찰해 봅시다.

var hamster = Hamster.create();

function execute() {
    console.log(hamster.light());
}

햄스터 로봇을 옷이나 종이 박스로 덮으면 버저 소리를 내게 합시다.

var hamster = Hamster.create();

function execute() {
    if(hamster.light() < 10) {
        hamster.buzzer(1000);
    } else {
        hamster.buzzer(0);
    }
}

어두울 수록 높은 음을 내게 해봅시다. 밝기 센서의 값이 100일 때 버저 음의 높이는 100, 밝기 센서의 값이 5일 때 버저 음의 높이는 2000이 되도록 하고, 그 사이를 일정 비율로 버저 음이 높아지도록 하면 (버저 음) = 2100 - (밝기) * 20이 됩니다.

var hamster = Hamster.create();

function execute() {
    var value = hamster.light();
    console.log(value);
    if(value < 5) {
        hamster.buzzer(2000);
    } else if(value > 100) {
        hamster.buzzer(0);
    } else {
        hamster.buzzer(2100 - value * 20);
    }
}
엉덩이 치면 앞으로 가기
햄스터 로봇의 3축 가속도 센서 좌표계는 로봇의 앞쪽 방향이 X축, 왼쪽 방향이 Y축, 위쪽 방향이 Z축의 양수 방향이며, 각각 -32768 ~ 32767의 값을 가집니다.

코드를 작성하기 전에 우선 가속도 센서의 값을 관찰해 봅시다. 햄스터 로봇을 뒤집거나 옆으로 눕혔을 때 가속도 값이 어떻게 달라지는지 관찰해 봅시다. 햄스터 로봇을 손에 쥐고 이리저리 손목을 움직이면서 가속도 값을 확인해 봅시다.

var hamster = Hamster.create();

function execute() {
    console.log(hamster.accelerationX() + ', ' + hamster.accelerationY() + ', ' + hamster.accelerationZ());
}

햄스터 로봇의 엉덩이를 손가락으로 툭 치면 햄스터 로봇의 X축 방향으로 가속도가 작용합니다. 이를 감지하여 1초 동안 앞으로 가게 해봅시다.

var hamster = Hamster.create();
var hit = false;

function execute() {
    if(hit == false && hamster.accelerationX() > 2000) { // 엉덩이를 툭 쳤으면
        hit = true;
        hamster.wheels(30, 30); // 앞으로 이동한다.
        setTimeout(function() {
            hamster.wheels(0, 0);
            hit = false;
        }, 1000); // 1초 후에 정지한다.
    }
}

어느 방향으로든 햄스터 로봇을 손가락으로 툭 치면 1초 동안 앞으로 가도록 코드를 수정해 봅시다.
긴급구조
햄스터 로봇에 내장된 가속도 센서를 사용하여 햄스터 로봇이 넘어졌다는 것을 감지해 봅시다. 햄스터 로봇이 똑바로 서있으면 중력에 의해 아래쪽으로만 가속도가 생기므로 가속도의 Z축 성분만 음수로 크기가 큰 값을 가지고 X축과 Y축 성분의 크기는 작은 값을 가집니다. 햄스터 로봇이 앞뒤로 혹은 왼쪽, 오른쪽으로 넘어졌을 때는 Z축 성분의 크기가 작아지고 X축 또는 Y축 성분의 크기는 커진다는 것을 알 수 있습니다. 따라서 Z축 성분의 크기가 작거나 양수이면 햄스터 로봇이 넘어졌다고 판단할 수 있습니다.

var hamster = Hamster.create();
var on = true;
var tick = 0;

function execute() {
    if(hamster.accelerationZ() > -2048) { // Z축 가속도 값이 작거나 양수이면
        // 일정 시간 간격으로 삐삐삐~ 소리 낸다.
        if(on) {
            hamster.buzzer(1000);
        } else {
            hamster.buzzer(0);
        }
        if(++tick == 10) { // 10 x 20msec = 0.2초가 될 때마다
            tick = 0;
            on = !on;
        }
    } else { // 넘어진 것이 아니면
        // 버저 소리를 끄고 변수 값을 초기화한다.
        hamster.buzzer(0);
        on = true;
        tick = 0;
    }
}
목차
하드웨어 살펴보기
  1. 햄스터 로봇
  2. USB 동글
수업 준비
  1. 소프트웨어 설치
  2. 로봇과 PC 연결
  3. 소프트웨어 실행
기초
  1. 코드의 기본 형태 만들기
  2. 로봇 움직이기
  3. LED 켜고 소리 내기
  4. 복잡한 명령 수행하기
  5. 센서 사용하기
심화
  1. 컵 따라 돌기
  2. 로봇 청소기
  3. 라인 트레이서
  4. 햄스터 친구 따라가기
  5. 미로 탈출
확장 키트
  1. 디지털 입력 - 버튼을 누르면 삐 소리가 나요
  2. 디지털 출력 - 어두우면 LED 불이 켜져요
  3. 디지털 출력 - 반짝반짝 LED를 깜박여요
  4. 디지털 출력 - 기울이는 방향으로 LED가 켜져요
  5. 아날로그 입력 (ADC) - 포텐셔미터를 돌리면 음 높이가 달라져요
  6. 아날로그 입력 (ADC) - 뜨겁지 않게 해주세요
  7. 아날로그 입력 (ADC) - 빛을 따라 움직여요
  8. PWM 출력 - LED 불이 부드럽게 밝아졌다 어두워져요
  9. PWM 출력 - LED 촛불이 바람에 흔들려요
  10. 아날로그 서보 출력 - 햄스터 로봇에게 꼬리가 생겼어요
영재반
  1. 브레이튼버그의 로봇
  2. 행위 기반의 로봇 제어
  3. 경로 탐색
  4. 자리 바꾸기
Copyright Robot Software Education Institute. All rights reserved.
Please contact prof. Kwang-Hyun Park (akaii@kw.ac.kr) if you have any problem.