2017-05-16 3 views
0

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++; 
} 
+0

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

+0

Ich habe "previousMillis = currentMillis;" Aber es macht keinen Unterschied .. :( – Redlight150

+0

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

Antwort

0

Ich weiß nicht viel über Klänge zu erzeugen, aber es scheint, wie Sie hier Multitasking ausführen möchten.

Es kann durch Verwendung von ISR (Interrupts) erhalten werden. Wenn Sie den Code für Sound arbeiten können, ist ein ISR mit Stepper-Code alles was Sie brauchen. ISR wird unabhängig von Ihrer aktuellen Operation ausgeführt (einige Ausnahmen gelten). In dieser Funktion können neue Bitwerte in Schritt-Ausgangsports geschrieben werden, und die Interruptfrequenz kann sehr hoch sein, um die Geschwindigkeit des Motors zu variieren.

Lesen here über die Verwendung von Interrupt in Arduino, ist es eine gut geschriebene und sehr nützliche Bibliothek.

+0

Danke für die Antworten, schaue jetzt in PWM und Interrupts – Redlight150