切换到宽版
  • 30790阅读
  • 166回复

[电脑]授人以鱼不如授人以渔-教你制作USB无损音量控制器 [复制链接]

上一主题 下一主题
离线w7767896789
 

发帖
88
M币
1925
专家
22
粉丝
47
— 本帖被 香瑶 设置为精华,作者+3000M币+5专家(2018-02-12) —







首先跟大家说一下,我为什么要做这一个USB音量控制器吧,是因为前些天在某宝看到了这款东西,但是价格感人,实在太贵了,觉得不值得这个价,
经过分析,这东西肯定使用了带USB接口的单片机,那肯定首选STM32,当然其他GD32,MM32或者定制单片机等等也可以,那就用STM32最小系统开始制作吧,这个USB音量控制器功能只有可怜的3个功能-音量加,音量减,静音,但是这3个功能实现起来却还是比较复杂的,是USB协议比较复杂.


于是决定自己做一个.并且把制作的过程分享给大家,为了让大家能够通俗易懂的制作,我选择了ST官方设计的模块化编程开发工具STM32CubeMx,下文很多关于USB协议的内容,比较复杂,我只能一笔带过,本文主要讲解的是如何编程(软件方面),其他硬件方面略过,请见谅.


1:前期准备

硬件:stm32f103c8t6最小系统,必须带USB口的,以下3种都可以,其实stm32f103Zet6这些都是可以的,f2,f4,f7这些新款更是可以,,因为c8t6用的最多,故选择他


软件:STM32CubeMx开发工具http://www.stm32cube.com/这里可以下载
Keil MDK5工具,安装好STM32F1的pack文件


2:开始开发

安装好STM32cubeMx后,打开stm32cubeMx->New Project->Part Number serch输入stm32f103c8型号




,双击型号,进入工程,进入后引入我们眼帘的是Pinout界面,就是我们需要用到的引脚外设,需要的就去添加



我们点击开RCC和SYS目录树,外部高速时钟选择Crystal/Ceramic Resonator,即8m晶振,Debug选择Serial Wire即sw下载口,USB选项勾选Device(Fs),上方USB_DEVICE选择Human Interface Device(HID),其实USB音量控制器是customer HID,但是我发现选择CHID生成的工程是没有报告描述符的,



接着设置时钟线,点击Pinout旁边的Clock Configuration,PLL选择9倍频,USB除以1.5得到48M,这些都是比较常用的设置参数


做完后,点击那个齿轮轴按钮生成工程


设置好路径,不能有中文,要不然工程打不开出错,IDE选择MDK-5当然用其他的也可以,OK确定进度条走完后,打开工程
先编译后烧进去stm32里面看看原工程是什么东西,电脑数据线连接stm32最小系统,用bus hound看到是一个鼠标设备



3:程序修改

为什么windows认为是一个鼠标呢,打开middlewares目录打开usbd_hid.c,找到uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]这个数组,即报告描述符,里面的数组就是报告作为鼠标的信息,这里我们先不管.
做到这里,可能有些人已经着急了,不是做USB音量控制器吗,搞了半天怎么做了个鼠标,不要急,刚才说了音量控制器和鼠标都是HID设备,其实他们的差别只是报告描述符,有人会说设备描述符,接口描述符,HID描述符不用改吗,.不用改,鼠标和音量控制器都是HID且只有输入端点足够了,不像键盘还要有输出端点,控制大小写LED灯的.
好的,我们把以下绿色代码替换到HID_MOUSE_ReportDesc数组里面,同时修改数组大小HID_MOUSE_REPORT_DESC_SIZE为38



0x05, 0x0c,  
0x09, 0x01,
0xa1, 0x01,  
0xa1, 0x00,
0x09, 0xe9,
0x09, 0xea,
0x09, 0xe2,  
0x09, 0xcd,
0x35, 0x00,  
0x45, 0x07,
0x15, 0x00,
0x25, 0x01,
0x75, 0x01,
0x95, 0x04,
0x81, 0x02,
0x75, 0x01,
0x95, 0x04,
0x81, 0x01,
0xc0,
0xc0

替换后编译烧录进入,bus hound看到刚才的设备已经是Consumer control device设备了


快完成了,我们再在main.c上方声明

extern uint8_t USBD_HID_SendReport(USBD_HandleTypeDef  *pdev,
uint8_t *report,
uint16_t len);
和uint8_t   HID_report[4];
在while(1)中添加以下代码

HID_report[0]=0x01;
USBD_HID_SendReport(&hUsbDeviceFS,HID_report,1);
  HAL_Delay(40);
  HID_report[0]=0x00;
USBD_HID_SendReport(&hUsbDeviceFS,HID_report,1);
  HAL_Delay(1000);

   HID_report[0]=0x02;
  USBD_HID_SendReport(&hUsbDeviceFS,HID_report,1);
  HAL_Delay(40);
  HID_report[0]=0x00;
   USBD_HID_SendReport(&hUsbDeviceFS,HID_report,1);
  HAL_Delay(1000);

   HID_report[0]=0x04;
USBD_HID_SendReport(&hUsbDeviceFS,HID_report,1);
  HAL_Delay(40);
  HID_report[0]=0x00;
  USBD_HID_SendReport(&hUsbDeviceFS,HID_report,1);
  HAL_Delay(1000);





4:原理解析

编译烧录进去以后,电脑数据线连接好最小系统,发现电脑音量每隔1s增加减少,静音
ok功能实现了,为什么会这样呢,上面替换的报告描述符是什么呢,我用HID描述符工具翻译下


我大概解释一下吧,绿色的代码就是上图的内容,集合里面是每个位对应的功能,我用了4个功能位(音量加减,静音,播放暂停),后面空位直接REPORT_SIZE*REPORT_COUNT=4补齐8个位即1个字节,因为USB协议是按字节发送的
好了,核心代码我已经讲解完了,上面的工程我会分享,接下来的添加EC11编码器和LED呼吸灯内容就不跟大家讲解了,因为中断和定时器这些知识比较基础,stm32的HAL库还是很好的,虽然没有汉化,但是我觉得比3.5库好入门,好学习,教程也慢慢多起来了,所以我希望大家可以凭借自己的努力,在我的工程基础上添加EC11和LED呼吸效果.当然文章最后我会分享我的添加了EC11编码器和8LED呼吸灯的音量控制器的hex固件和PCB
搞了半天就改了这些东西,可能会有人骂我,我想说的是台上三分钟台下十年功,USB协议是全英文的,我看了它好几个星期,才能略懂一二,希望你们理解


5:原理图PCB设计+机械设计





原理图就是STM32最小系统+8LED+EC11,EC11的输出脚要加2个电容滤波,103或者104,要不然中断比较容易误触发
还有就是USB的D+脚要加1.5K上拉电阻,PCB还是比较简单.




6:新功能探索

可以通过USB复合设备方式将音量控制器和键盘,这样就可以是实现QQ音乐等播放器的全局快捷键操作,比如按住EC11按钮再旋转切换上一曲下一曲,
播放暂停等,或者HID+CDC用IAD复合,可以用串口助手修改按键键值.

资料分享:
链接:https://pan.baidu.com/s/1mjkDAy8 密码:74hq

里面的工程只是实现了1s间隔的音量加减静音,编码器和LED需要自己添加,有全部功能实现的hex固件和PCB.
[ 此帖被w7767896789在2018-02-12 16:12重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共4条打赏M币+71
jxcnj M币 +15 優秀文章優秀文章優秀文章 11-08
网络孤客 M币 +13 優秀文章 09-14
风间尘 M币 +13 謝謝分享 09-13
lxvtag M币 +30 優秀文章 04-19
关键词: 音量控制器
离线kuyue163

发帖
215
M币
182
专家
2
粉丝
18
只看该作者 1楼 发表于: 02-12
k看不懂!但是 这种 比较nb的产品希望能量产!当 价格。。是重点!
离线lsen8

发帖
1822
M币
9521
专家
31
粉丝
13
只看该作者 2楼 发表于: 02-12
单片机的知之甚少,书已经买了,就是看不进去,逮不住鱼了.....
离线丁当

发帖
838
M币
2190
专家
0
粉丝
57
只看该作者 3楼 发表于: 02-12
楼主的文章技术含量对一般人来说技术含量太高啦,需要好好学习
本帖最近打赏记录:共1条打赏M币+1
离线hshgc

发帖
1475
M币
3803
专家
3
粉丝
31
只看该作者 4楼 发表于: 02-12
直接用带开关的50k双联电位器不是更简单

内容来自Android手机客户端

本帖最近打赏记录:共1条打赏M币+3
离线etet

发帖
15741
M币
22715
专家
3
粉丝
83
只看该作者 5楼 发表于: 02-12
好好学习天天向上
本帖最近打赏记录:共1条打赏M币+3
离线bluedevil

发帖
3317
M币
9094
专家
2
粉丝
31
只看该作者 6楼 发表于: 02-12
写的不错,很详细了。
离线hyb1975

发帖
309
M币
2775
专家
0
粉丝
15
只看该作者 7楼 发表于: 02-12
深度好文,学习了。
离线bear7791

发帖
1088
M币
406
专家
0
粉丝
24
只看该作者 8楼 发表于: 02-12
真要说无损,我还是老老实实的做个波段开关加焊若干电阻。二十年前做了一个,一直用到现在,完好无损。当然了,和楼主的比,不能比。楼主的太高级了,咱没那本事。不过,以前有有砖家说过,电子音量开关是有损耗的。不知是否?
话说回来,真正能有几个人是金耳朵的? 能听得出水电和火电和风电的区别?能听得出无损和320K MP3的区别?能听得出数字和模拟的区别?
本帖最近打赏记录:共3条打赏M币+3
离线smzj10315655

发帖
2145
M币
1771
专家
0
粉丝
21
只看该作者 9楼 发表于: 02-12
太复杂了看不懂啊

内容来自Android手机客户端

本帖最近打赏记录:共1条打赏M币+3
字数补丁!