树莓派pico入坑笔记,触摸引脚

这里主要是扒一扒官方是如何实现触摸引脚的功能的,rp2040本身是不支持触摸传感的,那么官方是怎么实现的呢,这件事一直困扰着我,在官方给出的使用中,要求外接一颗至少为1M欧姆的电阻下拉,然后就可以使用触摸引脚了,并没有指定要求引脚的属性,比如必须是ADC引脚。

一、触摸引脚的基本概念

触摸引脚技术是一种通过检测引脚上的电容变化或电压变化来实现触摸功能的技术。它广泛应用于触摸屏、触摸按键等场景。有多种方式实现触摸功能,包括电容触摸和电阻触摸等。

二、电容触摸引脚的实现原理

1. 电容触摸的基本原理

电容触摸是基于电容变化来检测触摸的。当手指靠近触摸引脚时,人体的电容会与引脚形成一个电容耦合,导致引脚上的电容值发生变化。通过检测这种电容变化,可以判断是否发生了触摸操作。

  • 当手指靠近时,电容增大,电荷量也会相应变化,从而导致电压发生变化。
  • 电容增大,导致放电时间发生变化。
2. 电容触摸实现

微控制器可以通过其内部的ADC(模数转换器)和定时器来实现电容触摸功能。具体步骤如下:

  1. 初始化引脚:将触摸引脚配置为输入模式,并连接到ADC通道。
  2. 充电过程:通过定时器控制,对触摸引脚充电到一个固定电压(如VDD)。
  3. 放电检测:断开充电源,让引脚通过内部电阻放电,同时通过ADC采样引脚电压。
  4. 计算电容变化:根据ADC采样值的变化,计算出电容的变化量。如果电容变化超过阈值,则判断为触摸。
3. 优点与缺点
  • 优点:非接触式,灵敏度高,使用寿命长。
  • 缺点:容易受到电磁干扰,需要复杂的算法来消除噪声。

三、官方的实现

地址circuitpython/shared-module/touchio/TouchIn.c at main · adafruit/circuitpython (github.com)

核心代码

static uint16_t get_raw_reading(touchio_touchin_obj_t *self) {uint16_t ticks = 0;for (uint16_t i = 0; i < N_SAMPLES; i++) {// set pad to digital output high for 10us to charge itcommon_hal_digitalio_digitalinout_switch_to_output(self->digitalinout, true, DRIVE_MODE_PUSH_PULL);mp_hal_delay_us(10);// set pad back to an input and take some samplescommon_hal_digitalio_digitalinout_switch_to_input(self->digitalinout, PULL_NONE);while (common_hal_digitalio_digitalinout_get_value(self->digitalinout)) {if (ticks >= TIMEOUT_TICKS) {return TIMEOUT_TICKS;}ticks++;}}return ticks;
}

该函数用于获取原始的触摸感应读数。

  1. 循环 N_SAMPLES 次进行采样。
  2. 在每次采样中,将引脚设置为数字输出并拉高 10 微秒以对电容充电。
  3. 然后将引脚设置为高阻抗输入,通过一个忙等待循环来测量电容放电所需的时间(以 ticks 为单位)。
  4. 如果 ticks 超过 TIMEOUT_TICKS,则返回 TIMEOUT_TICKS

四、具体步骤如下:

  1. 初始化变量

    uint16_t ticks = 0;
    
     

    定义一个变量 ticks 用于记录电容放电所需的时间(以时钟周期为单位),初始值为 0。

  2. 多次采样循环

    for (uint16_t i = 0; i < N_SAMPLES; i++) {
    
     

    通过 for 循环进行 N_SAMPLES 次采样,这样做的目的是为了减少噪声的影响,提高读数的准确性。

  3. 对电容充电

    common_hal_digitalio_digitalinout_switch_to_output(self->digitalinout, true, DRIVE_MODE_PUSH_PULL);
    mp_hal_delay_us(10);
    
     
    • common_hal_digitalio_digitalinout_switch_to_output 函数将连接触摸感应垫的引脚设置为数字输出模式,并将其电平拉高。
    • mp_hal_delay_us(10) 函数使程序暂停 10 微秒,确保电容有足够的时间充电。
  4. 电容放电并计数

    common_hal_digitalio_digitalinout_switch_to_input(self->digitalinout, PULL_NONE);while (common_hal_digitalio_digitalinout_get_value(self->digitalinout)) {if (ticks >= TIMEOUT_TICKS) {return TIMEOUT_TICKS;}ticks++;
    }
    
     
    • common_hal_digitalio_digitalinout_switch_to_input 函数将引脚切换为高阻抗输入模式,此时电容开始通过连接到地的电阻放电。
    • while 循环持续检查引脚的电平,只要引脚电平为高,就不断增加 ticks 的值。
    • 如果 ticks 的值超过了 TIMEOUT_TICKS,说明电容放电时间过长,可能存在问题,函数将直接返回 TIMEOUT_TICKS
  5. 返回读数

    return ticks;
    
     

    经过 N_SAMPLES 次采样后,函数返回最终的 ticks 值,该值反映了电容放电所需的总时间,可用于后续判断是否有触摸动作。

优点
  • 简单易懂:代码逻辑清晰,通过简单的数字引脚操作和循环计数实现了电容式触摸感应的基本功能,易于理解和实现。
  • 可配置性:通过调整 N_SAMPLES 和 TIMEOUT_TICKS 等宏定义的值,可以根据实际需求调整采样次数和超时阈值,提高了代码的灵活性。
  • 抗噪声能力:多次采样取平均的方式可以有效减少噪声对读数的影响,提高了触摸感应的准确性。
缺点
  • 精度有限:使用忙等待循环来计数电容放电时间,其精度受限于系统时钟频率和循环开销,可能无法满足对精度要求较高的应用场景。
  • 性能较低:忙等待循环会占用 CPU 资源,导致系统在采样期间无法执行其他任务,影响系统的整体性能。
  • 环境适应性差:该方法对环境变化较为敏感,如温度、湿度等因素可能会影响电容的充电和放电特性,从而导致读数不准确。

总结

实现方法非常巧妙,利用寄生电容充放电以及普通gpio检测电平,只需要外接大电阻下拉就可以低成本实现触摸检测,同时多次采样可以降低误差。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

deepseek本地部署+结合思路

deepseek本地部署 配置&#xff1a; 建议配置 运行内存16GB 显卡&#xff1a;4060 操作系统&#xff1a;win11/win10 存储&#xff1a;512GB 一、安装Python 3.11环境&#xff08;参见&#xff09; 超详细的Python安装和环境搭建教程_python安装教程-CSDN博客 二、安装…

加载数据,并切分

# Step 3 . WebBaseLoader 配置为专门从 Lilian Weng 的博客文章中抓取和加载内容。它仅针对网页的相关部分&#xff08;例如帖子内容、标题和标头&#xff09;进行处理。 加载信息 from langchain_community.document_loaders import WebBaseLoader loader WebBaseLoader(w…

AI(计算机视觉)自学路线

本文仅用来记录一下自学路线方便日后复习&#xff0c;如果对你自学有帮助的话也很开心o(*&#xffe3;▽&#xffe3;*)ブ B站吴恩达机器学习->B站小土堆pytorch基础学习->opencv相关知识&#xff08;Halcon或者opencv库&#xff09;->四类神经网络&#xff08;这里跟…

计算机组成原理——存储系统(二)

&#x1f331; "人生最深的裂痕&#xff0c;往往是光照进来的地方。 别怕脚下的荆棘&#xff0c;那是你与平庸划清界限的勋章&#xff1b;别惧眼前的迷雾&#xff0c;星辰永远藏在云层之上。真正的强者不是从未跌倒&#xff0c;而是把每一次踉跄都踏成攀登的阶梯。记住&am…

解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩

解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩 脚本地址: 项目地址: Gazer PixelWeaver.py pixel_squeezer_cv2.py 前瞻 继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后&#xff0c;本文将介绍如何使用 OpenCV 对这些海报进行智…

OSCP - Proving Grounds - Roquefort

主要知识点 githook 注入Linux path覆盖 具体步骤 依旧是nmap扫描开始&#xff0c;3000端口不是很熟悉&#xff0c;先看一下 Nmap scan report for 192.168.54.67 Host is up (0.00083s latency). Not shown: 65530 filtered tcp ports (no-response) PORT STATE SERV…

记忆化搜索和动态规划 --最长回文子串为例

记忆化搜索 记忆化搜索是一种优化递归算法的方法&#xff0c;通过将已经计算过的子问题的结果存储起来&#xff08;通常使用哈希表或数组&#xff09;&#xff0c;避免重复计算相同的子问题。 本质上是通过缓存中间结果来减少计算的重复性。 动态规划 动态规划是通过将问题分…

最新功能发布!AllData数据中台核心菜单汇总

🔥🔥 AllData大数据产品是可定义数据中台,以数据平台为底座,以数据中台为桥梁,以机器学习平台为中层框架,以大模型应用为上游产品,提供全链路数字化解决方案。 ✨奥零数据科技官网:http://www.aolingdata.com ✨AllData开源项目:https://github.com/alldatacenter/…

Windows图形界面(GUI)-QT-C/C++ - QT Stacked Widget

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 多步表单 2. 选项卡界面 3. 状态机界面 三、常见样式 四、属性设置 1. 页面管理 2. 布局管理 3. 信号与槽 五、内容处理 1. 添加页面 2. 移除页面 3.…

TensorFlow 简单的二分类神经网络的训练和应用流程

展示了一个简单的二分类神经网络的训练和应用流程。主要步骤包括&#xff1a; 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与部署 加载和应用已训练的模型 1. 数据准备与预处理 在本例中&#xff0c;数据准备是通过两个 Numpy 数…

Compose笔记(三)--DisposableEffect

这一节了解一下DisposableEffect&#xff0c;它是一个可组合函数&#xff0c;主要用于在可组合项进入组合时执行初始化操作&#xff0c;并且在可组合项从组合中移除时执行相应的清理操作。其核心目的是管理与可组合项生命周期相关的资源&#xff0c;避免资源泄漏&#xff0c;比…

【PDF提取局部内容改名】批量获取PDF局部文字内容改名 基于QT和百度云api的完整实现方案

应用场景 1. 档案管理 在企业或机构的档案管理中&#xff0c;常常会有大量的 PDF 格式的文件&#xff0c;如合同、报告、发票等。这些文件的原始文件名可能没有明确的标识&#xff0c;不利于查找和管理。通过批量获取 PDF 局部文字内容并改名&#xff0c;可以根据文件中的关键…

无人机PX4飞控 | PX4源码添加自定义uORB消息并保存到日志

PX4源码添加自定义uORB消息并保存到日志 0 前言 PX4的内部通信机制主要依赖于uORB&#xff08;Micro Object Request Broker&#xff09;&#xff0c;这是一种跨进程的通信机制&#xff0c;一种轻量级的中间件&#xff0c;用于在PX4飞控系统的各个模块之间进行高效的数据交换…

XCCL、NCCL、HCCL通信库

XCCL提供的基本能力 XCCL提供的基本能力 不同的XCCL 针对不同的网络拓扑&#xff0c;实现的是不同的优化算法的&#xff08;不同CCL库最大的区别就是这&#xff09; 不同CCL库还会根据自己的硬件、系统&#xff0c;在底层上面对一些相对应的改动&#xff1b; 但是对上的API接口…

AI大模型开发原理篇-5:循环神经网络RNN

神经概率语言模型NPLM也存在一些明显的不足之处:模型结构简单&#xff0c;窗口大小固定&#xff0c;缺乏长距离依赖捕捉&#xff0c;训练效率低&#xff0c;词汇表固定等。为了解决这些问题&#xff0c;研究人员提出了一些更先进的神经网络语言模型&#xff0c;如循环神经网络、…

Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册

文章目录 前言1.关于LibrePhotos2.本地部署LibrePhotos3.LibrePhotos简单使用4. 安装内网穿透5.配置LibrePhotos公网地址6. 配置固定公网地址 前言 想象一下这样的场景&#xff1a;你有一大堆珍贵的回忆照片&#xff0c;但又不想使用各种网盘来管理。怎么办&#xff1f;别担心…

【Java计算机毕业设计】基于Springboot的物业信息管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

深入解析Python机器学习库Scikit-Learn的应用实例

深入解析Python机器学习库Scikit-Learn的应用实例 随着人工智能和数据科学领域的迅速发展&#xff0c;机器学习成为了当下最炙手可热的技术之一。而在机器学习领域&#xff0c;Python作为一种功能强大且易于上手的编程语言&#xff0c;拥有庞大的生态系统和丰富的机器学习库。其…

高斯光束介绍及光斑处理

常规激光器的光斑为高斯光斑&#xff0c;即中心能量集中&#xff0c;边缘能量较低。一般定义光强的处为高斯光束的半径。高斯光斑的传输由光斑半径、远场发散角、波长等决定。 其中为位置z处的光斑半径&#xff0c;w(z), k2pi/λ为波矢&#xff0c;λ为光波长&#xff0c;R为高…

C++哈希(链地址法)(二)详解

文章目录 1.开放地址法1.1key不能取模的问题1.1.1将字符串转为整型1.1.2将日期类转为整型 2.哈希函数2.1乘法散列法&#xff08;了解&#xff09;2.2全域散列法&#xff08;了解&#xff09; 3.处理哈希冲突3.1线性探测&#xff08;挨着找&#xff09;3.2二次探测&#xff08;跳…