2017-05-16 4 views
0

私は既にこの質問をしましたが、どこが間違っているのかまだ分かりません。
5vステッパーモーターで飾りをつけて、音楽を同時に演奏することを目的としているので、遅れを取ることはできません。Arduinoオルゴール

このプロジェクトは時間に敏感ですが、個人的な評価ではありません。私が言っていることは、通常は自分の時間がかかり、それがどのように機能するか知りたいのですが、この1つは行く - 私は私の現在の宿泊施設から移動する前にそれを見たい人があります。

私はいくつかのコードをコメントアウトしていますので、まずサウンドを有効にすることに集中できます。

//#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を知らない)。 E5(矩形波の場合は非常にひどい雑音である)上での永久的な、恐ろしい(おそらく刺激的な方形波)。 – Linuxios

+0

私は "previousMillis = currentMillis;"を追加しました。 しかし、それは違いはありません.. :( – Redlight150

+0

タイミングを歪ませずにサウンドを生成したい場合は(正確な方形波でなければなりません)、間違いなくPWMを生成して生成する必要がありますソフトウェアよりもむしろハードウェアの方形波(どのような 'tone()'が正確に行うのかはわかりません) – tofro

答えて

0

が、私は音を発生さについて多くを知らないが、あなたはここにマルチタスクを実行するように思える: はここだけしかしひどい耳鳴りを取得....これまでのコードです。

ISR(割り込み)を使用して取得できます。あなたが健全な作業のためのコードを得ることができるならば、ステッパーコードを備えたISRはあなたが必要とするものです。 ISRは現在の操作に関係なく実行されます(例外はほとんどありません)。この機能では、ステッパ出力ポートに新しいビット値を書き込むことができ、モータの速度を変化させるために非常に割り込み周波数を使用することができます。

arduinoで割り込みを使用すると、hereがよく書かれた非常に有用なライブラリです。

+0

返答いただき、ありがとうございます。 – Redlight150