完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
描述
猫朋克合成器 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,为了让事情变得超级酷,我使用了滑动罐,让这个合成器具有赛博朋克 -看起来不错。 所需材料 这些是这个内置的东西 -
电路设计 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 #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 Oscil Oscil 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,组装完成。 结果 要打开此设置,我们只需按下摇杆开关并更改滑动电位器位置即可调制声音。
本帖被以下淘专辑推荐:
|
|
|
|
只有小组成员才能发言,加入小组>>
9586 浏览 0 评论
8953 浏览 0 评论
13334 浏览 0 评论
4398 浏览 0 评论
4652 浏览 0 评论
362浏览 1评论
498浏览 1评论
IPC-6012E CN 2020中文 CN 刚性印制板的鉴定及性能规范
596浏览 1评论
392浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 14:29 , Processed in 1.350695 second(s), Total 74, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号