【问题标题】:Playing music with Arduino用 Arduino 播放音乐
【发布时间】:2017-03-08 19:08:14
【问题描述】:

我尝试编写一首用 Arduino 播放的小曲,该 Arduino 连接了 6 个扬声器。这个过程应该是我在频率上打开不同的扬声器并倒计时音符的持续时间。如果持续时间结束,我会播放下一个声音或打开扬声器。我为 6 个扬声器定义了不同的阵列。我对音符频率和持续时间也有很多定义。

问题是,我只能听到低沉的嗡嗡声,而不是曲调。

有人建议代码有什么问题吗?

#define pause 0
#define c1    32.7
#define cis1  34.6
#define d1    36.7
#define dis1  38.9
...

#define l1 32
#define l2 16
...

#define note 0
#define laenge 1

int myChannels[] = { 8, 9, 10, 11, 12, 13 };
int myDuration[] = { 0, 0, 0,  0,  0,  0 };
int myPointer[] =  { 0, 0, 0,  0,  0,  0 };
const PROGMEM float myPlayList[6][600][2] = {
   // 1st Voice
   {
     { c2, l8}, { g2, l8}, { c2, l8}, { g2, l8}, { c2, l8}, { g2, l8}, { c2, l8}, { g2, l8},
     { c2, l8}, { g2, l8}, { c2, l8}, { g2, l8}, { c2, l8}, { g2, l8}, { c2, l8}, { g2, 18},
     ...
   }
};

void play( int out, float freq, float len) {
  if (freq > 0) {
    tone ( myChannels[out], freq);
  } else {
    noTone ( freq);
  }
  myDuration[ out] = len;
}

void setup() {
  for ( int channel = 0; channel < 6; channel++) {
    pinMode (myChannels[channel], OUTPUT);
  }
}

void loop() {
  boolean playing = false;

  for ( int channel = 0; channel < 6; channel++) {
    if (myDuration[channel] == 0) {
      if (myPointer[channel] < sizeof(myPlayList[channel])) {
        play( channel, myPlayList[channel][myPointer[channel]][0], myPlayList[channel][myPointer[channel]][1]);
        myPointer[channel]++;
        playing = true;
      } else {
        noTone ( channel);
      }
    } else {
      myDuration[channel]--;
      playing = true;
    }
  }

  if (!playing) {
    delay (10000);
    for ( int channel = 0; channel < 6; channel++) {
      myDuration[channel] = 0;
      myPointer[channel] = 0;
    }
  }

  delay (25);
}

【问题讨论】:

    标签: arduino speaker


    【解决方案1】:

    您尝试同时为六个单独的通道调用tone() 函数。这不起作用,因为 arduino 核心库中的 tone() 函数被指定为一次生成一个音调。原因是它使用单个硬件定时器来生成方波。

    以下是关于如何实现您想要完成的目标的非详尽想法列表:

    1. 制作您的设计单声道。一个引脚,一个扬声器,一个声音。
    2. 利用micros()手动生成正方形。
    3. 使用 Brett Hagman 的音色库:https://code.google.com/archive/p/rogue-code/wikis/ToneLibraryDocumentation.wiki#Ugly_Details。这个库使用了更多的硬件定时器,实际数量取决于你板子的 Atmel 芯片。请注意,您需要一个带有 ATmega1280+ 芯片的 Arduino 才能同时驱动六个引脚。

    附带说明,tone() 需要两个 int 作为参数。

    【讨论】:

      猜你喜欢
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      相关资源
      最近更新 更多