|
6196| 6
|
[ESP8266/ESP32] ESP32S2 实现触摸屏 |
|
本帖最后由 zoologist 于 2022-4-16 20:16 编辑 参照Teensy的触摸【参考1】,在 ESP32 S2 上实现了触摸屏。最关键的步骤有2个: 1. 正确的 HID Descriptor,下面是一个10指触摸的触摸屏幕的描述符
对应发送的数据结构是: 其中 Byte0 Bit0 是按下标志,一直为1,Bit1-7 是按键压力;Byte1是按键编号,从 0-255,可以理解为手指编号,比如:右手食指按下,编号为0;右手中指按下,编号为1;右手抬起后再次按下,会重新分配一个编号。Byte2-3按键的X坐标;Byte4-5按键的Y坐标;Byte6-7是按压发生的事件,是以 100us为单位;Byte8是当前正在发生的按压事件中触摸点的数量。在【参考2】有一个例子: ![]() Table 7 Report Sequence for Two Contacts with Separated Lift(Two-Finger Hybrid)
图中是2个手指 图中是2个手指进行触摸的例子,R1 会分别报告手指1和2移动的信息,同时 Byte8 的 Contract Count 会等于2;R6的时候,因为手指1已经抬起,所以Contract Count会变成1. .另外一个重要的,容易被忽视的要求:Get Report 的处理。即使上面的描述符正确报告,然后数据也正常发送到Windows中,你的触摸屏依然无法正常工作,原因就是缺少了对Get Report的处理。更糟糕的是:你无法使用 USBlyzer 这样的工具抓到 Teensy 中的数据。 ![]() Teensy 例子中上位机发送 GET_REPORT 收到返回值0x0a 如果不在代码中特别处理,对于这个命令会 STALL ![]() 关于这个 COMMAND 的含义,目前没搞清楚【参考3】 对于我们来说,只要有一个返回值就能让它工作正常。最终一个可以工作的代码如下: 再复杂一点,做一个画圆的: 测试结果: ![]() 视频: 就是这样,不要问这个能干啥, 还没想好。 参考: |
|
看了你上面描述还有下面的评论,修改你提供的第一个例程进行2个触控点的测试,在win10系统上始终没有正确反馈,不知道是什么原因?一旦设置成2个触控点,就无法反馈,测试代码只改了下面,不知道哪里不对? void loop() { if (HID.ready()) { Serial.println("Finger"); // touch report // 0: on/off + pressure // 1: contact id // 2: X lsb // 3: X msb // 4: Y lsb // 5: Y msb // 6: scan time lsb // 7: scan time msb // 8: contact count for (int i = 0; i < 16000; i += 100) { int scan_time = millis() * 10; TouchData[0] = 0x81; TouchData[1] = 0x01;//触控点1 TouchData[2] = (12000) & 0xFF; TouchData[3] = ((12000) >> 8) & 0xFF; TouchData[4] = (4000 + i) & 0xFF; TouchData[5] = ((4000 + i) >> 8) & 0xFF; TouchData[6] = (scan_time) & 0xFF; TouchData[7] = (scan_time >> 8) & 0xFF;//使用相同时间标签与使用不同时间标签 TouchData[8] = 0x02;//修改成2个触控点 Device.send(TouchData); delay(10); scan_time = millis() * 10; TouchData[0] = 0x81; TouchData[1] = 0x02;//触控点2 TouchData[2] = (16000) & 0xFF; TouchData[3] = ((16000) >> 8) & 0xFF; TouchData[4] = (4000 + i) & 0xFF; TouchData[5] = ((4000 + i) >> 8) & 0xFF; TouchData[6] = (scan_time) & 0xFF; TouchData[7] = (scan_time >> 8) & 0xFF;//使用相同时间标签与使用不同时间标签 TouchData[8] = 0x02;//修改成2个触控点 Device.send(TouchData); delay(10); } //每隔10秒 delay(5000); } } |
|
看了你上面描述还有下面的评论,修改你提供的第一个例程进行2个触控点的测试,在win10系统上始终没有正确反馈,不知道是什么原因?一旦设置成2个触控点,就无法反馈,测试代码只改了下面,不知道哪里不对? void loop() { if (HID.ready()) { Serial.println("Finger"); // touch report // 0: on/off + pressure // 1: contact id // 2: X lsb // 3: X msb // 4: Y lsb // 5: Y msb // 6: scan time lsb // 7: scan time msb // 8: contact count for (int i = 0; i < 16000; i += 100) { int scan_time = millis() * 10; TouchData[0] = 0x81; TouchData[1] = 0x01;//触控点1 TouchData[2] = (12000) & 0xFF; TouchData[3] = ((12000) >> 8) & 0xFF; TouchData[4] = (4000 + i) & 0xFF; TouchData[5] = ((4000 + i) >> 8) & 0xFF; TouchData[6] = (scan_time) & 0xFF; TouchData[7] = (scan_time >> 8) & 0xFF;//使用相同时间标签与使用不同时间标签 TouchData[8] = 0x02;//修改成2个触控点 Device.send(TouchData); delay(10); scan_time = millis() * 10; TouchData[0] = 0x81; TouchData[1] = 0x02;//触控点2 TouchData[2] = (16000) & 0xFF; TouchData[3] = ((16000) >> 8) & 0xFF; TouchData[4] = (4000 + i) & 0xFF; TouchData[5] = ((4000 + i) >> 8) & 0xFF; TouchData[6] = (scan_time) & 0xFF; TouchData[7] = (scan_time >> 8) & 0xFF;//使用相同时间标签与使用不同时间标签 TouchData[8] = 0x02;//修改成2个触控点 Device.send(TouchData); delay(10); } //每隔10秒 delay(5000); } } |
创客造
编辑选择奖
编辑选择奖
沪公网安备31011502402448© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed