找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2268|回复: 21
收起左侧

儿童玩具电钢琴改装成拉弦电子琴(日记)

[复制链接]
ID:283954 发表于 2023-9-5 17:40 | 显示全部楼层 |阅读模式
      一个月前在某一个宝看到一台儿童电钢琴,37键,是2.2M标准钢琴琴键,很便宜,于是买了一台打算改进成拉弦电子琴,我的第一款拉弦电子琴已经制作成功,还搬上舞台表演,并申请了中国专利,已经收到受理通知书,原本打算再买一批来改装,但厂家倒了,买不到,只好再买一款,从头做起,并打算把改装过程在论坛与大家分享,也欢迎大家来提意见。

37KEY2.jpg

拆开后:

无标题121.jpg

芯片大头照:

无标题122.jpg

打算把主控芯片换掉,用STC8代替,完成扫描后输出MIDI码,待续。。


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:283954 发表于 2023-9-6 03:57 | 显示全部楼层
电路分析:此琴用三颗电池供电,电压为4.5V,通过两个硝基二级管降压,并防止电池反接,总共有8X5条扫描线,A0-A7隔着二极管与B3-B7连接,A端接二极管正极,B端接二极管负极,扫描时让B口的每一位轮流输出低电位,并检查A端的8位数据,该位若为0则表示相应的按键被按下,经查表可得到该键的排列号码。

选用STC8作为扫描芯片,这是画好的板,打样回来后就可编程了。

MIDISCAN.jpg


回复

使用道具 举报

ID:1013588 发表于 2023-9-6 11:57 | 显示全部楼层
占个沙发,关注楼主后续
回复

使用道具 举报

ID:283954 发表于 2023-9-6 15:37 | 显示全部楼层
龙小白 发表于 2023-9-6 11:57
占个沙发,关注楼主后续

欢迎一起来玩,我这台也一定能成功改造完成,将来到国内推行电子琴弦乐队也用这一款。
回复

使用道具 举报

ID:283954 发表于 2023-9-6 16:22 | 显示全部楼层
拆除主控芯片:芯片用黑胶封住,什么都看不到,应该是很成熟的方案,除了扫描线输入,还有四条DATA线,但不知道是什么功能,如果是输出MIDI码,那就好办,不必搞自己的扫描版,这台机到我家还不到一小时就被拆了,连一个音都没有听到,我想如果再来一台,可以用逻辑分析仪去看看到底是什么来的,也许只是输入端,总之自己掌握了键盘扫描技术就能用一粒MCU直捣龙门,与按键直连,不必厂家提供资料,什么琴都能改装成功。

用铜箔覆盖芯片四周,用350摄氏度的热风器吹,让主控芯片板与琴骨肉分离,让新板入住。


scan1.jpg

scan2.jpg

也可以用恒温台来拆,但要把整片板与塑料支架分离,必须拆8颗螺丝,很累,就用吹算了。如果能找到平面很小的恒温台就好了。


回复

使用道具 举报

ID:283954 发表于 2023-9-29 18:26 | 显示全部楼层
终于把板子给焊上了,之所以会这么久是因为做好的PCB还必须集运才送来,得十天八天,影响开发速度,软件方面就容易得多,因为我之前已经做了两款扫描电子琴琴键的软件,有88键的,包含力度感应,相当复杂,当初幸好有网友yzwzfyz指点一番,不然还真做不出来。

现在这个就非常简单了,只用到8条X线,5条Y线,可检测40个键,所以把旧软件简化,用了两晚就解决了,编程思路如下:

1. 向某一条Y线送出0, 其他保持1,读取X线的值(8位),这8位有某个按键被按下,该位是0。
2. 由于8位连接的按键会同时被按下,所以得用移位逐个检测每个位,并结合Y的值算出是琴上的那个键被按下。
3. 确定被按下的键必须在记忆区相应的位置设定标记1,然后送出NOTEON的MIDI码。
4. 没有按下的键也必须在其记忆区相应的位置检查标记,若为1表示之前已经送出NOTEON,所以必须送出NOTEOFF的MIDI码,再把标记设为0.
5. 按键不必有防抖程序,因为每一次扫描会有间隔,不会出现连续开关的情况,经过测试的确如此。

注:Y线是连接二极管的负极,X线是连接二极管的正极。

无标题123.jpg
SCANNER:               ;键盘扫描主程序
;LCALL DELAY3        ;这个试验时可开,但正式使用要关。

SCANP1:                 ;输出到P1,其中一列是0,然后从P2读入,8位代表列,如某行有按下则为0,否则为1,8行都有可能同时按下。
MOV 35H, #0          ;THIS WILL ADD TO ROW TO MAKE 0-7
MOV 32H, #5          ;8 BITS TO SHIFT
MOV 50H, #11111111B  ;THIS BYTE FOR SHIFT AND OUTPUT TO P1
MOV P1, #11111111B   ;CLEAR P1 AFTER EVERY BIT SCAN
LCALL DELAY1   
CLR C                    ;PUSH A ZERO INTO 50H AT FIRST ROTATE
SCANP1A:
MOV A, 50H
RLC A                    ;改用左移,第一次(C=0)被推入,变成11111110,而C变成1,第二次移0被左移,变成11111101
MOV 50H, A           ;保留进50H,下次再用
MOV P1, A             ;输出到P1
;MOV P1, #11101111B   ;第一步:这个用来检测每一根输出线(逐个放0,只有5根线BIT0-BIT4)

LCALL DELAY0          ;稍等   

MOV A, P2            ;READ FROM P2

;LCALL SENTONEBYTE1

LCALL EACHDATA

SETB C                        ;BEFORE LOOP SET C FOR SHIFT ONE TO 50H
MOV P1, #11111111B   ;CLEAR P1 AFTER EVERY BIT SCAN
LCALL DELAY1
;LCALL DELAY3

DJNZ 32H, SCANP1A     ;5 TIME LOOP

JMP SCANNER


EACHDATA:            ;32H 从8逐渐减到1,代表是那一列被设为0,与监测到0的行相乘就得到扫描号码。      
PUSH PSW
MOV 34H, #8         ;8行检测
MOV 33H, A           ;A 是由P2 读来的8BIT,每个BIT代表一个扫描线与P1那个被设定为0之间的按键是否有按下,按下则为零。

EACHDATA1:           ;8次重复由34H控制
MOV A, 33H
LCALL COUNTPOSITION  ;先算出当前键的位置
MOV 3EH, A                  ;回来后A是按键数目

LCALL KEYMAP              ;查表得到该按键在键盘上的排列号码

MOV 3AH, A                 ;保存键盘号码到3AH

MOV A, 33H           
RLC A                         ;向左移,检查C看是1还是0
MOV 33H, A               ;SAVE BACK FOR NEXT ROTATE

JNC DOKEY1              ;CONTACT POINT NOT CONTACT GO NOTEOFF SUBROTINE
LCALL NOTEOFFLAH    ;NOTE OFF SUBROUTINE
JMP DOKEY2
DOKEY1:
MOV A, 3AH                 ;按键码  
;LCALL SENTONEBYTE1
LCALL NOTEONLAH       ;保存区相应位置放1
DOKEY2:

DJNZ 34H, EACHDATA1   ;8 LOOP NEEDED
DOKEYEXIT:
POP PSW
RET

NOTEOFFLAH:
MOV DPH, #0
MOV DPL, 3AH
MOVX A, @DPTR     ;READ OLD DATA
JZ NOTEOFFX
MOV A, #0
MOVX @DPTR, A        ;标志为1
LCALL SENTNOTEOFF ;送出NOTEOFF,只限一次
NOTEOFFX:
RET


NOTEONLAH:
MOV DPH, #0
MOV DPL, 3AH
MOVX A, @DPTR        ;READ OLD DATA
JNZ NOTEONX
MOV A, #1
MOVX @DPTR, A        ;标志为1
LCALL SENTNOTEON  ;送出NOTEON,只限一次
NOTEONX:
RET

SENTNOTEOFF:
MOV A, #10000000B   ;MIDI NOTEOFF CHANNEL1
LCALL SENTONEBYTE1
LCALL SENTONEBYTE2
MOV A, 3AH
LCALL SENTONEBYTE1
LCALL SENTONEBYTE2
MOV A, #0
LCALL SENTONEBYTE1
LCALL SENTONEBYTE2
RET

SENTNOTEON:
MOV A, #10010000B    ;MIDI NOTEON CHANNEL1
LCALL SENTONEBYTE1
LCALL SENTONEBYTE2
MOV A, 3AH
ANL A, #01111111B    ;MASKING BIT7 音符  
LCALL SENTONEBYTE1
LCALL SENTONEBYTE2
MOV A, #7FH           ;力度
LCALL SENTONEBYTE1
LCALL SENTONEBYTE2
RET


COUNTPOSITION:    ;这个算法不一般
PUSH PSW
MOV A, 32H        ;列ROW POSITION 1-8
MOV B, #8         ;8 CONTACT POINT FOR EACH ROW
MUL AB            ;得到的数字是 8,16,24,32,40.......128
CLR C
SUBB A, #8        ;MAKE A 0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120
ADD A, 34H        ;加上34H 1-8 行COLUME
POP PSW
RET

KEYMAP:           ;由于此款排列顺序,无需查表,直接运算
MOV A, #50H       ;从小变大!
CLR C
SUBB A, 3EH
RET


回复

使用道具 举报

ID:283954 发表于 2023-10-5 22:56 | 显示全部楼层
原来的琴没有功放,于是采用了TDA7297功放模块,想起很多年前我还在用2N3055/2n2955做功放,现在实在太方便了,实测结果声音很大,不过静态电流也很大,电池很快就会耗尽,打算改用数字功放,静态电流20MA,由于我的音源模块是立体声的,必须有两个喇叭,要在底座开多一个喇叭孔就麻烦了,暂时就这么用,扫描板的串口输出直接接上一个蓝牙模块,用PC版的蓝牙接收模块,就可以弹进电脑了。

MIDI-WOOD.jpg


回复

使用道具 举报

ID:105534 发表于 2023-10-6 09:06 | 显示全部楼层
汇编大师,单片机汇编全还给老师了
回复

使用道具 举报

ID:444392 发表于 2023-10-6 11:19 | 显示全部楼层
这么改会不会麻烦了些?为什么不直接用MIDI模块来做呢?
回复

使用道具 举报

ID:283954 发表于 2023-10-6 15:48 | 显示全部楼层
msold5 发表于 2023-10-6 11:19
这么改会不会麻烦了些?为什么不直接用MIDI模块来做呢?

没找到适用的器材,得自己做,单单MIDI模块也做不了这事的。
回复

使用道具 举报

ID:444392 发表于 2023-10-6 16:02 | 显示全部楼层
dalaoshi 发表于 2023-10-6 15:48
没找到适用的器材,得自己做,单单MIDI模块也做不了这事的。

没明白你说的不适合是什么意思,单片机发送指令到MIDI,直接调用MIDI里的弯音滑音功能不是更适合制作弦类乐器吗?
回复

使用道具 举报

ID:1083996 发表于 2023-10-6 18:34 | 显示全部楼层
不错的思路,成品玩具琴很好买,可以做多种改装啊
回复

使用道具 举报

ID:283954 发表于 2023-10-6 22:26 | 显示全部楼层
本帖最后由 dalaoshi 于 2023-10-7 20:12 编辑

msold5 发表于 2023-10-6 16:02
没明白你说的不适合是什么意思,单片机发送指令到MIDI,直接调用MIDI里的弯音滑音功能不是更适合制作弦类 ...

要做的是一台能现场演奏的弦乐电子琴,用四人组成乐队来表演,用普通电子琴无法表现弦乐的拉弓技巧,所以必须改装。

4s.jpg

51hei.jpeg
回复

使用道具 举报

ID:283954 发表于 2023-10-6 22:31 | 显示全部楼层
量子工业 发表于 2023-10-6 18:34
不错的思路,成品玩具琴很好买,可以做多种改装啊

改装是最可行之道,那些琴键必须厂家投资才能生产的,电路板就可以自己做,这就是会玩电子的人的好处。
回复

使用道具 举报

ID:444392 发表于 2023-10-14 22:54 | 显示全部楼层
dalaoshi 发表于 2023-10-6 22:26
要做的是一台能现场演奏的弦乐电子琴,用四人组成乐队来表演,用普通电子琴无法表现弦乐的拉弓技巧,所 ...

你改得很好,我不是说用电子琴有问题,我是说用电子琴不如直接用MIDI芯片直接,电子琴里不也是调用的MIDI功能吗?
回复

使用道具 举报

ID:283954 发表于 2023-10-15 02:05 | 显示全部楼层
msold5 发表于 2023-10-14 22:54
你改得很好,我不是说用电子琴有问题,我是说用电子琴不如直接用MIDI芯片直接,电子琴里不也是调用的MIDI ...

你是说在琴里面放MIDI芯片,也就是音源芯片SAM2695, VS1053B?这些的音质都太差了,所以要将MIDI信号输出外接高档音源才行,我还无法找到好的音源SOC呢。
回复

使用道具 举报

ID:283954 发表于 2023-10-16 22:53 | 显示全部楼层
这是琴的主控板,从以前比较复杂的板简化而来,废除不少按键,只剩5个,可用32脚的STC8G2K32S4,比较容易焊,之所以采用S4是因为又想做其他实验,比如用两个音源来产生合奏效果,我曾经用了4个不同牌子的音源同时演奏一个声道,出来的效果和用一个音源一样,因为这些音源的采样都是一样的,演奏也都很准确,而真乐器合奏时,会有时间点误差,音量变化误差,音调准确度误差,频率响应误差,而且都是随机的,这样才有合奏效果,用S4就能够同时控制3个音源,哈!充满幻想,如果一人吹喇叭就有3支喇叭合奏的结果,就可以搞电子铜乐队了。

WOOD.jpg





回复

使用道具 举报

ID:108361 发表于 2023-10-25 12:49 | 显示全部楼层
大佬啊,居然直接上手汇编开发,虽然我现在也还能看懂51汇编,但是要我动手写已经不行了,用太久的C,汇编已经退化
回复

使用道具 举报

ID:283954 发表于 2023-10-25 22:14 | 显示全部楼层
powerdruy 发表于 2023-10-25 12:49
大佬啊,居然直接上手汇编开发,虽然我现在也还能看懂51汇编,但是要我动手写已经不行了,用太久的C,汇编 ...

我是走投无路才呆在汇编的,当年第一次玩单片机时51C还不曾出现,第二次玩单片机时已经是C的天下,反正做都是自己的项目,就不想学C了。
回复

使用道具 举报

ID:283954 发表于 2023-10-31 02:15 | 显示全部楼层
这是电源供应板,功放板直接用12V,听从论坛大佬的劝告,用78M05作为稳压,不要用LDO,避免过冲,由于担心锂电池没有过放保护,所以设计了一个电压检测器,用PMOS作开关,HT7050做电压检测器,用四个发光二极管降压,可检测5V以上的电压,当电压过低时关断PMOS,发光二极管可用不同的颜色组合以便获得需要检测的电压,我用四颗红LED可检测11.2V电压,3颗可检测9.8V电压。另外做了个混音放大器一混合两个音源的输出。

LED的电压:通常所说的LED是正向电压,就是说LED的正极接电源正极,负极接电源负极。电压与颜色有关系,红、黄、黄绿的电压是1.8—2.4v之间。白、蓝、翠绿的电压是3.0—3.6v之间。

power.jpg

power-pcb.jpg


回复

使用道具 举报

ID:283954 发表于 2023-11-3 01:14 | 显示全部楼层
这是焊好的主控板,轻触开关用到24MM的柄,才能够穿过厚后的木板,由于这个琴键没有力度感应,必须用电阻式压力传感器,ADC后产生压力参数,控制电子琴音量的大小。

正面:

wood1.jpg

反面:

wood2.jpg

回复

使用道具 举报

ID:283954 发表于 2023-11-15 00:43 | 显示全部楼层
     终于完成整机的组装,比较困难的就是那个拉弦模拟器的外壳,必须把所有接线都隐藏在内,现在还有一个接头外露,等下次改板再说把,另外经过测试,必须重新安排电阻压力传感器的位置,否则拉弦时要转换为弹拨很难操作,接下来就是写软件了。

整机:

无标题1.jpg

控制部分:

无标题2.jpg

扫描MCU:

无标题3.jpg


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表