让Pegasus天马座开发板实现超声波测距

news2024/10/7 9:28:38

在完成《让Pegasus天马座开发板用上OLED屏》后,我觉得可以把超声波测距功能也在Pegasus天马座开发板上实现。于是在箱子里找到了,Grove - Ultrasonic Ranger 这一超声波测传感器。

官方地址: https://wiki.seeedstudio.com/Grove-Ultrasonic_Ranger

 超声波传感器使用

Grove - Ultrasonic Ranger测距模块一般配备有一个标准的Grove接口,使得接线变得简单。通常,这个模块有4个引脚:

  1. VCC:供电引脚,通常连接到5V。
  2. GND:地引脚,连接到微控制器的GND。
  3. SIG:信号引脚,用于传输数据。
  4. NC:未连接(No Connection),通常不用

 其中SIG信号引脚,是触发信号引脚,也是发送测距时长反馈引脚(高电平的时长为超声波往返距离所以使用的时间)。

  • 触发信号: 发送一个大于10us的脉冲信号到SIG引脚
  • 回复信号: 接收脉冲及得到高电平时间长度

按照初中物理声音传播公式:

S = \frac{\frac{}{}T * 340m/s}{2}

我们只要测出公式中T所用的时间,即可得到距离。

硬件接线

为了方便捕获SIG信号高脉冲的宽度,为使用芯片的TIMER2的通道3作为输入捕获口。此通道对应的是PA3这个IO口。如下图所示:

功能实现思路 

  1. 发送出发信号到SIG引脚
    配置PA3推挽输出口,并拉高10us的高电平
  2. 接收SIG引脚并检测高电平时间
    配置PA3为悬浮输入并将TIMER2配置为在通道3启用输入捕获模式。然后,先后捕获上升沿及下降沿时的时间点。通过这两个参数,即可计算得到超声波往返点时间。
  3. 通过得到时间后,套用物理公式即可得到转换后的距离
  4. 得到距离数据后,即可将数值显示到OLED上,实现动态测距

 main.c代码

#include "config.h"
#include "delay.h"
#include "ultrasonic.h"
#include "oled.h"

#define LED_GPIO_PORT       GPIOD
#define LED_PIN  			GPIO_PIN_4

#define BUTTON_GPIO_PORT    GPIOD
#define BUTTON_PIN  		GPIO_PIN_3

static void init_gpio()
{
    GPIO_Init(LED_GPIO_PORT, LED_PIN, GPIO_MODE_OUT_PP_LOW_FAST);
    GPIO_Init(BUTTON_GPIO_PORT, BUTTON_PIN, GPIO_MODE_IN_PU_NO_IT); 
    OLED_Init();   
}
void set_screen_color_and_display(uint8_t cfg)
{
    // BIT0作为屏幕颜色控制  0: 正常显示, 1: 反色显示
    OLED_ColorTurn(cfg & 0x01);
    // BIT1作为屏幕颜色控制  0: 正常显示   1: 屏幕翻转显示  
    OLED_DisplayTurn((cfg >> 1) & 0x01);
}

void main(void)
{
	static uint8_t testBuffer[32] = {0};
	static uint8_t k = 0;
    bool isKeyDown = FALSE;
    uint8_t screenCfg = 0;
    uint8_t t = ' ';
    uint32_t range = 0;
	disable_interrupts();
	for (uint16_t i = 0; i < sizeof(testBuffer); i++)
	{
		testBuffer[i] = i;
	}
	enable_interrupts();
	LOG("Startup...\r\nss");
	DUMP(testBuffer,sizeof(testBuffer));
	init_gpio();

    OLED_ColorTurn(0);//0正常显示,1 反色显示
    OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示  

    while (1)
    {             
        GPIO_WriteReverse(LED_GPIO_PORT,LED_PIN);
        isKeyDown = GPIO_ReadInputPin(BUTTON_GPIO_PORT,BUTTON_PIN) == RESET;
        range = ultrasonic_get_range_in_centimeters();
        LOG("<OLED Test> app_sdcc == %u key %s , range == %lu cm\r\n",k++, isKeyDown ? "down" : "up",range);
        if (isKeyDown == TRUE)
        {
           if (++screenCfg > 3)
           {
                screenCfg = 0;
           }
           set_screen_color_and_display(screenCfg);
           OLED_Clear();       
        }
        OLED_ShowString(25,0,"Pegasus Board",8);
        OLED_ShowString(35,2,"2023/09/20",8);
        OLED_ShowString(20,4,isKeyDown ? "Button Down" : "Button Up  ",8);
        OLED_ShowNum(90,4,range,3,8);
        OLED_ShowString(108,4," cm",8);  
        OLED_ShowString(0,6,"ASCII:",8);  
        OLED_ShowString(63,6,"CODE:",8);
        OLED_ShowChar(48,6,t,8);
        t++;
        if(t>'~')t=' ';
        OLED_ShowNum(103,6,t,3,8);   
        delay(500);
    }
} 


#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  LOG("Wrong parameters value: file %s on line %d\r\n", file, line);	

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

运行效果

让Pegasus天马座开发板实现超声波测距

工程分享

工程下载路径

    

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

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

相关文章

使用postcss-pxtorem插件实现px转换rem

1.下载postcss-pxtorem(其他插件按需下载自行配置)并在package.json同级目录下新建postcss.config.js文件: export const defaultHtmlFontSize 37.5 export default {plugins: {autoprefixer: {overrideBrowserslist: [Android > 4.0, iOS > 7],},postcss-pxtorem: {//…

tensorrt获取输入输出

利用Netron打开onnx&#xff0c;右边名字&#xff1a; int input_index engine->getBindingIndex("inout1.1");int output_index engine->getBindingIndex("191");

NSSCTF做题

[第五空间 2021]WebFTP 打开题目 发现是登录的界面 用admin和password试一下发现不行 用dirsearch扫一下 发现了git泄露 但是用githack下载不下来文件 去网上查了一下webftp 发现是一个在线php文件管理系统 WebFTP——在线FTP工具:强大的PHP在线文件管理系统-時日 在这篇博客…

CentOS7平台命令安装Anaconda3、配置Python3开发环境

要在 CentOS 7 上安装 Anaconda3&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 下载 Anaconda3 安装包&#xff1a; 首先&#xff0c;访问 Anaconda 官方网站以获取最新版本的 Anaconda3 安装包的下载链接。可以使用 wget 命令来下载安装包。请确保选择适用于 Cent…

数字IC设计系列----单端口RAM、双端口RAM

一、单端口RAM原理及实现 1.1、概念/原理 在内存空间中开辟出一段固定大小的内存用于存储数据&#xff0c;每一个数据所占的bit位称之为位宽&#xff0c;这段内存空间中数据的总数称之为深度。例如reg [7:0] mem [255:0]&#xff0c;这段内存空间中每一个数据的位宽为8bit&am…

postgresql用户和角色

postgresql用户和角色 简述创建角色角色属性登录特权超级用户创建数据库创建角色启动复制密码修改角色属性 对象授权撤销授权组和成员删除角色 简述 PostgreSQL 通过角色的概念来控制数据库的访问权限。角色又包含了两种概念&#xff0c;具有登录 权限的角色称为用户&#xff…

Nature Communications | 张阳实验室:端到端深度学习实现高精度RNA结构预测

RNA分子是基因转录的主要执行者&#xff0c;也是细胞运作的隐形功臣。它们在基因表达调控、支架构建以及催化活性等多个生命过程中都扮演着关键角色。虽然RNA如此重要&#xff0c;但由于实验数据的缺乏&#xff0c;准确预测RNA 的三维空间结构仍然是目前计算生物学面临的重大挑…

Flink 内存模型

Jobmanage内存模型 1G 1C 的配置 上图不够直观,用户大脑无法第一反应出内存构成。 Total Process Memory = JVM堆内存 + JVM堆外内存(堆外内存+ JVM元空间 +JVM自身运行内存) Total Flink Memory = JVM堆内存 + 堆外内存 参数控制: Total Process Memory 对应 jobmanag…

2023 “华为杯” 中国研究生数学建模竞赛(C题)深度剖析|数学建模完整代码+建模过程全解全析

华为杯数学建模C题 当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2021年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看研赛的C题呀~&#xff01; 问…

二十四、MySQL事务操作演示

1、事务 &#xff08;1&#xff09;事务简介&#xff1a; &#xff08;2&#xff09;实际操作方式&#xff1a; 在执行MySQL语句时&#xff0c;系统默认自动提交&#xff0c;但是语句一旦出现报错&#xff0c;就可能导致数据出现大规模错误&#xff0c;所以我们要做的就是&…

牛客网解题之跳台阶

10.3 跳台阶 题目链接 牛客网 题目描述 一只青蛙一次可以跳上 1 级台阶&#xff0c;也可以跳上 2 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 解题思路 当 n 1 时&#xff0c;只有一种跳法&#xff1a; 当 n 2 时&#xff0c;有两种跳法&#xff1a; 跳 n 阶台…

【强化学习】03 ——马尔可夫决策过程

文章目录 1. 马尔科夫决策过程(Markov Decision Process&#xff0c;MDP)1.1. 马尔科夫性质1.2. 状态转移矩阵1.3. 马尔可夫过程1.3.1. 一个简单的例子 2. 马尔可夫奖励过程2.1. 回报2.2. 价值函数 3. 马尔科夫决策过程3.1. MDP五元组3.2. 策略3.3. 价值函数3.3.1. 状态价值函数…

MYSQL——命令大全

1.创建数据库&#xff1a; CREAT E DATABASE [IF NOT EXISTS] DATABASE_NAME; 2.查看数据库&#xff1a; SHOW DATABASES; 3.进入数据库 USE DATABASE_NAME; 4.指定字符集&#xff08;character&#xff09;和校对规则&#xff08;collation&#xff09;创建数据库 CREA…

Spring面试题18:Spring中可以注入一个null和一个空字符串吗?Spring中如何注入一个java集合?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring中可以注入一个null和一个空字符串吗? 在Spring中是可以注入null和空字符串的。 注入null:可以使用@Value注解,将属性值设为null。例如:…

ChatGPT可以取代搜索引擎吗?

ChatGPT对于一些简单的问题&#xff0c;可以完美的完成任务。但是我让它写一篇完整的文章&#xff0c;看看它能否代替我进行写作地的时候&#xff0c;我确定它不能完全取代人类。 但是我们可以使用更多的指导来让AI在日常工作流程为我们工作&#xff0c;所以本文将讨论如何有效…

Spimes x5.0主题模板全开源源码

Spimes主题为博客、自媒体、资讯类的网站设计开发&#xff0c;自适应兼容手机、平板设备的团队&#xff0c;工作室门户主题&#xff0c;精心打磨的一处处细节。只为让您的站点拥有速度与优雅兼具的极致体验。小灯泡自媒体博客免授权 安装教程&#xff1a; 1.模板目录usr/them…

[管理与领导-102]:经营与管理的关系:攻守关系;武将文官关系;开疆拓土与守护城池的关系;战斗与练兵的关系;水涨船高,水落船低的关系。

目录 前言&#xff1a; 一、手中拿着锤子,一切看起来都像钉子 1.1 企业经营中过渡强调管理的表现&#xff1f; 1.2 企业经营中过渡强调管理的误区&#xff08;背后深层次的原因&#xff09; 二、无知者的无畏&#xff0c;独断者的自high 2.1 企业经营中过度忽律管理的表…

5个顶级的Blender生成式AI插件

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 Blender 以其强大的 3D 建模和动画工具而闻名。 但你知道它也可以用来制作令人难以置信的纹理和背景吗&#xff1f; 当然&#xff0c;使用正确的插件。 在本文中&#xff0c;我们将了解 Blender 的顶级 AI 插件。 这些插…

普通卷积、转置卷积详细介绍以及用法

转置卷积&#xff08;普通卷积、转置卷积详细介绍以及用法 1、普通卷积操作2、转置卷积2.1 Pytorch转置卷积实验 1、普通卷积操作 首先回顾下普通卷积&#xff0c;下图以stride1&#xff0c;padding0&#xff0c;kernel_size3为例&#xff0c;假设输入特征图大小是4x4的&#…

Kotlin只截取Float小数点后数值DecimalFormat

Kotlin只截取Float小数点后数值DecimalFormat import java.text.DecimalFormatfun main(args: Array<String>) {val pi 3.141516Fvar p pi - pi.toInt()println(p)val decimalFormat DecimalFormat("00.0000")val format decimalFormat.format(p)println(…