다운로드 교육자료 문제해결 레퍼런스 구입방법

교육 자료 : C 언어 : 근접 센서 사용하기

장애물 감지하기
햄스터 로봇의 전방에 있는 근접 센서는 적외선을 방출하는 IR-LED와 적외선을 감지하는 광 트랜지스터로 이루어져 있습니다. 광 트랜지스터는 IR-LED가 방출하는 적외선이 전방의 물체에 반사되어 들어오는 광량을 측정합니다. 장애물이 가까이 있으면 반사된 광량이 많아서 측정되는 값이 증가하고, 장애물이 멀면 반사된 광량이 적어서 측정되는 값이 감소합니다. 장애물이 없으면 반사된 빛이 없어 0의 값을 가집니다. 햄스터 로봇의 근접 센서는 IR-LED가 로봇의 앞면 좌우에 하나씩 설치되어 있으며, 중앙 아래에 광 트랜지스터가 있어서 좌우의 IR-LED에 대한 광량을 번갈아 측정합니다. 전방의 1cm 이상, 30cm 이하의 거리에 있는 물체나 장애물을 감지할 수 있으며, 0부터 255까지의 값을 가집니다.

코드를 작성하기 전에 우선 장애물과의 거리에 따라 근접 센서의 값이 어떻게 달라지는지 관찰해 봅시다. C 언어의 printf() 함수를 사용하면 문자열을 출력할 수 있습니다.

while문 안에서 wait(20)과 같이 일정 시간 동안 기다리지 않으면 while문이 너무 과도하게 빨리 수행되기 때문에 다른 일, 즉 컴퓨터가 햄스터 로봇과 통신하는 일에 영향을 줄 수도 있습니다. 따라서 너무 빨리 무언가를 반복하는 경우에는 wait(20)과 같이 일정 시간 동안 기다려서 너무 빨리 반복하지 않도록 합시다. 컴퓨터와 햄스터 로봇이 약 20msec 주기로 통신하기 때문에 센서의 값도 약 20msec마다 한 번씩 전달됩니다. 이 주기에 맞추어 20msec 동안 기다리도록 합시다. (보통의 경우 10 ~ 20msec 정도로 하면 됩니다.)

#include <stdio.h> // printf() 함수 때문에 필요하다.
#include "roboid.h"

int main(int argc, char *argv[]) {
    hamster_create();

    while(1) {
        printf("%d, %d\n", hamster_left_proximity(), hamster_right_proximity());
        wait(20); // 너무 빨리 반복하지 않도록 한다.
    }

    return 0;
}

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

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

#include "roboid.h"

int main(int argc, char *argv[]) {
    hamster_create();

    while(hamster_left_proximity() < 40 && hamster_right_proximity() < 40) {
        hamster_wheels(30, 30); // 앞으로 이동한다.
        wait(20); // 너무 빨리 반복하지 않도록 한다.
    }
    hamster_stop(); // 정지한다.

    dispose_all(); // 통신 연결을 종료하고 메모리를 해제한다.

    return 0;
}

손을 치우면 햄스터 로봇이 다시 앞으로 이동하게 해봅시다.

#include "roboid.h"

int main(int argc, char *argv[]) {
    hamster_create();

    while(1) {
        if(hamster_left_proximity() < 40 && hamster_right_proximity() < 40) {
            hamster_wheels(30, 30); // 앞으로 이동한다.
        } else {
            hamster_stop(); // 정지한다.
        }

        wait(20); // 너무 빨리 반복하지 않도록 한다.
    }

    return 0;
}

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

#include "roboid.h"

int main(int argc, char *argv[]) {
    hamster_create();

    while(1) {
        if(hamster_left_proximity() < 40 && hamster_right_proximity() < 40) {
            hamster_wheels(30, 30); // 앞으로 이동한다.
        } else {
            hamster_wheels(-30, -30); // 뒤로 이동한다.
        }

        wait(20); // 너무 빨리 반복하지 않도록 한다.
    }

    return 0;
}

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

숫자 40을 변경하여 장애물과의 거리를 조정해 봅시다.
햄스터 탈출을 막아라
앞으로 이동하는 햄스터 로봇의 앞을 손으로 막으면 회전하여 방향을 바꾸고 다시 앞으로 이동하도록 해봅시다.

#include "roboid.h"

int main(int argc, char *argv[]) {
    hamster_create();

    while(1) {
        if(hamster_left_proximity() < 40 && hamster_right_proximity() < 40) {
            hamster_wheels(30, 30); // 앞으로 이동한다.
        } else {
            hamster_wheels(-30, 30); // 1초 동안 왼쪽으로 회전한다.
            wait(1000);
        }

        wait(20); // 너무 빨리 반복하지 않도록 한다.
    }

    return 0;
}

햄스터 로봇과 손 간의 거리에 따라 회전하는 시간이 달라지도록 해봅시다.
손으로 연주하기
햄스터 로봇과 손 간의 거리에 따라 음정을 변경해 봅시다.

#include "roboid.h"

int main(int argc, char *argv[]) {
    double hz = 0;
    int proximity;

    hamster_create();

    while(1) {
        proximity = hamster_left_proximity();
        if(proximity < 10) { // 거리가 너무 멀면 0으로 한다.
            proximity = 0;
        }

        // 이전의 음정과 현재 근접 센서 값을 조합하여 음정이 부드럽게 변하도록 한다.
        hz = (hz * 5 + proximity * 50) / 10.0;
        hamster_buzzer(hz);

        wait(20); // 너무 빨리 반복하지 않도록 한다.
    }

    return 0;
}
애완 로봇
햄스터 로봇의 앞에 손을 멀리 가져가면 따라 오고 가깝게 가져가면 뒤로 도망가는 애완 로봇을 만들어 봅시다.

#include "roboid.h"

int main(int argc, char *argv[]) {
    int proximity, left_speed, right_speed;

    hamster_create();

    while(1) {
        proximity = hamster_left_proximity(); // 왼쪽 근접 센서 값
        if(proximity > 15) {
            left_speed = (40 - proximity) * 4; // 거리가 멀면 앞으로, 가까우면 뒤로 이동한다.
        } else {
            left_speed = 0; // 거리가 너무 멀면 정지한다.
        }

        proximity = hamster_right_proximity(); // 오른쪽 근접 센서 값
        if(proximity > 15) {
            right_speed = (40 - proximity) * 4; // 거리가 멀면 앞으로, 가까우면 뒤로 이동한다.
        } else {
            right_speed = 0; // 거리가 너무 멀면 정지한다.
        }

        hamster_wheels(left_speed, right_speed);

        wait(20); // 너무 빨리 반복하지 않도록 한다.
    }

    return 0;
}

공통적인 부분을 함수로 만들면 다음과 같이 좀 더 간략하게 코드를 작성할 수 있습니다.

#include "roboid.h"

int calc_speed(int proximity) {
    if(proximity > 15) {
        return (40 - proximity) * 4; // 거리가 멀면 앞으로, 가까우면 뒤로 이동한다.
    } else {
        return 0; // 거리가 너무 멀면 정지한다.
    }
}

int main(int argc, char *argv[]) {
    int left_speed, right_speed;

    hamster_create();

    while(1) {
        left_speed = calc_speed(hamster_left_proximity());
        right_speed = calc_speed(hamster_right_proximity());

        hamster_wheels(left_speed, right_speed);

        wait(20); // 너무 빨리 반복하지 않도록 한다.
    }

    return 0;
}

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

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

목차
수업 준비
  1. 하드웨어 살펴보기
  2. 햄스터 · 햄스터S · USB 동글 PDF · PPT
  3. 소프트웨어 설치
  4. PDF · PPT
  5. 로봇과 컴퓨터 연결
  6. PDF · PPT
  7. 예제 프로젝트 실행
  8. PDF · PPT
기초
  1. 새 프로젝트 만들기
  2. 클라우드 컴퓨터 환경에서 작업하기 (선택 사항)
  3. 말판 이동하기 #1 (순차, 횟수 반복)
  4. 이동하고 회전하기
  5. LED 켜고 소리 내기
  6. 순서대로, 반복하여 명령하기
  7. 키보드 이벤트
  8. 근접 센서 사용하기
  9. 말판 이동하기 #2 (~인 동안 반복)
  10. 바닥 센서 사용하기
  11. 밝기 센서와 가속도 센서 사용하기
  12. 브레이튼버그의 로봇
심화
  1. 보드 게임 만들기
  2. 센서 한 개를 사용한 라인 트레이서
  3. 센서 두 개를 사용한 라인 트레이서
  4. 햄스터 친구 따라가기 (2인 1조)
  5. 여러 대의 햄스터 로봇 제어하기 (선택 사항)
  6. 벽 따라가기
  7. 로봇 청소기 흉내 내기
  8. 라인 트레이서 교차로 주행하기
  9. 미로 탈출
확장 키트
  1. 조립하기
  2. 핀/소켓 배치 살펴보기
  3. 디지털 입력 - 버튼을 누르면 삐 소리가 나요
  4. 디지털 출력 - 어두우면 LED 불이 켜져요
  5. 디지털 출력 - 반짝반짝 LED를 깜박여요
  6. 디지털 출력 - 기울이는 방향으로 LED가 켜져요
  7. 아날로그 입력 - 포텐셔미터를 돌리면 음 높이가 달라져요
  8. 아날로그 입력 - 뜨겁지 않게 해주세요
  9. 아날로그 입력 - 빛을 따라 움직여요
  10. PWM 출력 - LED 불이 부드럽게 밝아졌다 어두워져요
  11. PWM 출력 - LED 촛불이 바람에 흔들려요
  12. 아날로그 서보 출력 - 햄스터 로봇에게 꼬리가 생겼어요
고급
  1. 행위 기반의 로봇 제어
  2. 경로 탐색
  3. 자리 바꾸기
Copyright 로봇SW교육원 All rights reserved.
어려운 일이 있으면 광운대학교 로봇학부 박광현 교수(akaii@kw.ac.kr)에게 연락하세요.