用 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 播放音乐的主要内容,如果未能解决你的问题,请参考以下文章
Arduino与Processing交互-旋转编码器控制播放音乐