电路设计论坛
直播中

廉鼎琮

7年用户 965经验值
私信 关注
[资料]

基于Arduino Nano构建一个合成器

描述
Arduino 合成器 V3

所以这是我的 Arduino Synth V3,它是由 Arduino Nano 驱动的 DIY 合成器。



它有 12 个按钮开关和两个用于改变模式的 ON/OFF 开关和两个用于改变音高和速度的电位器。
通过更改 Pitch Potentiometer,我们可以通过按任意 12 个按钮来更改输出波形,从而产生酷炫的科幻声音。它的工作原理与普通键盘合成器非常相似。
我制作合成器已经有一段时间了,制作了两个与这个工作相同的合成器,但它们都使用 Mozi 库来运行,但这个使用简单的代码,通过按钮和开关的状态调制输出。

所需材料
以下是我在此构建中使用的东西-
  • 定制PCB
  • Arduino纳米
  • 电位器
  • 开/关
  • 按按钮
  • 扬声器 4 欧姆
  • 排针母头

原理图


该板的原理图很简单,Arduino Nano 连接了 12 个按钮。每个 Push Button 都连接一个 IO 端口,当我们按下任何按钮时,它会将 IO 端口拉低至 GND。
两个 ON-OFF 开关也是如此,但是当我们按下它们时,它们会使 IO 引脚拉下更长的时间。然后两个 Pot 用 A4 和 A5 连接。
PAM8403 模块与输出引脚 A2 相连,它放大信号并使其响亮。

PCB设计


完成原理图后,我导出了网表并开始进行 PCB 设计。
至于外形,我取材于通用键盘的美学和整体外观,Arduino Nano 放置在右上角,扬声器放置在 TOP 左侧。
我还在设计中添加了一些假钥匙,我在这些假钥匙上放置了按钮。也许未来的版本会有真正的电容式触摸键。
此外,我已经从假钥匙上移除了阻焊层,因此铜区域将未被填充,这将提供超酷的银色外观,因为电路板将被 HASL 覆盖。

电路板组装


在开始 PCB 组装之前,我们需要收集我们将在这个项目中使用的所有组件。

添加接头引脚、开关和电位器





我们首先为 Arduino Nano、开关和电位器添加 Header Pins。

添加按钮




接下来,我们将 12 个 Push Buttons 一个一个地添加到它们的位置。

焊接组件


将所有开关和插头引脚放置到位后,我们使用普通烙铁和焊锡线将它们的端子焊接到 PCB。

添加 PAM8403 模块










接下来,我们通过使用一些公头引脚添加 PAM8403 模块,我们在 PCB 上添加公头引脚,然后在头引脚上添加 PAM8403。
最后,我们焊接引脚并将模块永久固定到位。

添加扬声器






最后,我们在其位置添加一个扬声器。
我在 PCB 上添加了一个孔,这里的目标是通过这个孔从背面添加一个扬声器。扬声器粘在 PCB 上,然后我们通过两条跳线将扬声器的端子与 PAM8403 CON2 端口连接。
完成后,PCB就完成了。

PCB组装结果




这是到目前为止的结果,所有组件都焊接好了,电路板就完成了。它看起来很像 Arduino Nano Sheild 或插件板。
下一步是将 Arduino Nano 添加到此板上并将主草图刷入 MCU。

主要代码
这是我使用的主要草图。
诠释C = 2 ;
诠释CS = 3 ;
诠释D = 4 ;
诠释DS = 5 ;
诠释E = 6 ;
诠释F = 7 ;
整数FS = 8 ;
诠释G = 9 ;
诠释GS = 10 ;
整数A = 11 ;
诠释AS = 12 ;
诠释B = 13 ;
int八八度 = 0 ;
整数八达利巴 = 1 ;
int tiempo = 模拟读取(A4);
int pitch_bend = 模拟读取(A5);

诠释c = 262 ;
整数cs = 277 ;
诠释d = 294 ;
诠释ds = 311 ;
整数e = 330 ;
诠释f = 349 ;
整数fs = 370 ;
诠释g = 392 ;
诠释gs = 415 ;
诠释a = 440 ;
整数 = 466 ;
_ 诠释b = 494 ;

void  setup () {
// 输入配置
pinMode(C,INPUT_PULLUP);
pinMode(CS,INPUT_PULLUP);
pinMode(D,INPUT_PULLUP);
pinMode(DS,INPUT_PULLUP);
pinMode(E,INPUT_PULLUP);
pinMode(F,INPUT_PULLUP);
pinMode(FS,INPUT_PULLUP);
pinMode(G,INPUT_PULLUP);
pinMode(GS,INPUT_PULLUP);
pinMode(A,INPUT_PULLUP);
pinMode(AS,INPUT_PULLUP);
pinMode(B,INPUT_PULLUP);
pinMode(octabajo, INPUT_PULLUP);
pinMode(octarriba, INPUT_PULLUP);
pinMode(A4,INPUT_PULLUP);
// 输出配置
pinMode(A2,输出);
// 启动串口
Serial.begin( 9600 );
}



无效 循环() {

// 把你的主要代码放在这里,重复运行:
digitalRead( 0 );
数字读取(1);

Serial.println(analogRead(A4));

如果(!digitalRead(C)){
音调(A2, c+(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字读取(C);
}
if (!digitalRead(C)&&!digitalRead(octabajo)) {
音调(A2, c/ 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(C);
}
if (!digitalRead(C)&&!digitalRead(octarriba)) {
音调(A2, c* 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(C);
}


数字阅读(CS);
如果(!digitalRead(CS)){
音调(A2, cs+(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字阅读(CS);
}
如果(!digitalRead(CS)&&!digitalRead(octabajo)) {
音调(A2, cs/ 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(CS);
}
如果(!digitalRead(CS)&&!digitalRead(octarriba)) {
音调(A2, cs* 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(CS);
}

数字读取(D);
如果(!digitalRead(D)){
音调(A2, d+(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字读取(D);
}
if (!digitalRead(D)&&!digitalRead(octabajo)) {
音调(A2, d/ 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(D);
}
if (!digitalRead(D)&&!digitalRead(octarriba)) {
音调(A2, d* 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(D);
}

数字读取(DS);
如果(!digitalRead(DS)){
音调(A2, ds+(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字读取(DS);
}
如果(!digitalRead(DS)&&!digitalRead(octabajo)) {
音调(A2, ds/ 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(DS);
}
如果(!digitalRead(DS)&&!digitalRead(octarriba)) {
音调(A2, ds* 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(DS);
}

数字阅读(E);
如果(!digitalRead(E)){
音调(A2, e+(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字阅读(E);
}
if (!digitalRead(E)&&!digitalRead(octabajo)) {
音调(A2, e/ 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(E);
}
if (!digitalRead(E)&&!digitalRead(octarriba)) {
音调(A2, e* 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(E);
}

数字读取(F);
如果(!digitalRead(F)){
音调(A2, f+(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字读取(F);
} if (!digitalRead(F)&&!digitalRead(octabajo)) {
音调(A2, f/ 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(F);
}
if (!digitalRead(F)&&!digitalRead(octarriba)) {
音调(A2, f* 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(F);
}

数字读取(FS);
如果(!digitalRead(FS)){
音调(A2, fs+(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字读取(FS);
}
if (!digitalRead(FS)&&!digitalRead(octabajo)) {
音调(A2, fs/ 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(FS);
}
如果(!digitalRead(FS)&&!digitalRead(octarriba)) {
音调(A2, fs* 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(FS);
}

数字阅读(G);
如果(!digitalRead(G)){
音调(A2, g+(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字阅读(G);
}
如果(!digitalRead(G)&&!digitalRead(octabajo)) {
音调(A2, g/ 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(G);
}
如果(!digitalRead(G)&&!digitalRead(octarriba)) {
音调(A2, g* 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(G);
}

数字阅读(GS);
如果(!digitalRead(GS)){
音调(A2, gs+(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字阅读(GS);
}
if (!digitalRead(GS)&&!digitalRead(octabajo)) {
音调(A2, gs/ 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(GS);
}
if (!digitalRead(GS)&&!digitalRead(octarriba)) {
音调(A2, gs* 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(GS);
}

数字阅读(一);
如果(!digitalRead(A)){
音调(A2, a+(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字阅读(一);
}
if (!digitalRead(A)&&!digitalRead(octabajo)) {
音调(A2, a/ 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(一);
}
if (!digitalRead(A)&&!digitalRead(octarriba)) {
音调(A2, a* 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(一);
}

数字阅读(AS);
如果(!digitalRead(AS)){
音调(A2, as +(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字阅读(AS);
}
if (!digitalRead(AS)&&!digitalRead(octabajo)) {
音调(A2, as / 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(AS);
}
if (!digitalRead(AS)&&!digitalRead(octarriba)) {
音调(A2, as * 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字阅读(AS);
}

数字读取(B);
如果(!digitalRead(B)){
音调(A2, b+(analogRead(A5)/ 5 ));
延迟(模拟读取(A4));
数字读取(B);
}
if (!digitalRead(B)&&!digitalRead(octabajo)) {
音调(A2, b/ 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(B);
}
if (!digitalRead(B)&&!digitalRead(octarriba)) {
音调(A2, b* 2 +((analogRead(A5)/ 5 )));
延迟(模拟读取(A4));
数字读取(B);
}

无音(A2);
}





我们首先在其位置添加 Arduino Nano,然后使用代码对其进行闪烁,结果将是一个正常工作的合成器播放随机嗡嗡声,我们可以通过按下按钮或调制电位器或 ON/OFF 开关来改变声音。

更多回帖

发帖
×
20
完善资料,
赚取积分