크리스마스 대비! 3D프린터와 네오픽셀, 부저를 이용한 캐럴연주하기 [아두이노 작품]
페이지 정보
작성자 메카 작성일16-03-17 18:52 조회4,591회 댓글0건관련링크
본문
본 예제는 납땜이 필요한 예제임을 앞서 밝힙니다.
크리스마스에 적합한 프로젝트를 준비했습니다.
네오픽셀과 아두이노, 부저만 있으면 재미있고 아기자기한 크리스마스를 보낼 수 있습니다!
(동영상)
촬영을 위해 망설임없이 협조해주신 포켓몬 친구들께 감사를 표합니다.( 쓸모없었지만... )
확실히 실물이 훨~~씬 좋습니다! 영상으로 찍으니 별로네요..
간단히 설명드리자면 tone이라는 함수를 응용하여 캐럴을 연주하고,
크리스마스 하면 빠질 수 없는 크리스마스 트리를 3D프린터로 뽑은 후
캐럴에 맞춰 네오픽셀이 켜졌다 꺼졌다 합니다 !
우선! 본론으로 들어가기 전에 네오픽셀에 대해 알아보겠습니다.
네오픽셀이란?
네오픽셀은 LED 제품으로 단일로도 사용할 수 있고 여러 개를 한 번에 제어할 수도 있습니다.
몇 개를 사용하던 한 개의 디지털 핀으로 모두 제어할 수 있으며, 굽히거나 접는 등 여러 모양을 만들 수 있고,
유연하며 사용법이 쉽기에 초보자도 간단히 사용할 수 있습니다.
또, 현재 모든 네오픽셀은 Abafruit의 라이브러리로 통합되어 있어 다른 제품이라도 호환이 됩니다.
위 사진을 보시면 알 수 있겠지만, 각각의 네오픽셀이 붙어있습니다.
또, 제품을 유심히 보시면 화살표 방향이 되어있는데, 그 방향에 맞추어 네오픽셀을 연장할 수도 있고,
필요 없으면 잘라내어 필요한 부분만 사용할 수도 있습니다.
네오픽셀에는 3개의 LED가 내장되어있습니다.
빨강 파랑 초록의 LED가 내장되어있는데 각각의 LED 밝기에 따라 빛의 색이 결정됩니다.
원하시는 색의 빛을 내고 싶으실 땐, 빛의 3원색을 참고하여 빛의 색을 만들어 내시면 됩니다.
작품 만들기
준비물 : 아두이노우노 , 미니 브레드보드 , 네오픽셀 5개 , 다량의 점퍼선 , 부저 , 테이프 또는 글루건,
네오픽셀을 덮을 속이 비어있고 색이 다른 통 5개
( 해당 예제에선 3D 프린터 작품 사용)
(저희가 판매하는 준비물을 클릭하시면 구매 사이트로 이동)
(↑회로도↑)
이번에 사용할 네오픽셀은 5개입니다.
위 사진과 같이 점퍼선으로 각각을 납땜하여 회로도의 네오픽셀에 해당하는 부분에 연결해줍니다.
3D 프린터를 사용하여 색이 다른 나무 5개를 뽑아줍니다.
( 가장 많은 시간이 소요됨 )
본래는 LED를 끼우지만 네오픽셀로 더 밝으며 각각의 빛을 내도록 하였습니다.
( 색이 다른 플라스틱 통으로 대체하셔도 무관합니다! )
그다음 나무에 네오픽셀을 붙여줍니다.
부저까지 끼워주면 완성!
소스 코드
//라이브러리와 소스파일은 첨부하였습니다.
int speakerPin = 5;
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUMPIXELS 5
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int length = 51; // 노래의 총 길이 설정
char notes[] = "eeeeeeegcde fffffeeeeddedgeeeeeeegcde fffffeeeggfdc"; // 음계 설정
int beats[] = { 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 4,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 4,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4}; // 해당하는 음이 울리는 길이 설정
int tempo = 200; // 캐럴이 연주되는 속도
void playTone(int tone, int duration)
{
for (long i = 0; i < duration * 1000L; i += tone * 2)
{
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tone);
}
for(int c = 0; c< 5;c++)
{
//digitalWrite(c,LOW);
pixels.setPixelColor(c, pixels.Color(0,0,0));
}
pixels.show();
}
void playNote(char note, int duration)
{
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; //음계 함수 설정
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; // 음계 톤 설정
switch(note)
{
case 'c': pixels.setPixelColor(0, pixels.Color(255,0,0)); break;
case 'd': pixels.setPixelColor(1, pixels.Color(0,0,255)); break;
case 'e': pixels.setPixelColor(2, pixels.Color(255,255,0)); break;
case 'f': pixels.setPixelColor(3, pixels.Color(0,255,0)); break;
case 'g': pixels.setPixelColor(4, pixels.Color(255,255,255)); break;
}
pixels.show();
for (int i = 0; i < 8; i++)
{
if (names[i] == note)
{
playTone(tones[i], duration);
}
}
}
void setup()
{
pinMode(speakerPin, OUTPUT);
pixels.begin();
}
void loop() {
for (int i = 0; i < length; i++)
{
if (notes[i] == ' ')
{
delay(beats[i] * tempo); // rest
}
else
{
playNote(notes[i], beats[i] * tempo);
}
delay(tempo / 10);
}
delay(500);
}
댓글목록
등록된 댓글이 없습니다.
최신댓글