英飞凌PSoC62 MCU
任务要求:
诸如台式机与笔记本电脑,键盘上会集成音量或者屏幕亮度的控制快捷键,使用本板卡实现一个滑动控制器,用手指左右滑动时,电脑的音量、亮度或视频进度条等可以变化。
环境
ModusToolbox tools package
VSCode与插件ModusToolbox Assistant
HelloWorld
跑一跑demo。
一、选择的bsp是:CY8CPROTO-062S2-43012
本次的题目是蓝牙设备模拟鼠标滚轮,所以对以下几个例程感兴趣:
CAPSENSE_Buttons_and_Slider
只是用了例程,需要更改bsp,使用bsp assistant
更改bsp
关掉更改local content使用proxy配置代理连github,选择device更改如下mcu:
三、更改引脚以及晶振等板级配置
使用Device Configurator更改Pin引脚功能以及晶振
①disable ioss[0]这些没有的管脚(封装有变)
②关WCO时钟,配置使用这个时钟的为ILO
③管trace mode - serial关掉
④更改Pin脚,根据原理图选择想用的功能
⑤通过CAPSENSE Configurator配置adc以及关掉按键
⑥修改demo原本代码保证程序正常
四、编译运行
在修改去掉led与button等板卡没有的配置后,编译运行即可。
滑动板卡的capsense,可以控制灯的亮暗,首次体验capsense效果感觉非常丝滑。(PS:希望论坛能支持gif的贴图呀)
踩坑
一开始将两个c口都连接了电脑,结果显示无法找到下载器,应该只接dap那个口,就可以进行烧录了。
成功通过capsense控制灯的亮暗
项目介绍
目标是将板卡作为usb device 配合capsense实现对电脑音量的调节。
这里就使用另一个demo
emUSB-DEVICE-HID-Mouse
,板子上的mcu口就是作为usb-device的usb口。这个demo跑起来的效果是隔一会儿鼠标左右移一下。
其中emUSB这个库是专为嵌入式系统设计的高性能 USB 设备软件。该软件采用 ANSI C 编写,可以在任何平台上运行。已经提供了多种目标驱动程序。通常可以免费添加对新平台的支持。
要完成我们的目标首先需要理解这个demo是如何向计算机描述自己是什么设备的,并按照规范更改hid的报文,将设备可以使用声音加减的功能。第二个就是将之前试过的capsense功能挪到这个项目中,将滑动与hid上报联系起来。
一、HID设备
USB是一个很大的协议,HID只是其中一个小部分,所以报告首先指定当前设备是什么,其次描述这个报告的格式,输入输出类型,定义个设备节点,最后结束请求。
我们可以参照其他的项目中关于声音加减的usb报文:
来自文章:https://blog.csdn.net/Jun626/article/details/90747410
报文为以及解释:
0x05, 0x0c:HID 设备描述符(Descriptor)。它指示了 HID 设备的属性,包括设备的类别、协议等信息。
0x09, 0x01:报告描述符(Report Descriptor)。它定义了 HID 设备的输入或输出报告的格式和内容。
0xa1, 0x01:输入报告的请求,指示主机获取 HID 设备的输入报告。
0xa1, 0x00:输出报告的请求,指示主机向 HID 设备发送输出报告。
0x09, 0xe9, 0x09, 0xea, 0x09, 0xe2, 0x09, 0xcd:这些是报告的字段(Report Fields),定义了 HID 设备输入报告的不同按键或控件。
0x35, 0x00, 0x45, 0x07, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x04, 0x81, 0x02:输入报告的字段值,指示了按键或控件的属性和取值范围。
0x75, 0x01, 0x95, 0x04, 0x81, 0x01:这是另一个输入报告的字段值,指示了另一组按键或控件的属性和取值范围。
0xc0:结束请求,指示主机结束当前的数据传输。
也就是由两个节点,一个用来控制声音加减,另一个控制生意开关。
定义好报文,使用USBD_HID_Write写入数据,即可完成对电脑的控制。
二、结合capsense
知道怎么控制usb设备后,只需要将capsense搬过来用就好了。
因为使用的是usb的例程,所以先使用Library Manager将capsense的库导入工程。
参考capsense_buttons_and_slider
将没有用到的Cy_CapSense_RunTuner这个在电脑上图形化显示capsense的工具去掉。
将重新编写process_touch函数,将hid_write的操作与触摸条的操作关联起来。
if ((0 != slider_touch_status) &&
(slider_pos != slider_pos_prev))
{
delta = slider_pos - slider_pos_prev;
if (delta > 0) {
while (delta > 0) {
delta -= 100;
mouse_data[0] = 0x02;
/* Write data to host*/
int ret = USBD_HID_Write(usb_hidContext, &mouse_data[0], 1, 100);
cyhal_system_delay_ms(10);
printf("ret = %d\n", ret);
}
} else {
delta = -delta;
while (delta > 0) {
delta -= 100;
mouse_data[0] = 0x01;
/* Write data to host*/
int ret = USBD_HID_Write(usb_hidContext, &mouse_data[0], 1, 100);
cyhal_system_delay_ms(10);
printf("ret = %d\n", ret);
}
}
}
这里就是简单的判断了下当前滑动的方向,如果正向滑动,就按照滑动的大小来上报音量加的事件,如果反向就上报音量减。
未来计划
参加本次eetree寒假在家练收获满满,接触了好多新东西,在本次英飞凌的开发板中,更是尝试了三种ide(modus ide, vscode, rt-thread studio),感受下来vscode与modus ide使用基本一致,但很可惜官方ide好像对这款板子的支持没有很多,包括蓝牙的例程也只有用app做的与capsense互动,没有常规蓝牙设备的例程(也是因为这个下载了rt thread studio尝试了下蓝牙连接)。
本次板卡使用arduino uno接口,还完全没有尝试使用,之后想结合wifi蓝牙模块,加上一个arduino uno的屏幕,完成更更多的开发。
另外本次购买的是包含蓝牙wifi模块的板卡,但插上蓝牙wifi后capsense就被挡住了,体验不太友好(滑动的时候会滑倒指甲盖)所以做的是没有使用蓝牙的任务(同一个平台的任务,应该也符合要求吧)。