2017-05-16 9 views
0

나는이 질문을 이미 물었지만 아직도 잘못되고 있는지 확실하지 않습니다.
목표는 5v 스테퍼 모터로 회전하는 장식품을 가지고 음악을 동시에 재생하므로 지연을 사용할 수 없습니다.Arduino 오페라 오르골

이 프로젝트는 시간에 민감하지만 개인적인 것입니다 (어떤 종류의 평가도 아닙니다). 보통 말하려고하는 것은 보통 시간이 걸리고 어떻게 작동하는지 알고 싶지만, 이 하나의가는 것 - 내가 현재의 적응에서 나가기 전에 그것을보고 싶어하는 사람이있다.

나는 코드의 일부를 주석 처리 했으므로 사운드가 먼저 작동하도록 집중할 수 있습니다.

//#include <Stepper.h> 
#include <pitches.h> 
//#define STEPS_PER_MOTOR_REVOLUTION 32 

//#define STEPS_PER_OUTPUT_REVOLUTION 32 * 64 

const int tonePin = 4; 
unsigned long previousMillis = 0; 
uint8_t currentNote = 0; 
unsigned long currentMillis; 

//int ldr = A0; 

//Stepper small_stepper(STEPS_PER_MOTOR_REVOLUTION, 8, 10, 9, 11); 
//pauseBetweenNotes = noteDuration; 

void setup() { 
    // put your setup code here, to run once: 
    pinMode(tonePin, OUTPUT); 
} 

int melody[]= 
{ 
    NOTE_E5, NOTE_G5, NOTE_D6, 
    NOTE_C6, NOTE_G5, NOTE_F5, 
    NOTE_E5, NOTE_E5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_G5, 
    NOTE_E5, NOTE_G5, NOTE_D6, 
    NOTE_C6, NOTE_G5, NOTE_F5, 
    NOTE_E5, NOTE_G5, NOTE_G5,NOTE_A5, NOTE_B5, NOTE_C6, NOTE_C6, END 
}; 

int noteDuration[]= 
{ 
    8,4,12, 
    8,4,12, 
    8,4,4,4,4,12,12, 
    8,4,12, 
    8,4,12, 
    8,4,4,4,4,12,12, 
}; 

void loop() { 
    // put your main code here, to run repeatedly: 
    //small_stepper.setSpeed(200); 
    //small_stepper.step(HIGH); 

    currentMillis = millis(); 

    if(currentMillis - previousMillis >= noteDuration[currentNote]) 
    { 
    tone(tonePin, melody[currentNote], noteDuration[currentNote]); 
    previousMillis = currentMillis; 
    } 
    if(currentNote > 26-1) 
    { 
    currentNote = 0; 
    } 
    currentNote++; 
} 
+0

적어도 게시 한 코드에서 (나는 뭔가를 놓치지 않는 한'previousMillis'를 업데이트하지 않습니다. Arduino를 모른다는 것입니다.)'if' 만 한 번만 가져옵니다. 그리고 E5 (그것은 사각 파인 경우 꽤 높은 끔찍한 버즈)에 영구적 인, 흠 잡을 데없는 (아마도 짜증나는 사각 파). – Linuxios

+0

"previousMillis = currentMillis;"를 추가했습니다. 그러나 차이는 없습니다. : ( – Redlight150

+0

타이밍을 왜곡하지 않고 소리를 생성하고 (정확히 정확한 구형파 여야 함) 중간에 뭔가를하려면, 생성 할 PWM을 확실히 조사해야합니다 소프트웨어가 아닌 하드웨어의 구형파. (정확히'tone() '이 정확히 무엇인지는 모르겠다.) – tofro

답변

0

내가 소리를 생성에 대해 잘 모르겠지만, 여기에 멀티 태스킹 수행하려는 것처럼 보인다 : 여기에 그냥하지만 ​​끔찍한 윙윙를 받고 .... 지금까지 코드입니다.

ISR (인터럽트)을 사용하여 얻을 수 있습니다. 사운드 작업 코드를 얻을 수 있다면 스테퍼 코드가있는 ISR 만 있으면됩니다. ISR은 현재 작업과 관계없이 실행됩니다 (몇 가지 예외가 적용됩니다). 이 기능에서 새로운 비트 값은 스테퍼 출력 포트에 기록 될 수 있으며 모터의 속도를 변경하기 위해 매우 빈번하게 인터럽트됩니다.

arduino에서 인터럽트를 사용하는 것에 대해 here을 읽으십시오. 잘 작성되어 있고 매우 유용한 라이브러리입니다.

+0

답장을 보내 주셔서 감사합니다. 지금 PWM과 인터럽트를 살펴 보겠습니다. – Redlight150