这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» DIY与开源设计» 电子DIY» 【蓝牙乐器DIY】卡琳巴拇指琴(51单片机版)

共13条 1/2 1 2 跳转至

【蓝牙乐器DIY】卡琳巴拇指琴(51单片机版)

菜鸟
2022-03-15 16:32:10 打赏

midi_575x60.gif

网上有很多使用51单片及制作电子琴的示例,基本的方案是使用微动按键作为琴键,蜂鸣器作为发声单元,按下不同好的按键产生不同频率的PWM,驱动蜂鸣器发出不同频率的声音。

227b581faa91b9782d55702c5289983.png

普通按键及蜂鸣器

普通按键的手感和蜂鸣器的音质都不是很理想,本篇文章给大家推荐一个不同的方案来实现简单的电子琴。采用如下图所示的鼠标按键作为琴键,2308扬声器代替蜂鸣器。

aa90d047bcb2cb5e494ec93c3f22fd3.png

鼠标按键及2308扬声器

电子琴的外观设计参考了非洲的民族乐器卡琳巴琴,使用上图所示鼠标按键代替卡琳巴琴的金属琴键。

image1.jpeg

卡琳巴琴



硬件设计

该作品使用的核心元器件是STC15W204S型号51单片机,适合学习了C语言和单片机,并且有一定PCB设计能力的同学制作(使用其他型号的单片机也可以)。原理图如下图所示:

image3.png

原理图

1647332777(1).png

布线参考

image4.png

渲染图

所有设计均在立创广场开源,开源地址:https://oshwhub.com/Dr.Zhang/kalinba

从上图可以看出,该设计采用MicroUSB接口进行供电和调试,板载一个CH340 USB转串口芯片用于烧录程序,当然如果自己有串口烧录器的话可以省去这个元器件。整个乐器一共有13个按键,可以发出13个音,发声原理是通过单片机产生不同频率的PWM波驱动扬声器发出不同频率的声音(注意我们这里使用的是扬声器不是蜂鸣器,蜂鸣器声音很差)。13个按键分别连接在13个IO口上,当程序检测到有按键按下时,根据按下按键的不同,配置PWM相关的寄存器,在扬声器引脚上产生对应的波形。没有按键按下时无波形输出。

软件设计

软件采用Keil开发,核心代码如下:

#include "stc15.h" #define MAIN_Fosc 24000000 //时钟频率24M typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; sbit P_PWM = P1^4; //PWM引脚 u16 PWM_high; void Pin_Init() { P1 = P3 = P5 = 0xff; P_PWM = 0; P1M1 &= ~(1 << 4); P1M0 |= (1 << 4); } u16 cur_tune = 0; //用来记录当前频率 void PWM_SetTune(u16 tune) { cur_tune = tune; if(tune == 0) { TR0 = 0; PT0 = 0; TMOD = 00; TMOD = 0; INT_CLKO = 0; P1M0 = 0; P_PWM = 0; } else { EA = 0; PT0 = 1; P1M0 |= (1 << 4); TR0 = 0; PT0 = 1; TMOD &= ~0x03; TMOD &= ~0x04; INT_CLKO |= 0x01; PWM_high =65535UL - 1000000UL/tune; TH0 = (u8)(PWM_high >> 8); TL0 = (u8)PWM_high; TR0 = 1; } } char last_value[13]= {1,1,1,1,1,1,1,1,1,1,1,1,1}; //记录13个按键上次的按键值 char now_value[13] = {1,1,1,1,1,1,1,1,1,1,1,1,1}; //记录13个按键当前的按键值 //每个按键对应的频率,采用的是五声音接 u16 tune[13] = {262, 294, 330,392,440,523, 587, 660,784,880, 1046,1174,1318}; void main() { int i = 0; Pin_Init(); PWM_SetTune(0); while (1) { now_value[0] = P10; now_value[1] = P37; now_value[2] = P11; now_value[3] = P36; now_value[4] = P12; now_value[5] = P33; now_value[6] = P13; now_value[7] = P32; now_value[8] = P15; now_value[9] = P31; now_value[10] = P54; now_value[11] = P30; now_value[12] = P55; for(i=0; i<13; i++) { if(last_value[i] != now_value[i]) // { if(now_value[i] == 0) { PWM_SetTune(tune[i]); } else if (cur_tune == tune[i]) { PWM_SetTune(0); } last_value[i] = now_value[i]; } } if( (last_value[0] == 1) && (last_value[1] == 1) && (last_value[2] == 1) && (last_value[3] == 1) && (last_value[4] == 1) && (last_value[5] == 1) && (last_value[6] == 1) && (last_value[7] == 1) && (last_value[8] == 1) && (last_value[9] == 1) && (last_value[10] == 1) && (last_value[11] == 1) && (last_value[12] == 1)) { PWM_SetTune(0); } } }

使用Keil创建一个空白的51工程,将上述代码复制到main.c,编译下载就可以了。


这个作品我也曾将其用在课堂上,作为学生的电子实训项目,下图是之前在课堂上制作的电路板,与本文中的描述有些许差异,各位读者如要制作请以本文资料为准。

卡林巴琴

旧版本卡琳巴琴

制作过程及视频演示如下:https://www.bilibili.com/video/BV135411w73B?p=3

备注:视频里面演示的是旧版本,后面做了些许修正,设计资料以本文章为准。


附元器件列表:

名称

型号

封装

数量

备注

USB接口

MicroUSB

贴片

1


串口芯片

CH340N

SOP-8

1

可选

电容

0.1uF(104)

0805

2


二极管

1N4148

直插

2


开关

MSS22D18G2

直插

1


单片机

STC15W204

SOP-16

1

可替换为直插封装

扬声器

2308

直插

1


鼠标按键

*

直插

13

三脚带弯柄





关键词: 乐器 DIY 51单片机 电子琴

高工
2022-03-15 23:43:28 打赏
2楼

总结的非常不错


工程师
2022-03-18 23:41:47 打赏
3楼

动手能力很强


工程师
2022-04-01 22:20:58 打赏
4楼

学习


高工
2022-04-01 22:31:25 打赏
5楼

谢谢


工程师
2022-04-14 23:44:39 打赏
6楼

非常不错的钢琴


工程师
2022-04-15 23:47:06 打赏
7楼

感谢分享


工程师
2022-04-16 23:47:42 打赏
8楼

讲解的非常不错的


工程师
2022-04-17 22:04:44 打赏
9楼

总结的挺到位的


菜鸟
2022-04-17 23:51:59 打赏
10楼
高手点赞

共13条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]