나는이 질문을 이미 물었지만 아직도 잘못되고 있는지 확실하지 않습니다.
목표는 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++;
}
적어도 게시 한 코드에서 (나는 뭔가를 놓치지 않는 한'previousMillis'를 업데이트하지 않습니다. Arduino를 모른다는 것입니다.)'if' 만 한 번만 가져옵니다. 그리고 E5 (그것은 사각 파인 경우 꽤 높은 끔찍한 버즈)에 영구적 인, 흠 잡을 데없는 (아마도 짜증나는 사각 파). – Linuxios
"previousMillis = currentMillis;"를 추가했습니다. 그러나 차이는 없습니다. : ( – Redlight150
타이밍을 왜곡하지 않고 소리를 생성하고 (정확히 정확한 구형파 여야 함) 중간에 뭔가를하려면, 생성 할 PWM을 확실히 조사해야합니다 소프트웨어가 아닌 하드웨어의 구형파. (정확히'tone() '이 정확히 무엇인지는 모르겠다.) – tofro