메이커 커뮤니티

HUNGRYBOT 만들기
작성자 : 메이크존 등록일 : 2015-11-18 조회수 : 971
Step 1 : 개요

Step

출처 : http://makezone.co.kr/blog/2014/08/14/07hungrybot/


색깔을 인지하고 반응하는 HungryBot


 이미지

이번에는 3D프린터와 아두이노를 이용한 장난감 로봇을 만들어 볼거에요.

컬러센서를 이용해서 색을 인지하고 8×8 matrix led 를 이용해서 반응하는 아두이노 로봇입니다.

 

로봇에게 간식을 주면 각각의 간식마다 다른 반응을 보여주는,

마치 나와 소통하는것 같은 로봇을 만드는것이 이번 실습의 컨셉이에요.

 

아두이노에서 제일 기초적인 아두이노 우노를 사용하고 납땜 대신 점퍼선과 미니 브레드보드를 이용해 센서들을 연결하여

 초보자도 쉽게 만들 수 있을거에요! 

Step 2 : 준비물 – 1 (전자부품)

Step

이미지

 

이미지

 

미니브레드보드와 led의 색은 다양한 종류가 있으니 원하시는 색을 ​사용하면 됩니다.

Step 3 : 준비물 – 2 (출력물)

Step

3D 프린터로 케이스 출력하기

 

STL 파일 다운받기Click


이미지

 

이미지


 


사용한 3d프린터는 Peanut 3D 프린터이며, 필라멘트는 PLA소재의 natural 컬러를 사용하였습니다.

 

Step 4 : 회로도

Step

회로도 구성

이미지

 

로도 구성과 실제 연결 모습!!

 

이미지

Step 5 : 조립과정

Step

 

연결과 조립에 앞서 Led Matrix를 납땜해야합니다. 방법은 아다푸르트 사이트를 참조하세요.


 


1. led matrix에 암-수 점퍼선을 연결합니다 (+ : 파랑/ – : 검정)

 

이미지

 

2. led matrix와 아두이노 우노를 연결합니다 (D : A4 / C: A5)

( + 와 -는 브레드 보드에 연결할 것이기 때문에 아두이노에는 연결하지 않습니다!)

 

이미지 

 

3. Led Matrix와브레드보드를연결합니다.

 

 

 이미지

 

4. 아두이노에 점퍼선들을 연결해줍니다. 새로 연결한 선들은 컬러센서와 연결될거에요.

디지털핀 2~6번과 3V핀에는 암-수 점퍼선을 연결하시고 5V와 Gnd핀에는 수 점퍼선을 연결합니다.

 

이미지

 

 

5. 아두이노에 연결했던 선들 중 5V, Gnd핀에 연결했던 점퍼선을 브레드보드에 연결합니다.
(led matrix와 연결된 선들과 색상을 맞추어주면 알아보기 쉬워요!) 

 

 

 이미지

 


6. led matrix와 컬러센서에서 연결한 선들을 이어줄 차례에요.
브레드보드위에서 라인을 맞추어 전선을 꽂아 각 센서와 연결된 점퍼선들을 이어주고

 

 

같은 라인에 수 점퍼선을 각각 하나씩 더 꽂아주세요.
이 선들은 나중에 컬러센서와 연결될 선들입니다

 

이미지 

 

 

7. ​연결이 모두 끝났으면 이제 케이스 안에 센서들을 집어넣을 차례입니다.
연결해둔 점퍼선들이 빠지지 않게 조심하며 Led Matrix를 위치에 맞게 먼저 끼워넣어주세요.

 

이미지 

 

8. ​Led Matrx를 집어넣은 후엔 아두이노를 몸체 바닥면에 밀어넣어줍니다.
아직 센서와 연결되지 않은 점퍼선들은 밖으로 빼서 가지런히 정리해주세요.

이미지

 

 

9. ​몸통케이스 안에 Led Matrix와 아두이노를 모두 집어넣은 후엔 컬러감지센서를 머리 케이스안에 넣어줍니다.

 

이미지

 

 

10. 컬러센서에 점퍼선들을 연결할 차례입니다. 몸통위에 목 파츠를 올려주세요. 
(목파츠는 외관상 예쁘게 보이기 위한 절차이니 생략하셔도 됩니다.) 

 

 

이미지

 

 

11. 아두이노에 연결했던 선들을 컬러센서와 연결합니다. 안쪽에있는 선들부터 연결해줄거에요. 
선들을 목의 구멍으로 빼내서 센서와 연결하시면 됩니다. 
5V – VDD (파랑) / GND – GND (검정) / 3.3V – LED (흰색) 

 

 이미지

 

 

12. 이번엔 바깥쪽에 있는 선들을 컬러센서와 연결해줄 차례입니다. 
A2 – OUT (주황) / A3 – S0 (초록) / A4 – S1 (왼쪽 파랑) / A5 – S2 (흰색) / A6 – S3 (오른쪽 파랑) 

 

 

이미지

 

 

13. 컬러센서와의 연결도 모두 끝나면 머리를 목위에 올려놓고 정리합니다. 
(머리파츠에서 빠져나온 점퍼선 연결부분을 몸통의 구멍에 맞게 끼워주시면 됩니다.) 

 

 

이미지

 

14. 몸통케이스의 뚜껑에 브레드보드를 부착시켜주세요. 

 

이미지

 

 

15. 브레드보드를 부착시킨 뚜껑을 몸통에 맞추어 잘 닫아주고, 로봇의 팔, 다리 그리고 눈을
각각 알맞은 자리에 끼워 넣어 준 뒤 마지막으로 머리 뚜껑까지 닫으면 완성입니다!  

이미지

 

Step 6 : 하드웨어 코딩

Step

01. 라이브러리 폴더 넣어 주기 

먼저 두 가지의 라이브러리 파일을 다운받아 아두이노의 libraries폴더에 넣어주셔야 합니다.

Adafruit GFX Library master Adafruit LED Backpack Library master 폴더를 넣어주시면 됩니다.

 

라이브러리 다운로드 링크1 Click! 

라이브러리 다운로드 링크2 Click!

 이미지

 

 

Download ZIP을 클릭하여 다운받고 압축을 푸신 후에
아두이노가 설치된 폴더 안의 libraries폴더 혹은 내문서(내 도큐멘트) 안에 있는 libraries폴더 안에 넣어주시면 됩니다. 

 

 

이미지

 

02. 소스코드 입력하여 실행하기 

 //update 2014.10.16

//Hungrybot by Makezone

 

// Length of Arrays

#define MATRIX_SIZE 8

 

// Current Color State

#define NONE 0

#define RED 1

#define GREEN 2

#define BLUE 3

 

#define DELAY_COUNT 2

 

// matrix add lib

#include <Wire.h>

#include "Adafruit_LEDBackpack.h"

#include "Adafruit_GFX.h"

Adafruit_8x8matrix matrix = Adafruit_8x8matrix();

 

//color sensor var setup

int s0=3,s1=4,s2=5,s3=6;

int flag=0;

int counter=0;

int countR=0,countG=0,countB=0;

 

int state; // Current color state

int prevState; // Previous color state

 

int count; // Matrix animation count

int value; // Compare max color value

 

// 컬러센서에서 빨간색이 들어왔을 때의 화면 설정입니다.

// 각 각의 0과 1이 꺼지고 켜짐을 나타내며

// {}안의 값이 출력되는 영상의 하나의 프레임이라고 생각하시고 수정하시면 됩니다.

 

//빨간색을 입력 받았을 때의 반복되는 화면입니다.

const uint8_t PROGMEM heart[][MATRIX_SIZE] = {

  {

    B00000000,

    B01100110,

    B11111111,

    B11111111,

    B01111110,

    B00111100,

    B00011000,

    B00000000 }

  ,

  {

    B00000000,

    B00100100,

    B01111110,

    B01111110,

    B00111100,

    B00011000,

    B00000000,

    B00000000 }

}

;

//녹색을 입력 받았을 때의 반복되는 화면입니다.

const uint8_t PROGMEM monster[][MATRIX_SIZE] = {

  {

    B00000000,

    B00000000,

    B00000000,

    B00000001,

    B00000001,

    B00000001,

    B00000001,

    B00000001 }

  ,

  {

B00000000,

    B00000000,

    B00000000,

    B00000001,

    B00000001,

    B00000001,

    B00000001,

    B00000001 }

  ,

  {

    B00000000,

    B00000001,

    B00000001,

    B00000011,

    B00000010,

    B00000011,

    B00000010,

    B00000010 }

  ,

  {

 B00000001,

    B00000010,

    B00000011,

    B00000111,

    B00000101,

    B00000111,

    B00000101,

    B00000101 }

  ,

  {

    B00000100,

    B00000100,

    B00000111,

    B00001111,

    B00001011,

    B00001111,

    B00001010,

    B00001010 }

  ,

  {

    B00000100,

    B00001001,

    B00001111,

    B00011111,

    B00010110,

    B00011111,

    B00010101,

    B00010101 }

  ,  

,  

  {

    B00010010,

    B00010010,

    B00011110,

    B00111111,

    B00101101,

    B00111111,

    B00101010,

    B00101010 }

  ,

  {

    B00010010,

    B00100100,

    B00111100,

 

 

// 청색을 입력 받았을 때의 반복되는 화면입니다.

 

const uint8_t PROGMEM soso[][MATRIX_SIZE] = {

{

B00111100,

B01111110,

B11111111,

B11011011,

B11111111,

B11000011,

B01111110,

B00111100 }

,

{

B00111100,

B01111110,

B11111111,

B10110111,

B11111111,

B10000111,

B01111110,

B00111100 }

,

{

B00111100,

B01111110,

B11111111,

B01101111,

B11111111,

B00001111,

B01111110,

B00111100 }

,

{

B00111100,

B01111110,

B11111111,

B10110111,

B11111111,

B10000111,

B01111110,

B00111100 }

,

{

B00111100,

B01111110,

B11111111,

B11011011,

B11111111,

B11000011,

B01111110,

B00111100 }

,

{

B00111100,

B01111110,

B11111111,

B11101101,

B11111111,

B11100001,

B01111110,

B00111100 }

,

{

B00111100,

B01111110,

B11111111,

B11110110,

B11111111,

B11110000,

B01111110,

B00111100 }

,

{

B00111100,

B01111110,

B11111111,

B11101101,

B11111111,

B11100001,

B01111110,

B00111100 }

};

 

void setup()

{

Serial.begin(115200);

pinMode(s0,OUTPUT);

pinMode(s1,OUTPUT);

pinMode(s2,OUTPUT);

pinMode(s3,OUTPUT);

//matrix begin

matrix.begin(0x70); // pass in the address

 

state = NONE;

count = 0;

matrix.setRotation(0); // 매트릭스 초기화

 

}

void TCS()

 

{

digitalWrite(s1,HIGH);

digitalWrite(s0,LOW);

flag=0;

attachInterrupt(0, ISR_INTO, CHANGE);

timer2_init();

}

 

 

void ISR_INTO()

 

{

counter++;

}

 

void timer2_init(void)

{

TCCR2A=0x00;

TCCR2B=0x07; //the clock frequency source 1024 points

TCNT2= 100; //10 ms overflow again

TIMSK2 = 0x01; //allow interrupt

}

 

ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again.

Internal overflow interrupt executive function

{

TCNT2=100;

flag++;

 

if(flag==1)

{

counter=0;

}

 

else if(flag==2)

 

{

digitalWrite(s2,LOW);

digitalWrite(s3,LOW);

countR=counter/1.051;

digitalWrite(s2,HIGH);

digitalWrite(s3,HIGH);

}

 

else if(flag==3)

 

{

countG=counter/1.0157;

digitalWrite(s2,LOW);

digitalWrite(s3,HIGH);

}

 

else if(flag==4)

 

{

countB=counter/1.114;

digitalWrite(s2,LOW);

digitalWrite(s3,LOW);

}

else

 

{

flag=0;

TIMSK2 = 0x00;

}

counter=0;

delay(2);

 

 

 

 

// loop()안에는 아두이노 계속처리할 작업을 적어줍니다.

 

void loop()

 

{

delay(100);

 

TCS();

value = max(countR, max(countG, countB));

if(value < 6) { // None

 

state = NONE;

}

 

else if(value == countR) { // Red

state = RED;

}

 

else if(value == countG) { // Green

state = GREEN;

}

else { // Blue

state = BLUE;

}

 

if(prevState == state) { count++; }

 

else { count = 0; }

 

//화면을 바꾸기 전 화면을 초기화하는 함수

 

matrix.clear();

 

if(state == RED) {//적색이 들어왔을 때 화면을 그립니다. matrix.drawBitmap() ==>맨 위에서 수정한 0과1의 그림을 불러옵니다.

 

matrix.drawBitmap(0, 0, heart[(count / DELAY_COUNT) % (sizeof(heart) / MATRIX_SIZE)], MATRIX_SIZE, MATRIX_SIZE, LED_ON);

}

 

else if(state == GREEN) {//녹색이 들어왔을 때 화면을 그립니다.

 

matrix.drawBitmap(0, 0, monster[(count / DELAY_COUNT) % (sizeof(monster) / MATRIX_SIZE)], MATRIX_SIZE, MATRIX_SIZE, LED_ON);

}

 

else if(state == BLUE) {//청색이 들어왔을 때 화면을 그립니다.

matrix.drawBitmap(0, 0, soso[count % (sizeof(soso) / MATRIX_SIZE)], MATRIX_SIZE, MATRIX_SIZE, LED_ON);

}

 

else {

 

// NONE 아무색도 입력받지 않았을 때의 기본화면입니다.

// Matrix.print(반복되는 문자열) 입력하시면 원하는 글자가 반복됩니다.

matrix.setTextSize(1);

matrix.setTextWrap(false); // we dont want text to wrap so it scrolls nicely

matrix.setTextColor(LED_ON);

matrix.print("Hungry");

matrix.setCursor(-(count % 37), 0);

}

prevState = state;

//불러온화면을 led에 그려냅니다.

matrix.writeDisplay();

}​


Step 7 : 결론

Step

이번 강의에서는 비교적 접근이 쉬운 아두이노 우노를 이용한 로봇을 만들어 보았습니다.

컬러센서를 통하여 색상을 검출하였고, 그 값에 따라 led matrix를 제어해 보았습니다.

 

hungrybot을 발전시켜 더 다양한 색상을 검출할 수 있도록 한다던가 애니메이션의 변화를 주어 다방면으로 활용 할 수 있지 않을까요?

컬러센서와 led matrix의 조합을 통해 만들 수 있는 다양한 컨텐츠를 상상하여 프로젝트를 발전시켜봅시다!

 

 


이 콘텐츠의 저작권은 메이크존에 있습니다.