PCB设计
直播中

刘艳

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

基于Arduino Nano和Mozzi库驱动的猫主题合成器

描述
猫朋克合成器 V2

大家好,欢迎回来,这是我的 Neko Punk 合成器第 2 版,它是一个由 Arduino Nano 和 Mozzi 库驱动的猫主题合成器。



通过改变 5 个滑槽的位置,Mozzi 可以产生更复杂和有趣的咆哮声、扫频声和合唱声。这些声音可以通过振荡器、延迟和滤波器等熟悉的合成单元快速轻松地构建。



我几周前制作的上一版基于最初的 Atari Punk 控制台,最初由 Forrest Mims 于 1980 年制作。它采用了触发单稳态设置的非稳态多谐振荡器设置。通过结合这两种设置,我们得到了 Stepped Tone Generator 或 atari punk 合成器。


这很容易制作,但我对它的结果并不满意。

一年前,我用 Mozzi Library 制作了一个类似的合成器,效果很好,所以我想为什么不在 Neko Punk Synth 的 V2 中使用 Mozzi,为了让事情变得超级酷,我使用了滑动罐,让这个合成器具有赛博朋克 -看起来不错。

所需材料



这些是这个内置的东西 -
  • Arduino纳米
  • PAM8403 音频放大器
  • PCBWAY提供的定制PCB
  • 锂离子 5V 升压模块
  • 3.7V 锂离子电池
  • 3D打印外壳
  • 4欧姆扬声器
  • 滑块锅

电路设计




V2 PCB 可能是我做过的最简单的电路板。
它使用一个 Arduino Nano 作为基础微控制器,五个滑块电位器与 Arduino nano 连接。



D9 进入 PAM8403 音频放大器模块的输入,PAM8403 的输出与两个 CON2 引脚连接,因此我们可以用它添加扬声器。
整个设置需要 5V 才能工作。
为了给这个设置供电,我必须使用这个你可以在网上找到的锂离子电池升压模块,这些模块非常便宜并且工作得很好。


它将 3.7V 的锂离子电池提升至恒定的 5V 1A 或 2A,以使我们的 MCU 设置正常工作。
我在我的 OrCad PCB 套件中准备了 PCB,并添加了一些图形来增加电路板的美感。

从 PCBWAY 获取电路板




我为这个项目使用了 PCBWAY PCB 服务。我在PCBWAY的报价页面上传了这个项目的Gerber文件。
对于这个合成板,我选择白色阻焊层颜色,因为我在板的顶部添加了相当多的圆形图形和自定义艺术。
黑色丝印与白色阻焊层颜色相得益彰。



我在一周内收到了 PCB,PCB 质量非常好,这块 PCB 很大,我喜欢这些 PCB 的质量没有因为尺寸而受到影响。

电路板组装



现在这块板没有任何 SMD 组件,所以我们只需要手动将所有东西放在这块板上并用烙铁焊接它们。
我首先收集所有材料并使用滑动电位器开始组装过程。



然后我从顶部将所有的 Pot 放在它们的位置,并从 PCB 的底部焊接它们的焊盘。
在此之后,我在它们的位置添加了 Arduino Nano 和 PAM8403 模块,并且组装几乎完成了。

上传代码

这是这个基于 Mozzi 库的项目的主要草图。
/*
使用 2 个光敏电阻 (LDR) 更改的示例
FM 合成参数和基频旋钮,
使用 Mozzi 声化库。

演示模拟输入、音频和控制振荡器、相位调制
并以音频速率平滑控制信号以避免咔嗒声。
还演示了 AutoMap,它将不可预测的输入映射到设定的范围。

电位器连接到模拟引脚 0。
电位器的中心引脚连接到模拟引脚。
电位器的侧引脚连接到 +5V 并接地

模拟引脚 1 上的光敏电阻 (LDR) 和 5.1k 电阻:
从模拟引脚到 +5V 的 LDR
5.1k 电阻从模拟引脚到地

模拟引脚 2 上的光敏电阻 (LDR) 和 5.1k 电阻:
从模拟引脚到 +5V 的 LDR
5.1k 电阻从模拟引脚到地

蒂姆·巴拉斯 2013。
此示例代码位于公共领域。
*/

#include
#include // 振荡器
#include // 用于播放 Oscils 的表格
#include
#include // 地图不可预知的输入范围

// int freqVal;

// 所需的载波频率最大值和最小值,用于 AutoMap
const  int MIN_CARRIER_FREQ = 22 ;
常量 int MAX_CARRIER_FREQ = 440 ;

常量 int MIN = 1 ;
常量 int MAX = 10 ;

常量 int MIN_2 = 1 ;
常量 int MAX_2 = 15 ;

// 所需的强度最大值和最小值,对于 AutoMap,注意它们是反向动态的反转
const  int MIN_INTENSITY = 700 ;
常量 int MAX_INTENSITY = 10 ;

// 所需的 mod 速度最大值和最小值,对于 AutoMap,注意它们是反向动态的反转
const  int MIN_MOD_SPEED = 10000 ;
常量 int MAX_MOD_SPEED = 1 ;

AutoMap kMapCarrierFreq ( 0 , 1023 ,MIN_CARRIER_FREQ,MAX_CARRIER_FREQ) ;
AutoMap kMapIntensity ( 0 , 1023 ,MIN_INTENSITY,MAX_INTENSITY) ;
AutoMap kMapModSpeed ( 0 , 1023 ,MIN_MOD_SPEED,MAX_MOD_SPEED) ;
AutoMap mapThis ( 0 , 1023 ,MIN,MAX) ;
AutoMap mapThisToo ( 0 , 1023 ,MIN_2,MAX_2) ;

const  int KNOB_PIN = 0 ; // 将旋钮的输入设置为模拟引脚 0
const  int LDR1_PIN= 1 ; // 将 fm_intensity 的模拟输入设置为 pin 1
const  int LDR2_PIN= 2 ; // 将调制速率的模拟输入设置为引脚 2
const  int LDR3_PIN= 4 ;
常量 int LDR4_PIN= 3 ;

Oscil aCarrier(COS2048_DATA);
Oscil aModulator(COS2048_DATA);
Oscil kIntensityMod(COS2048_DATA);

int mod_ratio = 5 ; // 亮度(谐波)
long fm_intensity; // 携带来自 updateControl 的控制信息到 updateAudio

// 平滑强度以消除过渡点击
float smoothness = 0.95f ;
Smooth < long > aSmoothIntensity(平滑度);


void  setup () {
// Serial.begin(115200); // 设置串行输出,以便我们可以查看光照级别
startMozzi(); // :))
}


无效 更新控制() {

// freqVal = map(LDR3_PIN, 0, 1023, 1, 100);

int freqVal = mozziAnalogRead(LDR3_PIN); // 值为 0-1023
int FRQ = mapThis(freqVal);

int旋钮2 = mozziAnalogRead(LDR4_PIN); // 值为 0-1023
int knob2Val = mapThis(knob2);

// 读取旋钮
int knob_value = mozziAnalogRead(KNOB_PIN); // 值为 0-1023

// 将旋钮映射到载波频率
int carrier_freq = kMapCarrierFreq(knob_value);

//计算调制频率以保持比率
int mod_freq = carrier_freq * mod_ratio * FRQ;

// 设置 FM 振荡器频率
aCarrier.setFreq(carrier_freq);
aModulator.setFreq(mod_freq);

// 读取宽度模拟输入引脚上的光敏电阻
int LDR1_value= mozziAnalogRead(LDR1_PIN); // value is 0-1023
// print the value to the Serial monitor for debug
//Serial.print("LDR1 = ");
// Serial.print(LDR1_value);
// Serial.print("        "); //打印一个标签

int LDR1_calibrated = kMapIntensity(LDR1_value);
// Serial.print("LDR1_calibrated = ");
// Serial.print(LDR1_calibrated);
// Serial.print("        "); //打印一个标签

// 计算 fm_intensity
fm_intensity = (( long )LDR1_calibrated * knob2Val * (kIntensityMod.next()+ 128 ))>> 8 ; // 8 位乘法后移回范围
// Serial.print("fm_intensity = ");
// Serial.print(fm_intensity);
// Serial.print("        "); //打印一个标签

// 读取速度模拟输入引脚上的光敏电阻
int LDR2_value= mozziAnalogRead(LDR2_PIN); // 值为 0-1023
// Serial.print("LDR2 = ");
// Serial.print(LDR2_value);
// Serial.print("        "); //打印一个标签

// 这里使用浮点数表示低频
float mod_speed = ( float )kMapModSpeed(LDR2_value)/ 1000 ;
//Serial.print(" mod_speed = ");
// Serial.print(mod_speed);
kIntensityMod.setFreq(mod_speed);

// Serial.println(); // 最后,打印下一行调试信息的回车
}

int  updateAudio () {
长调制 = aSmoothIntensity.next(fm_intensity) * aModulator.next();
返回aCarrier.phMod(调制);
}

无效 循环() {
音频挂钩();
}

代码很长,但基本上,它运行在 Mozzi 库上,无需额外的屏蔽、消息传递或外部合成器即可生成算法音乐。这个库有很好的文档记录,所以你可以从这里查看并下载它。在上传这个草图之前安装这个库。
常量 int KNOB_PIN = 0; //将旋钮的输入 设置为模拟引脚0
const int LDR1_PIN= 1 ; //将fm_intensity的模拟输入设置为pin 1
const int LDR2_PIN= 2 ; //将调制速率的模拟输入设置为引脚2
const int LDR3_PIN = 4 ;   
常量 int LDR4_PIN=3;
POT 连接在 A0、A1、A2、A3、A4 上,音频输出为 D9。

测试






现在上传草图后,我添加了一个带有 PAM8403 模块的 CON2 的 4ohm 扬声器。
为了暂时为这个设置供电,我使用移动电源为 Arduino Nano 提供 5V 2A。

要调制声音,我们只需更改所有 5 个滑动电位器的位置,这几乎就是整个测试过程。
接下来,我们继续进行最后的组装过程。

3D打印外壳




至于合成器的主体,我们通常使用一个盒子状的外壳来容纳扬声器和电子设备。
我的想法是在正面制作一张猫脸,让它看起来像一只 BOX CAT,我在正面添加了猫的面部信息,例如胡须、鼻子、眼睛。





我在 fusion360 中对身体进行建模,然后在我的 ender 3 上对每个部分进行 3D 打印。
我用橙色 PLA 准备了主体,用黑色 PLA 准备了瞳孔、眉毛、胡须和鼻子,用白色 PLA 准备了眼睛。





打印设置也很正常,我使用了一个 0.8mm 的喷嘴,层高为 0.32mm,填充量为 20%,并支持基体。

打印完所有部件后,我使用强力胶将所有面部部件连接到基体上。

总装



现在我们开始主要组装,首先添加一个扬声器到带有螺母和螺栓的底座上。
接下来,我将 DC Jack 和摇臂开关添加到基体中。







然后我们将 Lithium Boost 模块与 DC 插孔和开关连接起来。
然后,我将所有东西放在机身内,并用一些 M2 螺丝从底部添加主 PCB,组装完成。

结果



要打开此设置,我们只需按下摇杆开关并更改滑动电位器位置即可调制声音。

更多回帖

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