树莓派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…

解锁豆瓣高清海报(二) 使用 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…

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

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

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

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

无人机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接口…

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;跳…

【Redis】List 类型的介绍和常用命令

1. 介绍 Redis 中的 list 相当于顺序表&#xff0c;并且内部更接近于“双端队列”&#xff0c;所以也支持头插和尾插的操作&#xff0c;可以当做队列或者栈来使用&#xff0c;同时也存在下标的概念&#xff0c;不过和 Java 中的下标不同&#xff0c;Redis 支持负数下标&#x…

携程Java开发面试题及参考答案 (200道-上)

说说四层模型、七层模型。 七层模型(OSI 参考模型) 七层模型,即 OSI(Open System Interconnection)参考模型,是一种概念模型,用于描述网络通信的架构。它将计算机网络从下到上分为七层,各层的功能和作用如下: 物理层:物理层是计算机网络的最底层,主要负责传输比特流…

IM 即时通讯系统-51-MPush开源实时消息推送系统

IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术&#xff0c;提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…

AlexNet论文代码阅读

论文标题&#xff1a; ImageNet Classification with Deep Convolutional Neural Networks 论文链接&#xff1a; https://volctracer.com/w/BX18q92F 代码链接&#xff1a; https://github.com/dansuh17/alexnet-pytorch 内容概述 训练了一个大型的深度卷积神经网络&#xf…

扩散模型(三)

相关阅读&#xff1a; 扩散模型&#xff08;一&#xff09; 扩散模型&#xff08;二&#xff09; Latent Variable Space 潜在扩散模型&#xff08;LDM&#xff1b;龙巴赫、布拉特曼等人&#xff0c;2022 年&#xff09;在潜在空间而非像素空间中运行扩散过程&#xff0c;这…

git基础使用--4---git分支和使用

文章目录 git基础使用--4---git分支和使用1. 按顺序看2. 什么是分支3. 分支的基本操作4. 分支的基本操作4.1 查看分支4.2 创建分支4.3 切换分支4.4 合并冲突 git基础使用–4—git分支和使用 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念…

8.攻防世界Web_php_wrong_nginx_config

进入题目页面如下 尝试弱口令密码登录 一直显示网站建设中&#xff0c;尝试无果&#xff0c;查看源码也没有什么特别漏洞存在 用Kali中的dirsearch扫描根目录试试 命令&#xff1a; dirsearch -u http://61.147.171.105:53736/ -e* 登录文件便是刚才登录的界面打开robots.txt…