초보자를 위한 아두이노 코딩 입문-15: 스타워즈 송과 함께 번쩍이는 LED(사운드 동영상 업데이트)

in #kr6 years ago (edited)

그림_01.png

1970년대 말경에 상영된 해리슨 포드 주역의 추억의 영화 스타워즈의 주제가 송 코드를 복사하여 들어보자. 음악을 듣는 청취자의 나이가 어릴수록 좋을 듯하다.
회로 배선은 그다지 복잡하지 않다, 스피커는 GND 와 디지털 데이터 핀 9번에 연결하자. LED 는 번걸아 가면서 켜지므로 전류 제한 저항 220Ω 1개면 족하다. 즉 청색 LED 와 빨간색 LED를 병렬로 연결하도록 하고 그 끝은 디지털 데이터 핀 2번과 3번에 연결하도록 한다. 각자의 필요에 맞춰 12번과 13에 배선해도 무방하다. 단 코드에서 정수형 변수 ledPin1 과 ledPin2 의 값을 그에 맞춰 설정하면 된다.

그림_02.png

아래의 사진은 LED 가 12번과 13번에 배선된 사례이다. 하지만 첨부된 코드는 위 배선도를 참고로 하여 2번과 3번 핀으로 설정하였음에 주의하면 된다.

그림_03.png

지난번 코딩과의 차이점은 별도로 계명 파일을 만들지 않고 필요한 계명 데이터를 헤더 부분에 상수형 정수로 설정해버렸다. 원래는 부저용으로 코딩된 듯 한데 필자가 8옴 스피커 버전으로 돌려 보았더니 소리가 웅장한(?) 듯하다. 스피커를 만지면 약간 전기적인 느낌이 올 정도이니 놀래지 않도록 하자.

각자 해보기 전에 다음 동영상을 참고로 보면서 음악과 LED 번쩍임과의 발란스를 스스로 느껴 보도록 하자.

슈퍼 마리오 송을 감상하시려면 아래 블로그로 이동하세요.
초보자를 위한 아두이노 코딩 입문-17: Super Mario 송과 함께 번쩍이는 화려한 LED
https://steemit.com/kr/@codingart/17-super-mario-led

멜로디 코딩에 관해서는 지난번 클레멘타인 연주 블로그를 팜조하기 바란다.
초보자를 위한 아두이노 코딩 입문-13: 클레멘타인 멜로디 톤 연주
https://steemit.com/kr/@codingart/12

toneMelody_star_wars

const int c = 261;
const int d = 294;
const int e = 329;
const int f = 349;
const int g = 391;
const int gS = 415;
const int a = 440;
const int aS = 455;
const int b = 466;
const int cH = 523;
const int cSH = 554;
const int dH = 587;
const int dSH = 622;
const int eH = 659;
const int fH = 698;
const int fSH = 740;
const int gH = 784;
const int gSH = 830;
const int aH = 880;

const int buzzerPin = 9;
const int ledPin1 = 2;
const int ledPin2 = 3;

int counter = 0;

void setup()
{
//Setup pin modes
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
}

void loop()
{

//Play first section
firstSection();

//Play second section
secondSection();

//Variant 1
beep(f, 250);
beep(gS, 500);
beep(f, 350);
beep(a, 125);
beep(cH, 500);
beep(a, 375);
beep(cH, 125);
beep(eH, 650);

delay(500);

//Repeat second section
secondSection();

//Variant 2
beep(f, 250);
beep(gS, 500);
beep(f, 375);
beep(cH, 125);
beep(a, 500);
beep(f, 375);
beep(cH, 125);
beep(a, 650);

delay(650);
}

void beep(int note, int duration)
{
//Play tone on buzzerPin
tone(buzzerPin, note, duration);

//Play different LED depending on value of 'counter'
if(counter % 2 == 0)
{
digitalWrite(ledPin1, HIGH);
delay(duration);
digitalWrite(ledPin1, LOW);
}else
{
digitalWrite(ledPin2, HIGH);
delay(duration);
digitalWrite(ledPin2, LOW);
}

//Stop tone on buzzerPin
noTone(buzzerPin);

delay(50);

//Increment counter
counter++;
}

void firstSection()
{
beep(a, 500);
beep(a, 500);
beep(a, 500);
beep(f, 350);
beep(cH, 150);
beep(a, 500);
beep(f, 350);
beep(cH, 150);
beep(a, 650);

delay(500);

beep(eH, 500);
beep(eH, 500);
beep(eH, 500);
beep(fH, 350);
beep(cH, 150);
beep(gS, 500);
beep(f, 350);
beep(cH, 150);
beep(a, 650);

delay(500);
}

void secondSection()
{
beep(aH, 500);
beep(a, 300);
beep(a, 150);
beep(aH, 500);
beep(gSH, 325);
beep(gH, 175);
beep(fSH, 125);
beep(fH, 125);
beep(fSH, 250);

delay(325);

beep(aS, 250);
beep(dSH, 500);
beep(dH, 325);
beep(cSH, 175);
beep(cH, 125);
beep(b, 125);
beep(cH, 250);

delay(350);
}//끝

Sort:  

오! 아두이노 포스트 반갑습니다.
kr-arduino 태그 쓰는 분이 현재 저 혼자지만 남았지만요 가끔 한두분씩 쓰시긴 하는데 활성화가 참 필요한 부분이네요. 태그자리 있으면 이 태그도 써서 활성화 해요.

한가지 포스트에서 추천드릴 부분은 beep()함수가 엄청 중복되잖아요.
두개의 인자값을 배열로 빼고 for문으로 돌리시면 코딩이 엄청 줄어들어서 그러면 더 많은 것들을 표현 하실 수 있을꺼에요.

녜 정확한 지적입니다. 클레멘타인은 코딩 과제였지만 한편 이번 코딩은 남이 짠 오픈소스라 그대로 두었고 단지 LED 배선을 연습해보는 정도로 포스팅해 보았습니다. 아울러 LED 조명의 점멸과 사운드가 함께 맞아 떨어져야 하는 과제입니다. 감사합니다.

오픈소스였다면 약간 수정하는 것이 좀 애매하셨을 수도 있었겠네요.
그리고 재밌는 주제였네요. LED 조명과 사운드가 함께 동작하게 하는 것이요.
네오픽셀과 연동해서 LED 점멸에서 소리의 높이를 같이 출력해보고 싶어지네요.
뭔가 재밌는 소재가 있으면 그걸 다른 출력장치로 표현해보고 싶어지네요

녜 약간 유치할수도 있지만 아두이노 해보는 요런 재미도 있는듯 합니다.

방금 가상시뮬레이터로 급조해서 한번 만들어 봤네요.
월요일날 이거나 포스팅 해볼까 고민해 봐야겠어요.
https://www.tinkercad.com/things/bGV7gIB6SWL
출처는 @codingart 포스트 아이디어를 인용해서요.
암튼 재미있네요.
재밌는 포스트 많이 올려주세요
같이 재밌는 것들을 만들어 보게요.

이 분야가 나름 재미 있습니다. 좀 진도를 나가게되면 와이파이라든지 블루투스 씽스픽 앱인벤터 라즈베리까지 단계별로 올려 나갈 계획입니다.

아 참 kr-arduino 태그 있으면 담번부터 반영햐 하겠습니다. 정보 감사합니다.

Coin Marketplace

STEEM 0.26
TRX 0.13
JST 0.031
BTC 61372.29
ETH 2888.95
USDT 1.00
SBD 3.62