class="markdown_views prism-dracula">
文章目录
发声体和声音
扬声器(speaker)和蜂鸣器(piezo transducer)
piezoelectric(压电感应)
音频:振动的频率
音高(pitch):声音的频率(音频)高低
tone()指令:
tone(输出端口, 频率, 持续时间);
或 tone(输出端口, 频率),若不指定时间,Arduino将持续发声,直到执行noTone()为止。
动手做 13-1 演奏一段马里奥旋律
程序代码:
const byte SP_PIN = 11;
void setup() {
pinMode(SP_PIN, OUTPUT);
}
void loop() {
tone(SP_PIN, 659, 150); //弹出一个E5音高的四分音符
delay(150);
tone(SP_PIN, 659, 150);
delay(150);
tone(SP_PIN, 659, 150);
delay(300);
tone(SP_PIN, 523, 150);
delay(150);
tone(SP_PIN, 659, 150);
delay(150);
tone(SP_PIN, 784, 150);
delay(3000);
}
使用#define 替换数据
在上面的程序加入如下:
#define E5 659
#define C5 523
#define G5 784
#define和const都能用一个名称来代表数值
const byte LED_PIN = 13;
#define LED_PIN 13
当定义数组常量时,只能用const。
输出高品质的音效
自然界或乐器所发出的声音,是由多种不同频率的正弦波组成的复合波,而tone()指令仅能输出固定的方波,音质无法媲美乐器,可参考几个扩展模块。
- Adafruit 的Wave Shield for Arduino Kit
- Sparkfun的MP3 Player Shield
- BabbleShield
- SpeakJet Shield
13-4 认识反射型与遮光型光电开关
- 反射型光电开关: 又称为反射型传感器,由一个红外线发射LED以及一个光敏晶体管(红外线接收器)所组成,它们的外观和一般的LED一样,它采用的是将发射和接收组装在一个模块的反射型光电开关。
- 传感器里的LED能发射红外线光,若传感器前方有高反射的物体(如:白纸),红外线光将被折射,由光敏晶体管接收,而晶体管发射极将输出高电位,相反地,若前方没有物体或者是低反射的物体(如黑纸),光敏晶体管将收不到红外线光,因而输出低电位。
- 这种元器件可应用在检测条形码,或者像上图一样,在一个圆盘上绘制黑 {MOD}条纹(称为圆盘编码器),安装在电机或其他驱动机械上,可以检测物体的旋转角度或者转动圈数。发射型光电开关和被感测物体的距离,应介于1~8mm,2.5mm的效果最好。
- 另一种称为遮光型光电开关的传感器,也常见于微电脑自动控制装置。
动手做13-2 光电子琴制作
实验说明: 本节将采用红外线传感器当做“琴键”通过感应纸张上的黑白条纹,让Arduino发出对应的音调。
MIDI信息格式
MIDI外设以31.25kbps的速率来发送TTL形式(也就是5V代表高电位)的串行数据。一个MIDI信息通常由3个字节数据构成,分别代表状态(status)、音高(pitch)和强弱(velocity,按下按键时的力量强弱)。MIDI信息的3个字节数据:MIDI的频道号从00001111共16组,音高编号与强弱的数据字节的最高位始终为0,因此有效的数值范围是0127
动手做13-3 通过Arduino演奏MIDI音乐
实验说明: 制作一个MIDI OUT(输出)接口,从Arduino板传输MIDI信息给电脑音源发出音乐。
实验电路: MIDI接口采用5针DIN插座,此元器件的引脚比较不易插入面包板,建议先在它的引脚焊接导线
实验程序: 程序采用SoftwareSerial(软件串口)扩展库,将从中央C的前一个八度音到它的后一个八度音,依序弹奏每一个音符。
#include //
byte note;
SoftwareSerial MIDI(2, 3); //
void midiMsg(byte cmd, byte pitch, byte velocity) {
MIDI.write(cmd); //状态信息,write()指令用于在
MIDI.write(pitch); //音高值
MIDI.write(velocity); //强弱值
}
void setup() {
MIDI.begin(31250); //串口连线要设置成MIDI的传输速率
}
void loop() {
for (note = 48; note < 84; note ++) {
midiMsg(0x90, note, 0x40); //送出“按下琴键”及其他信息。
delay(100);
midiMsg(0x80, note, 0x00); //
delay(1000);
}
}
实验结果: 编译并下载程序之后,将Arduino的MIDI输出接口与电脑的MIDI 转接线的“IN”相连,再打开“虚拟MIDI键盘”软件。
通过MIDI信息更换音 {MOD}
动手做13-4 通过“虚拟MIDI”接口演奏音乐
**实验说明:**想必读者一定感到纳闷,既然MIDI接口采用串行联机,那为何我们不直接通过既有的接口,把MIDI信息传给电脑,通过音源软件发声呢?没问题!只要在电脑上安装“串口转MIDI桥接器”软件,让电脑把指定的串口看待成MIDI适配卡就可以了!当然,如果要将Arduino直接和其他MIDI乐器相连
实验软件: