当前位置: 首页 > ai >正文

sr04模块总结

设备树添加

	/*sr04 gpio4 21 gpio4 22*/
/{sr04 {compatible = "imx6ull,sr04";pinctrl-names = "default";pinctrl-0 = <&pinctrl_sr04>;// TRIG 引脚和 ECHO 引脚trig-gpios = <&gpio4 21 GPIO_ACTIVE_HIGH>;  // TRIG 引脚配置echo-gpios = <&gpio4 22 GPIO_ACTIVE_HIGH>;  // ECHO 引脚配置status = "okay";};
}

驱动代码

sr04工作原理:
在这里插入图片描述
驱动代码实现:

/** 中断处理函数:当echo信号变化时触发* 负责记录回声信号的开始和结束时间,并通过等待队列通知主程序* 上升沿开始,下降沿结束*/
static irqreturn_t sr04_isr(int irq, void *dev_id)
{int val = gpiod_get_value(sr04_echo); // 获取echo信号的电平u64 now = ktime_get_ns();             // 获取当前时间戳if (val) { // 回声信号的上升沿,表示回声开始echo_start_time = now;} else { // 回声信号的下降沿,表示回声结束echo_time = now - echo_start_time; // 计算回声时间echo_done = true;                  // 设置回声完成标志wake_up_interruptible(&sr04_wait); // 唤醒等待队列}return IRQ_HANDLED; // 标记中断已处理
}/*
*读取传感器接收的信号,引用程序
*/
static ssize_t sr04_read(struct file *file, char __user *buf, size_t size, loff_t *off)
{int ret;// 发出触发脉冲:先设置trig为高电平,然后立即设置为低电平,产生超声波信号gpiod_set_value(sr04_trig, 1);udelay(12); // 延时12微秒gpiod_set_value(sr04_trig, 0); echo_done = false; // 重置回声完成标志// 等待回声完成(1秒超时)ret = wait_event_interruptible_timeout(sr04_wait, echo_done, HZ);if (ret == 0) // 如果超时,返回-ETIMEDOUTreturn -ETIMEDOUT;// 将回声时间(纳秒)传输到用户空间if (copy_to_user(buf, &echo_time, sizeof(u64)))return -EFAULT;return sizeof(u64); // 返回复制的字节数
}

应用程序代码

使用read读取echo引脚的高电平时间,然后将电平时间转换为距离

#include "sr04.h"
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <QDebug>
#include <QThread>distance::distance()
{stop = 0;distanceData = 0;
}distance::~distance()
{
}void distance::run()
{// 打开设备节点int fd = open("/dev/sr04", O_RDONLY);if (fd < 0) {qDebug() << "sr04 open failed! errno=" << errno;return;}while (!stop) {u64 echo_time = 0;// 调用 read() 读取 echo_time(单位:纳秒)ssize_t ret = read(fd, &echo_time, sizeof(echo_time));if (ret < 0) {qDebug() << "sr04 read failed! errno=" << errno;} else if (ret == sizeof(echo_time)) {// 将时间转为距离,单位:cm// 声速 = 343m/s = 34300 cm/s// 距离 = (时间 / 1e9) * 34300 / 2distanceData = (echo_time / 1e9) * 34300 / 2;qDebug() << "Distance:" << distanceData << "cm";} else {qDebug() << "sr04 read size error!";}QThread::msleep(1000);  // 1秒读取一次}close(fd);
}void distance::distanceStop()
{stop = 1;
}

QT程序

距离检测线程启动

    // 启动距离感应线程myDistance = new distance();  // 创建距离感应线程对象myDistance->start();  // 启动线程ui->lineEdit_3->setText("距离:0cm");  // 设置距离为0
``
http://www.xdnf.cn/news/18936.html

相关文章:

  • Scala面试题及详细答案100道(41-50)-- 模式匹配
  • MySQL底层数据结构与算法浅析
  • 捡捡java——2、基础05
  • 部署2.516.2版本的jenkins,同时适配jdk8
  • 【Windows】netstat命令解析及端口状态解释
  • React过渡更新:优化渲染性能的秘密
  • Vue3组件加载顺序
  • MySQL 索引
  • THM Whats Your Name WP
  • SDK、JDK、JRE、JVM的区别
  • python使用sqlcipher4对sqlite数据库加密
  • Mip-splatting
  • GCC版本和C语言标准版本的对应关系
  • java去图片水印的方法
  • 生产环境Vue组件报错:Cannot access before initialization
  • 使用qianjkun uniapp 主应用 集成 vue微应用
  • 8.28作业
  • 可改善能源利用水平、削减碳排放总量,并为可再生能源规模化发展提供有力支撑的智慧能源开源了
  • Python Imaging Library (PIL) 全面指南:Python Imaging Library (PIL)基础图像处理入门
  • 【图像处理基石】DCT在图像处理中的应用及实现
  • 从零开始学习JavaWeb-20
  • 第二十节:3D文本渲染 - 字体几何体生成与特效
  • Node.js终极文本转图指南
  • 使用 Action 自动部署 VuePress 到 GitHub Pages
  • Webdriver-Manager 4.0.1启动错误解决
  • Komo Searc-AI驱动的搜索引擎
  • 区块链+隐私计算护航“东数西算”数据安全报告
  • 20.22 QLoRA微调实战:中文语音识别数据准备全流程解密
  • hintcon2025No Man‘s Echo
  • 国产芯力量!贴片式SD卡搭载北京君正Rk瑞芯微,打造嵌入式存储低延迟+高可靠黄金组合​