用 Arduino 播放音乐

Posted

技术标签:

【中文标题】用 Arduino 播放音乐【英文标题】:Playing music with 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);

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于用 Arduino 播放音乐的主要内容,如果未能解决你的问题,请参考以下文章

使用LM386制作Arduino音乐播放器

Arduino与Processing交互-旋转编码器控制播放音乐

Arduino与Processing交互-旋转编码器控制播放音乐

linux下用啥命令来播放音乐阿?

arduino蜂鸣器声音大小用哪个函数表示

C#用按钮播放本地音乐