12浏览
查看: 12|回复: 4

[项目] 【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示

[复制链接]
【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图2

什么是 CanMV K230?
CanMV K230是一款高性价比的RISC-V边缘AI平台,凭借低功耗、强视觉处理能力和开放的开发生态,成为嵌入式AI开发的理想选择,尤其适合需要快速部署视觉与AI功能的创客、中小企业及教育场景。CanMV 是一套 AI 视觉开发平台,K230 是其核心芯片。该模块结合了图像采集、AI推理、边缘计算等能力,适合嵌入式视觉应用开发。

CanMV:类似 OpenMV 的图像处理框架,支持 Python 编程,简化视觉识别开发流程。
K230 芯片:嘉楠科技推出的 AIoT SoC,采用 RISC-V 架构,内置第三代 KPU(AI加速单元),算力高达 6 TOPS,性能是 K210 的 13.7 倍。


【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图1

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图3

驴友花雕  高级技神
 楼主|

发表于 5 小时前

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示

知识点
触摸显示是 “显示面板 + 触摸感应技术” 的结合体,能让用户通过手指或触控笔直接与屏幕交互(如点击、滑动、缩放),核心是在显示图像的同时,实时定位并识别触摸动作,实现 “所见即所控”。

1、核心组成:显示与触摸的结合
触摸显示的功能实现依赖两大核心模块,二者需协同工作:
显示模块:即常规的屏幕面板(如 LCD、OLED、Mini/Micro LED),负责输出图像,是触摸交互的 “视觉载体”。
触摸模块:集成在显示面板表面或内部的感应层,负责检测触摸位置和动作,是 “交互输入载体”。

2、主流触摸技术原理(按应用场景分)

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图2

3、关键技术指标(影响使用体验)
触控点数:支持同时识别的触摸位置数量,电容式普遍支持 10 点以上(如手机双手缩放),电阻式仅支持 1 点。
响应速度:触摸动作到屏幕反馈的时间,通常要求<50ms(游戏、绘画场景需更快,<10ms)。
触摸精度:定位触摸点的误差范围,手机 / 平板需<1mm,大尺寸会议屏允许<5mm。
环境适应性:包括防水(如手机 IP68 触控)、抗干扰(如避免电磁信号影响)、低温 / 高温稳定性(工业场景)。

4、典型应用场景
消费电子:手机、平板、笔记本触控板、智能手表(如 Apple Watch)。
办公 / 商用:会议大屏、自助终端(如银行 ATM、商场导购屏)、POS 收银机。
工业 / 医疗:工业控制面板(如生产线设备)、医疗诊断仪(需防菌触摸)。
家居 / 车载:智能中控屏(如冰箱、空调)、车载触控屏(需抗高温、防眩光)。

5、发展趋势
“屏内触摸”(In-Cell/On-Cell):将触摸感应层集成到显示面板内部(如 OLED 屏),减少屏幕厚度,提升透光率(如手机全面屏)。
柔性触摸:配合柔性 OLED 屏,实现可折叠 / 卷曲设备的触控(如折叠屏手机)。
触控反馈:结合振动马达(如手机 “线性马达”),触摸时提供物理反馈(如点击时震动),增强交互真实感。

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图1

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图3

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 5 小时前

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示

用CanMV IDE打开例程代码,将K230用USB连接到电脑上

点击左下角运行按钮即可开始运行程序

初始界面是白色的

用手指在屏幕上移动,可以看到随着手指的移动,屏幕上绘制出黑色的线条。

项目测试实验代码

  1. #【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示
  2. # Import required modules
  3. # 导入所需的模块
  4. import time, os, urandom, sys
  5. # Import display and media related modules
  6. # 导入显示和媒体相关模块
  7. from media.display import *
  8. from media.media import *
  9. # Import touch sensor module
  10. # 导入触摸传感器模块
  11. from machine import TOUCH
  12. # Initialize touch sensor on pin 0
  13. # 在引脚0上初始化触摸传感器
  14. tp = TOUCH(0)
  15. # Define display resolution constants
  16. # 定义显示分辨率常量
  17. DISPLAY_WIDTH = 640
  18. DISPLAY_HEIGHT = 480
  19. def display_test():
  20.     """
  21.     Function to test display and touch functionality
  22.     测试显示和触摸功能的函数
  23.     """
  24.     print("display and touch test")
  25.     # Create main background image with white color
  26.     # 创建白色背景的主图像
  27.     img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888)
  28.     img.clear()
  29.     img.draw_rectangle(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, color=(255,255,255), fill=True)
  30.     # Create secondary image for drawing
  31.     # 创建用于绘画的次要图像
  32.     img2 = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888)
  33.     img2.clear()
  34.     # Initialize display with ST7701 driver
  35.     # 使用ST7701驱动初始化显示器
  36.     Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
  37.     # Initialize media manager
  38.     # 初始化媒体管理器
  39.     MediaManager.init()
  40.     try:
  41.         # Variables to store previous touch coordinates
  42.         # 存储上一次触摸坐标的变量
  43.         last_x = None
  44.         last_y = None
  45.         while True:
  46.             os.exitpoint()
  47.             # Read touch point data
  48.             # 读取触摸点数据
  49.             point = tp.read(1)
  50.             if len(point):
  51.                 print(point)
  52.                 pt = point[0]
  53.                 # Handle touch events (down or move)
  54.                 # 处理触摸事件(按下或移动)
  55.                 if pt.event == 0 or pt.event == TOUCH.EVENT_DOWN or pt.event == TOUCH.EVENT_MOVE:
  56.                     if((last_x is not None) and (last_y is not None) and pt.event is not 2):
  57.                         # Draw line between previous and current touch points
  58.                         # 在上一个触摸点和当前触摸点之间画线
  59.                         img2.draw_line(last_x, last_y, pt.x, pt.y, color=(0,0,0), thickness=5)
  60.                         Display.show_image(img2, layer=Display.LAYER_OSD2, alpha=128)
  61.                     last_x = pt.x
  62.                     last_y = pt.y
  63.             # Update display with background image
  64.             # 更新显示背景图像
  65.             Display.show_image(img)
  66.             time.sleep(0.05)
  67.     except KeyboardInterrupt as e:
  68.         print("user stop: ", e)
  69.     except BaseException as e:
  70.         print(f"Exception {e}")
  71.     # Cleanup and deinitialize display
  72.     # 清理并反初始化显示器
  73.     Display.deinit()
  74.     os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
  75.     time.sleep_ms(100)
  76.     # Release media resources
  77.     # 释放媒体资源
  78.     MediaManager.deinit()
  79. if __name__ == "__main__":
  80.     # Enable exit points and run display test
  81.     # 启用退出点并运行显示测试
  82.     os.exitpoint(os.EXITPOINT_ENABLE)
  83.     display_test()
复制代码

代码结构

1、基础设置:
导入必要模块
初始化触摸设备
定义显示常量
创建和初始化图像
初始化显示器和媒体管理器

2、主循环中:
检查是否需要退出
读取触摸数据
如果有触摸点:
检查触摸事件类型
如果有上一个坐标点,绘制连线
更新坐标
显示图像
短暂休眠

3、异常处理:
处理键盘中断
处理其他异常

4、清理工作:
销毁显示器
启用休眠模式
释放媒体缓冲区


TOUCH 相关资料
1. 概述
触摸模块基于 RTT 的触摸框架,支持单点和多点电容触摸屏及电阻触摸屏。

2. API 介绍
TOUCH 类位于 machine 模块下。

示例

  1. from machine import TOUCH
  2. # 实例化 TOUCH 设备 0
  3. tp = TOUCH(0)
  4. # 获取 TOUCH 数据
  5. p = tp.read()
  6. print(p)
  7. # 打印触摸点坐标
  8. # print(p[0].x)
  9. # print(p[0].y)
  10. # print(p[0].event)
复制代码

构造函数


  1. # when index is 0
  2. touch = TOUCH(index, type = TOUCH.TYPE_CST328, rotate = -1)
  3. # when index is 1
  4. touch = TOUCH(index, type = TOUCH.TYPE_CST328, rotate = -1, range_x = -1, range_y = -1, i2c : I2C = None, slave_addr = None, rst : Pin = None, int : Pin = None)
复制代码

参数

index: TOUCH 设备号,为 0 时,表示使用系统自带的触摸,为 1 时,表示使用 CanMV 专有的触摸驱动
type: 触摸驱动类型,具体定义参考触摸类型
rotate: 面板输出坐标与屏幕坐标的旋转,取值范围为 [0-3],具体定义参考坐标旋转。
range_x: index=1 时有效,触摸输出坐标的宽度最大值
range_y: index=1 时有效,触摸输出坐标的高度最大值
i2c: index=1 时有效,触摸使用 I2C 总线对象
slave_addr: index=1 时有效,触摸芯片的从机地址,可选参数,不传入使用驱动默认值
rst: index=1 时有效,触摸复位引脚对象
int: index=1 时有效,触摸中断引脚对象,当前不支持

read 方法
  1. TOUCH.read([count])
复制代码

获取触摸数据。
参数
count: 最多读取的触摸点数量,取值范围为 [0:10],默认为 0,表示读取所有触摸点。
返回值
返回触摸点数据,类型为元组 ([tp[, tp...]]),其中每个 tp 是一个 touch_info 类实例。

deinit 方法
  1. TOUCH.deinit()
复制代码

释放 TOUCH 资源。
参数

返回值


3. TOUCH_INFO 类
TOUCH_INFO 类用于存储触摸点的信息,用户可通过相关只读属性访问。

event: 事件码,具体参考触摸事件。
track_id: 触点 ID,用于多点触摸。
width: 触点宽度。
x: 触点的 x 坐标。
y: 触点的 y 坐标。
timestamp: 触点时间戳。

4. 常量
4.1 触摸事件
EVENT_NONE: 无事件。
EVENT_UP: 触摸按下后抬起。
EVENT_DOWN: 触摸按下开始。
EVENT_MOVE: 触摸按下后移动。
4.2 坐标旋转
ROTATE_0: 坐标不旋转。
ROTATE_90: 坐标旋转 90 度。
ROTATE_180: 坐标旋转 180 度。
ROTATE_270: 坐标旋转 270 度。
4.3 触摸类型
TYPE_CST328: CanMV 专有触摸驱动
TYPE_CST226SE: CanMV 专有触摸驱动
TYPE_GT911: CanMV 专有触摸驱动

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示

实验场景图  动态图

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图1

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图3

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图4

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图2


【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图5

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示

【花雕动手做】CanMV K230 AI视觉识别模块之使用触摸显示图1
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail