Ich habe diese Frage bereits gestellt, bin mir aber immer noch nicht sicher, wo ich falsch liege.
Das Ziel ist es, eine Verzierung durch einen 5v Schrittmotor drehen zu lassen, und Musik gleichzeitig spielen zu lassen, so kann ich Verzögerung nicht verwenden. Dieses Projekt ist zeitkritisch, aber es ist persönlich (keine Art von Bewertung). Was ich versuche zu sagen ist, normalerweise würde ich mir Zeit nehmen und wissen wollen, wie es funktioniert, aber ich muss es nur bekommen dieser geht - es gibt Leute, die es sehen wollen, bevor ich aus meiner derzeitigen Unterkunft ausziehe.Arduino Music Box
Ich habe einen Teil des Codes kommentiert, damit ich mich darauf konzentrieren kann, den Sound zuerst zu bearbeiten. Hier ist der Code so weit .... Einfach nur schrecklich Summen bekommen aber:
//#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++;
}
Zumindest in dem Code, den Sie gepostet haben, aktualisieren Sie 'previousMillis' nicht (es sei denn, ich vermisse etwas - ich kenne Arduino nicht), was dazu führen würde, dass das' if' nur einmal genommen wird und eine fortwährende, dröhnende (wahrscheinlich irritierende Rechteckwelle) auf E5 (was ein ziemlich hohes, schreckliches Summen ist, wenn es eine Rechteckwelle ist). – Linuxios
Ich habe "previousMillis = currentMillis;" Aber es macht keinen Unterschied .. :( – Redlight150
Wenn Sie Sound erzeugen wollen (was eine ziemlich genaue Rechteckwelle sein muss) und etwas dazwischen tun, ohne das Timing zu verzerren, sollten Sie definitiv in PWM schauen, um zu generieren die Rechteckwelle in Hardware und nicht als Software (nicht sicher, was 'tone()' genau tut) – tofro