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

교육 자료 : 프로세싱 : 밝기 센서와 가속도 센서 사용하기

어둠이 무서워요
햄스터 로봇의 앞면에는 근접 센서의 광 트랜지스터와 같은 위치에 빛의 밝기를 감지하는 밝기 센서가 있습니다. 밝기 센서는 0부터 65535 Lux까지의 값을 가지며, 밝을 수록 값이 커집니다.

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

import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;

Hamster hamster;

void setup() {
    hamster = Hamster.create(this);
}

void draw() {
}

void run() {
    while(true) {
        println(hamster.light());
        delay(20); // 너무 빨리 반복하지 않도록 한다.
    }
}

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

import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;

Hamster hamster;

void setup() {
    hamster = Hamster.create(this);
}

void draw() {
}

void run() {
    while(true) {
        if(hamster.light() < 10) {
            hamster.buzzer(1000);
        } else {
            hamster.buzzer(0);
        }

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

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

import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;

Hamster hamster;

void setup() {
    hamster = Hamster.create(this);
}

void draw() {
}

void run() {
    int value;
    while(true) {
        value = hamster.light();
        println(value);

        if(value < 5) {
            hamster.buzzer(2000);
        } else if(value > 100) {
            hamster.buzzer(0);
        } else {
            hamster.buzzer(2100 - value * 20);
        }

        delay(20); // 너무 빨리 반복하지 않도록 한다.
    }
}
빛으로 말해요 (2인 1조)
모스 부호를 만들어 햄스터 친구에게 전달해 봅시다. 첫 번째 햄스터 로봇은 하얀색 LED를 짧게 또는 길게 깜박여서 모스 부호를 표현합니다. 키보드의 숫자 1 키와 숫자 2 키를 눌렀을 때 다른 모스 부호를 표현하도록 합시다.

import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;

Hamster hamster;

void setup() {
    hamster = Hamster.create(this);
}

void draw() {
}

// 양쪽 LED를 하얀색으로 짧게 깜박인다.
void blinkShort() {
    hamster.leds(Hamster.LED_WHITE);
    delay(200);
    hamster.leds(0);
    delay(200);
}

// 양쪽 LED를 하얀색으로 길게 깜박인다.
void blinkLong() {
    hamster.leds(Hamster.LED_WHITE);
    delay(1000);
    hamster.leds(0);
    delay(200);
}

// 첫 번째 모스 부호 (.--.)
void sendMorse1() {
    blinkShort();
    blinkLong();
    blinkLong();
    blinkShort();
}

// 두 번째 모스 부호 (-..-)
void sendMorse2() {
    blinkLong();
    blinkShort();
    blinkShort();
    blinkLong();
}

void keyPressed() {
    if(key == '1') {
        sendMorse1();
    } else if(key == '2') {
        sendMorse2();
    }
}

두 번째 햄스터 로봇은 밝기 센서를 사용하여 LED의 밝기를 감지하고 LED가 켜진 시간을 측정하여 모스 부호를 알아냅니다. 첫 번째 모스 부호에 대해서는 잠시 뒤로 물러났다가 왼쪽으로 회전하고, 두 번째 모스 부호에 대해서는 잠시 뒤로 물러났다가 오른쪽으로 회전하도록 합시다. 주위 불빛 때문에 잘못 인식될 수도 있으므로 키보드의 스페이스 키를 누르면 초기화하여 다시 인식하도록 합시다.

import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;

Hamster hamster;
int code = 0;
String str = "";

void setup() {
    hamster = Hamster.create(this);
}

void draw() {
}

void keyPressed() {
    if(key == ' ') { // 스페이스 키를 눌렀으면
        code = 0; // 초기화한다.
        str = "";
    }
}

// 첫 번째 모스 부호에 대한 동작
void act1() {
    hamster.wheels(-30);
    delay(1000);
    hamster.wheels(-30, 30);
    delay(1000);
    hamster.stop();
}

// 두 번째 모스 부호에 대한 동작
void act2() {
    hamster.wheels(-30);
    delay(1000);
    hamster.wheels(30, -30);
    delay(1000);
    hamster.stop();
}

void run() {
    int tick = 0;
    while(true) {
        if(hamster.light() < 10) { // 어두우면
            if(tick > 0) {
                code *= 10;
                if(tick > 40) { // 밝은 시간이 길다.
                    code += 2;
                    str += '-';
                } else { // 밝은 시간이 짧다.
                    code += 1;
                    str += '.';
                }

                // 모스 부호 확인
                println(str);
                if(code == 1221) { // .--.
                    code = 0;
                    str = "";
                    act1();
                } else if(code == 2112) { // -..-
                    code = 0;
                    str = "";
                    act2();
                }
            }
            tick = 0;
        } else if(hamster.light() > 20) { // 밝으면
            ++ tick;
        }

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

두 대의 햄스터 로봇을 서로 마주 보게 하여 뽀뽀하듯 가까이 붙여 놓습니다. 작성한 코드를 각자 실행하고, 두 번째 햄스터 로봇이 모스 부호를 받을 준비가 되면 키보드의 키를 눌러 모스 부호를 전달하도록 합시다.

다양한 모스 부호를 만들어 친구에게 비밀스러운 명령을 전달해 봅시다.
엉덩이 치면 앞으로 가기
햄스터 로봇의 3축 가속도 센서 좌표계는 로봇의 앞쪽 방향이 X축, 왼쪽 방향이 Y축, 위쪽 방향이 Z축의 양수 방향이며, 각각 -32768 ~ 32767의 값을 가집니다.

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

import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;

Hamster hamster;

void setup() {
    hamster = Hamster.create(this);
}

void draw() {
}

void run() {
    while(true) {
        println(hamster.accelerationX() + ", " + hamster.accelerationY() + ", " + hamster.accelerationZ());
        delay(20); // 너무 빨리 반복하지 않도록 한다.
    }
}

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

import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;

Hamster hamster;

void setup() {
    hamster = Hamster.create(this);
}

void draw() {
}

void run() {
    while(true) {
        if(hamster.accelerationX() > 2000) { // 엉덩이를 툭 쳤으면
            hamster.wheels(30); // 앞으로 이동한다.
            delay(1000);
            hamster.stop(); // 1초 후에 정지한다.
        }

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

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

import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;

Hamster hamster;

void setup() {
    hamster = Hamster.create(this);
}

void draw() {
}

void run() {
    int tick = 0;
    while(true) {
        if(hamster.accelerationZ() > -2048) { // Z축 가속도 값이 작거나 양수이면
            // 일정 시간 간격으로 삐삐삐~ 소리 낸다.
            ++ tick;
            if(tick <= 10) { // 0.2초까지
                hamster.buzzer(1000);
            } else if(tick <=20) { // 0.4초까지
                hamster.buzzer(0);
            } else {
                tick = 0;
            }
        } else { // 넘어진 것이 아니면
            hamster.buzzer(0);
            tick = 0;
        }

        delay(20); // 너무 빨리 반복하지 않도록 한다.
    }
}
시소 놀이
다음 그림과 같이 얇은 판을 연필이나 볼펜 위에 올려 시소처럼 움직이는 경사로를 만듭니다. 미로판의 검은색 바닥판 한 장을 얇은 판으로 사용하여도 됩니다. 햄스터 로봇이 경사로를 올라갈 수 있도록 한 쪽 끝에 올려 놓습니다.

햄스터 로봇의 X축 가속도 값을 관찰해 보면 중력이 아래쪽으로 작용하기 때문에 수평으로 놓여진 경우에는 아주 작은 값을 가집니다. 경사로를 내려갈 때는 X축 가속도 값이 양수 값으로 절대치가 커지고, 경사로를 올라갈 때는 음수 값으로 절대치가 커집니다.

수평으로 놓여진 경우 경사를 내려갈 때 경사를 올라갈 때

관찰 결과를 바탕으로 시소 놀이를 만들어 봅시다. 햄스터 로봇이 경사로를 올라가서 중앙을 넘어가면 햄스터 로봇의 무게 때문에 얇은 판의 앞쪽이 시소처럼 아래로 기울어집니다. 이 때문에 햄스터 로봇의 X축 가속도 값이 바뀌게 되고 이를 감지하여 햄스터 로봇이 뒤로 이동하게 합니다. 뒤로 이동하면서 중앙을 넘어가면 얇은 판의 뒤쪽이 아래로 기울어집니다. 이를 감지하여 다시 앞으로 이동하는 것을 반복하게 해봅시다.

import org.roboid.runtime.*;
import org.roboid.hamster.*;
import org.roboid.robot.*;

Hamster hamster;

void setup() {
    hamster = Hamster.create(this);
}

void draw() {
}

void run() {
    int accX;
    while(true) {
        accX = hamster.accelerationX(); // X축 가속도 값
        if(accX > 1500) { // 앞쪽이 아래로 기울어졌다.
            hamster.wheels(-30); // 뒤로 이동한다.
        } else if(accX < -1500) { // 뒤쪽이 아래로 기울어졌다.
            hamster.wheels(30); // 앞으로 이동한다.
        }

        delay(20); // 너무 빨리 반복하지 않도록 한다.
    }
}
목차
수업 자료 내려 받기
수업 준비
  1. 하드웨어 살펴보기
  2. 햄스터 · 햄스터S · USB 동글 PDF · PPT
  3. 소프트웨어 설치 (설치 파일을 내려 받은 경우)
  4. PDF · PPT
  5. 소프트웨어 설치 (라이브러리 파일을 내려 받은 경우)
  6. PDF · PPT
  7. 로봇과 컴퓨터 연결
  8. PDF · PPT
  9. 소프트웨어 실행
  10. PDF · PPT
  11. 환경 설정
  12. PDF · PPT
프로세싱 기초
  1. 도형 그리기
  2. 애니메이션
  3. 마우스와 키보드 이벤트
햄스터 기초
  1. 코드의 기본 형태 만들기
  2. 클라우드 컴퓨터 환경에서 작업하기 (선택 사항)
  3. 말판 이동하기 #1 (순차, 횟수 반복)
  4. 이동하고 회전하기
  5. LED 켜고 소리 내기
  6. 순서대로, 반복하여 명령하기
  7. 키보드 이벤트
  8. 근접 센서 사용하기
  9. 말판 이동하기 #2 (~인 동안 반복)
  10. 바닥 센서 사용하기
  11. 밝기 센서와 가속도 센서 사용하기
  12. 브레이튼버그의 로봇
햄스터 심화
  1. 보드 게임 만들기
  2. 그래픽 인터페이스
  3. 센서 한 개를 사용한 라인 트레이서
  4. 센서 두 개를 사용한 라인 트레이서
  5. 햄스터 친구 따라가기 (2인 1조)
  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)에게 연락하세요.