프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

동전에 반응하는 저금통 만들기

2014-09-01 13:11:39

개요

평소에는 무표정한 얼굴과 찡그린 얼굴을 반복하다가
동전을 넣으면 LEDmatrix를 통해 웃는 얼굴과 하트를 나타내고, 피에조센서를 통해 소리를 출력하는 저금통을 만들어 보자.




원리를 간단히 설명하면 적외선 장애물 감지 센서가 떨어지는 동전을 인식하면
LEDmatrix의 상태와 피에조부저의 상태를 변경시켜 떨어지는 동전에 반응하는 것처럼 보이게 한다.


동영상

필요한 사전지식

8x8 LEDmatrix
적외선 장애물 감지 센서
피에조 부저
I2C 통신



부품 목록

NO 부품 이름 수량 상세정보
1 아두이노 보드 1  
2 브레드 보드 1  
3 8x8LEDmatrix 1 adafruit
4 적외선 장애물 감지 센서 1  
5 피에조 부저 1  
6 케이블 15~20  

부품 이름 아두이노 보드 브레드 보드 8x8LEDmatrix
부품 사진
부품 이름 적외선 장애물 감지 센서 피에조 부저 케이블
부품 사진

하드웨어 making

브레드 보드



전자회로도



만드는 방법


저금통으로 쓸 상자를 준비한다.
상자의 크기는 적외선 장애물 감지 센서가 반대쪽 면을 장애물로 인식하지 않을 거리만큼의 크기로 준비한다.




상자에 LEDmatrix를 넣을만한 크기의 공간과 상자 윗부분에 동전을 넣을 구멍을 칼로 잘라 만든다.




상자 옆면 뚫어놓은 구멍에 8x8LEDmatrix를 넣어 설치한다.




내부에 아두이노와 적외선 장애물 감지 센서, 피에조부저를 설치 한다.




소스를 아두이노에 업로드 하고 뚜껑을 닫아주면 저금통 완성



소프트웨어 coding

#include <Wire.h>
#include <core_build_options.h>
#include <swRTC.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978
 
#define melodyPin 9 //멜로디를 출력하는 피에조부저의 핀번호를 9번으로 설정

int melody[] = { //슈퍼마리오 멜로디 음계
  NOTE_E7, NOTE_E7, 0, NOTE_E7,
  0, NOTE_C7, NOTE_E7, 0,
  NOTE_G7, 0, 0,  0,
  NOTE_G6, 0, 0, 0,
};
//Mario main them tempo
int tempo[] = { //멜로디의 템포
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
};

Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix(); //8x8LEDmatrix 객체 생성

swRTC rtc;

int Sensor = 3; // 3번 핀을 적외선 장애물감지 센서핀으로 설정
int val ;//Val은 센서의 상태를 저장하는 변수
void setup() { Serial.begin(9600); Serial.println("8x8 LED Matrix Test"); rtc.stopRTC(); rtc.setTime(0,0,0); //시간, 분, 초 초기화 rtc.setDate(1, 1, 2014); //day, month, year 초기화 rtc.startRTC(); pinMode(9, OUTPUT); //피에조 부저 핀을 OUTPUT모드로 설정 pinMode (Sensor, INPUT) ;// 적외선 장애물 감지 센서 핀을 OUTPUT모드로 설정 matrix.begin(0x70); }
//8x8LEDmatrix 도트 무늬 배열 static const uint8_t PROGMEM smile_bmp[] = { B00111100, B01000010, B10100101, B10000001, B10100101, B10011001, B01000010, B00111100 }, neutral_bmp[] = { B00111100, B01000010, B10100101, B10000001, B10111101, B10000001, B01000010, B00111100 }, frown_bmp[] = { B00111100, B01000010, B10100101, B10000001, B10011001, B10100101, B01000010, B00111100 }, love_bmp[] = { B00000000, B01000010, B00100100, B01000010, B00000000, B01000010, B00111100, B00000000 }, i_bmp[] = { B11111111, B00000000, B11111111, B00000000, B11111111, B00000000, B11111111, B00000000 }, j_bmp[] = { B00000000, B11111111, B00000000, B11111111, B00000000, B11111111, B00000000, B11111111 }, heart_bmp[] = { B00000000, B01100110, B11111111, B11111111, B11111111, B01111110, B00111100, B00011000 }; void loop() { int val = digitalRead (Sensor); //장애물 감지 센서로 부터 값을 입력 받음 if (val == HIGH) //값이 없을 경우 { Serial.println(rtc.getSeconds()); if(rtc.getSeconds()%10 > 5) { //5초 간격으로 찡그린 얼굴과 무표정한 얼굴을 반복 matrix.clear(); matrix.drawBitmap(0, 0, frown_bmp, 8, 8, LED_RED); matrix.writeDisplay(); delay(10); } else { matrix.clear(); matrix.drawBitmap(0, 0, neutral_bmp, 8, 8, LED_YELLOW); matrix.writeDisplay(); delay(10); } }
//동전이 떨어지는것을 감지했을 경우 else { sing(1); //피에조 센서로 슈퍼마리오 사운드 출력 for(int i=0; i<4;i++) { //웃는 얼굴과 하트를 4번 반복 matrix.clear(); matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_GREEN); matrix.writeDisplay(); delay(500); matrix.setRotation(0); matrix.clear(); matrix.drawBitmap(0, 0, heart_bmp, 8, 8, LED_RED); matrix.writeDisplay(); delay(500); matrix.clear(); matrix.drawBitmap(0, 0, heart_bmp, 8, 8, LED_YELLOW); matrix.writeDisplay(); delay(500); matrix.setRotation(0); } } matrix.setRotation(0); } void sing(int s) { int size = sizeof(melody) / sizeof(int); //멜로디의 길이 for (int thisNote = 0; thisNote < size; thisNote++) { //멜로디의 길이만큼 반복해서 출력 int noteDuration = 1000 / tempo[thisNote]; buzz(melodyPin, melody[thisNote], noteDuration); //슈퍼마리오 멜로디를 출력 int pauseBetweenNotes = noteDuration * 1.30; //딜레이를 통해 멜로디의 빠르기를 조절 delay(pauseBetweenNotes); buzz(melodyPin, 0, noteDuration); //멜로디 off } }
//피에조 부저에 입력한 박자와 피치만큼 소리를 출력하는 함수 void buzz(int targetPin, long frequency, long length) { long delayValue = 1000000 / frequency / 2; //주파수만큼 딜레이를 발생시켜서 소리 높낮이를 조절 long numCycles = frequency * length / 1000; for (long i = 0; i < numCycles; i++) { //멜로디의 길이 만큼 반복해서 출력 digitalWrite(targetPin, HIGH); //피에조부저에 HIGH신호를 주어 소리를 발생시킴 delayMicroseconds(delayValue); //딜레이를 주어 소리의 높낮이를 조절 digitalWrite(targetPin, LOW); //피에조부저에 LOW신호를 주어 소리발생을 중지시킴 delayMicroseconds(delayValue); //딜레이를 주어 소리의 높낮이를 조절
} }

소스를 실행시키기 전에 8x8LEDmatrix의 외부라이브러리가 필요하다
8x8 LEDmatrix <- 이 링크를 통해 외부라이브러리를 미리 설치해야 8x8 LEDmatrix을 사용할 수 있다.

8x8LEDmatrix는 아두이노와 I2C통신을 통해 제어하고 입력한 배열을 통해 dot무늬를 출력한다.

적외선 감지 센서는 loop를 통해 감지되는 물체가 있는지 없는지 판별한다.
동전이나 지폐를 감지할 경우 if문을 통해 조건에 맞는 명령문을 실행한다.




아무런 물체가 감지되지 않을 경우에는 swRTC를 사용하여 5초 간격으로 LEDmatrix에 얼굴을 무표정과 찡그림을 반복하도록 하였다.

물체가 감지 될 경우에는 준비된 웃는 얼굴과 하트를 반복해서 출력하며 
피에조 부저에서는 만들어 놓은 슈퍼마리오 음계를 정해진 박자에 따라 출력한다.
피에조부저는 각 소리출력에 microDelay를 주어서 소리의 높낮이를 조절한다.

기술문서

  • 부품목록
  • 회로도
  • 브레드보드 레이아웃
  • 스케치

수박쨈

아두이노, 8x8 LED matrix, 적외선 장애물 감지 센서, 피에조 부저, I2C 통신, 초급