【STM32】【HAL库】遥控关灯2 分机

2023-11-04

相关连接

【STM32】【HAL库】遥控关灯0 概述

【STM32】【HAL库】遥控关灯1主机

【STM32】【HAL库】遥控关灯2 分机

【STM32】【HAL库】遥控关灯3 遥控器

需求

接收RF433和红外信号,根据信号内容控制舵机

硬件设计

主控采用stm32F103c6

STM32

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTpXZCoT-1676130507363)(picture/1.png)]

433接收

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WsUmue6W-1676130507364)(picture/2.png)]

其他接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YsV5ZBTM-1676130507365)(picture/3.png)]

软件设计

接收RF433/红外的信号,并完成动作即可

相关链接

舵机驱动

NEC

RF433

舵机关灯思路

HAL初始化

定时器1

红外和RF433的计时

设置为分频后1us,默认溢出数,开中断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c2OQ8G8J-1676130507366)(picture/4.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XVvEdjgQ-1676130507366)(picture/5.png)]

定时器2

用作舵机控制的PWM生成

每隔20us触发一次中断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nUCDJHnG-1676130507367)(picture/6.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ev25gVpu-1676130507367)(picture/7.png)]

GPIO

LED:用作指示灯,推挽输出即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gvf7unPe-1676130507368)(picture/8.png)]

GPIO

舵机控制信号

配置为开漏浮空(外部接上拉电阻到5V),配置为最高等级(避免复位时让电机出现误动作)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VH8MdGJy-1676130507369)(picture/9.png)]

GPIO

RF433输入

配置为边沿中断模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fDlh0Fhr-1676130507369)(picture/10.png)]

GPIO

红外输入

配置为下降沿中断模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nXLOmsyv-1676130507370)(picture/11.png)]

硬件看门狗

32分频,溢出值4000

每(32/40k*4000=3.2s)触发一次

本程序目的是让程序每3.2s重启一次,因此只在需要操作舵机时喂狗,主循环无喂狗

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbCFn7g3-1676130507370)(picture/12.png)]

程序

中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim == &Steering_Engine_TIM)
  {
    if (M_EN == 1)
      Steering_Engine_Action();
    else
      HAL_GPIO_WritePin(Steering_Engine_GPIOx, Steering_Engine_GPIO_Pin, GPIO_PIN_SET);
  }
  else if (htim == &htim3)
  {
  }
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_2)
  {
    if (IR_NEC_Read_ins == 0)
      RF_Read_Decode();
  }
  else if (GPIO_Pin == GPIO_PIN_3)
  {
    IR_NEC_Read_Decode(air);
  }
}

主循环处理函数

 if (IR_NEC_Read_OK)
    {

      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
      // printf("%02X%02X%02X%02X\r\n", IR_NEC_Read_Dat[0], IR_NEC_Read_Dat[1], IR_NEC_Read_Dat[2], IR_NEC_Read_Dat[3]);
      if (IR_NEC_Read_Dat[0] == 0x4D && IR_NEC_Read_Dat[1] == 0xb2 && IR_NEC_Read_Dat[2] == 0xa3 && IR_NEC_Read_Dat[3] == 0x5C)
        OPEN();
      else if (IR_NEC_Read_Dat[0] == 0x4D && IR_NEC_Read_Dat[1] == 0xb2 && IR_NEC_Read_Dat[2] == 0x59 && IR_NEC_Read_Dat[3] == 0xa6)
        CLOSE();

      if (IR_NEC_Read_Dat[0] == 0x84 && IR_NEC_Read_Dat[1] == 0xff && IR_NEC_Read_Dat[2] == 0x81 && IR_NEC_Read_Dat[3] == 0x7e)
        OPEN();
      else if (IR_NEC_Read_Dat[0] == 0x84 && IR_NEC_Read_Dat[1] == 0xff && IR_NEC_Read_Dat[2] == 0x01 && IR_NEC_Read_Dat[3] == 0xfe)
        CLOSE();
      HAL_IWDG_Refresh(&hiwdg);
      HAL_Delay(500);
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
      IR_NEC_Read_Dat[0] = 0;
      IR_NEC_Read_Dat[1] = 0;
      IR_NEC_Read_Dat[2] = 0;
      IR_NEC_Read_Dat[3] = 0;
      IR_NEC_Read_OK = 0;
    }
    if (RF_READ_OK)
    {
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
      // printf("%02X%02X%02X\r\n", RF_READ_data[0], RF_READ_data[1], RF_READ_data[2]);
      if (RF_READ_data[0] == 0xac && RF_READ_data[1] == 0x22 && RF_READ_data[2] == 0x00)
        OPEN();
      else if (RF_READ_data[0] == 0xac && RF_READ_data[1] == 0x22 && RF_READ_data[2] == 0xff)
        CLOSE();
      HAL_IWDG_Refresh(&hiwdg);
      HAL_Delay(500);
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
      RF_READ_data[0] = 0;
      RF_READ_data[1] = 0;
      RF_READ_data[2] = 0;
      RF_READ_OK = 0;
      // __set_FAULTMASK(1);
      // NVIC_SystemReset();
    }

开关灯控制函数

void OPEN()
{
  M_EN = 1;
  HAL_IWDG_Refresh(&hiwdg);
  Steering_Engine_360(0, 30);

  HAL_Delay(500);
  HAL_IWDG_Refresh(&hiwdg);
  Steering_Engine_360(1, 40);
  HAL_Delay(80);
  HAL_IWDG_Refresh(&hiwdg);
  Steering_Engine_Stop();
  M_EN = 0;
}
void CLOSE()
{
  M_EN = 1;
  HAL_IWDG_Refresh(&hiwdg);
  Steering_Engine_360(1, 30);
  HAL_Delay(500);
  HAL_IWDG_Refresh(&hiwdg);
  Steering_Engine_360(0, 30);
  HAL_Delay(80);
  HAL_IWDG_Refresh(&hiwdg);
  Steering_Engine_Stop();
  M_EN = 0;
}

成品

另外app开发很简单,百度凑凑就行了,源码同样在GitHub上,请自行查看即可

GitHub

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32】【HAL库】遥控关灯2 分机 的相关文章

  • iwebsec靶场 文件包含漏洞通关笔记9-file://伪协议利用

    目录 前言 1 file协议 2 利用条件 1 file 用于访问本地文件系统 2 file 必须是绝对路径 第09关 file 伪协议利用 1 打开靶场 2 源码分析 3 获取 etc passwd渗透 前言 1 file协议 file协
  • QCQI学习笔记(1)

    Chapter I II overview of the quantum information probabilistic model qubit tensor product dirac notation Chapter III Sup
  • electron-上传文件,下载csv txt xlsx

    electron 主进程 渲染进程 在vue中调用接口 相互通信 csv txt 上传csv文件 将csv文件读取内容 iconv lite 解决读取内容乱码 xlsx 上传xlsx文件 xlsx文件内容读取 下载xslx文件 简单无样式的
  • 虚析构函数

    自动调用基类部分的析构函数对基类的设计有重要影响 删除指向动态分配对象的指针时 需要运行析构函数 在释放对象的内存之前清除对象 处理继承层次中的对象时 指针的静态类型可能与被删除对象的动态类型不同 可能会删除 实际指向派生类对象的基类类型指

随机推荐

  • Android 10 修改系统默认的字体大小

    代码路径 frameworks base core java android content res Configuration java frameworks base packages SettingsProvider res valu
  • 美团外卖智能陪伴型导购的探索与实践

    相比于其他电商场景 外卖场景对于实时发现和反馈用户兴趣的能力有着更高的要求 近年来 美团外卖算法团队摸索出了一套适用于外卖场景的智能陪伴型导购架构和策略 这一举措已经取得了显著成效 本文将详细介绍外卖搜索技术团队搭建智能陪伴型导购时 所遇到
  • 浅析深究什么是中间件

    本文发布于2009年10月30日 1 由来 因为工作的原因 我从金蝶集团调入金蝶中间件公司工作以来 经常遇到一个问题就是中间件公司是个什么公司 中间件是什么 金蝶不是做ERP的吗 怎么也做中间件 这是我以前在金蝶集团时无法想象的问题 因为金
  • R语言笔记四

    str function str Compacktly display the internal structure of an R object A diagnostic function and an alternative to su
  • AndroidUI库集合

    https hndeveloper github io 2017 github android ui html 进度条 https github com Vension V AndroidCollectSources
  • 双指针和递归

    一 双指针 1 给你一个n 给你n个数 再给一个val 去掉所有等于val的值 思路 当i和j位置都是非val值 i j 当i位置是val j 当i是val j是非val 交换 i j 当j走到最后一个位置的时候 停了 输出0 i位置的值
  • 量化术语速查表(持续更新)

    本文介绍一些量化投资相关术语 帮助大家更好地了解该行业 作者 bigquant 阅读时间 15分钟 本文由BigQuant宽客学院推出 难度标签 以下术语没有先后顺序 并将持续更新 金融相关 股票 股份公司发行的所有权凭证 债券 承诺按一定
  • GDB+Jlink调试注意事项

    1 在汇编调用C的一步要用 Step in 不要用 Step Over 因为main对于汇编来说只是一个函数 会造成程序全速运行 不能单步调试 对于汇编代码 Step in Step Over 是一样的效果 所以在进行main函数之前最好都
  • 表白代码大全_隐藏表白系列都在这里了

    点击上方 搞siao君 右上角找到 立刻设置我为 星标 置顶 每天第一时间推送给你 每天都有不一样的精彩 喜欢就多多分享哦 一 微信隐藏表白代码大全 爱你我爱你我爱你我爱你我爱你我爱你我
  • List与ArrayList的区别

    在刷题的时候发现ArrayList初始化时 有下面两种情况 List
  • 2023五大自动化测试的 Python 框架

    自2018年被评选为编程语言以来 Python在各大排行榜上一直都是名列前茅 目前 它在Tiobe指数中排名第三个 仅次于Java和C 随着该编程语言的广泛使用 基于Python的自动化测试框架也应运而生 且不断发展与丰富 因此 开发与测试
  • Nacos和Zookeeper对比

    主要平时用的较多是配置中心和服务注册中心 所以也是结合这两点功能做出对应的对比 主要比对集群模式 以下仅仅整理了个人理解后的观点 如有疑问欢迎咨询讨论 1 Zookeeper 其实明白一点Zookeeper的功能主要是它的树形节点来实现的
  • GIT Please, commit your changes or stash them before you can merge. Aborting

    用git pull来更新代码的时候 遇到了下面的问题 C error Your local changes to the following files would be overwritten by merge xxx xxx xxx p
  • Qt通过读取XML文件,绘制图形界面

    最近需要实现通过读取xml文件的形式动态绘制界面的需求 这样会很方便 在外界修改xml文件就可以了 不需要重新编译程序 一 XML文件 XML的格式和一些说明 本文就不在介绍了 菜鸟教程有更清晰的入门介绍 菜鸟教程 XML 二 QT中读取X
  • React兄弟组件之间的通讯

    案例要求 达到这样一个效果 组件拆分 搜索框是一个组件 传递状态 下面的展示列表是一个组件 使用状态 方式一 状态存在父组件之间 父组件传递给子组件消息可以使用props 子组件给父组件之间传递消息可以使用函数实现 APP组件代码 impo
  • 计算机D盘无法读取,解决Mac上的USB错误“此计算机无法读取您插入的磁盘”

    尽管USB驱动器是最紧凑 最可靠的存储解决方案 但遇到它们的问题并不少见 您可能会发现该设备不可访问 或者在连接设备时可能会遇到诸如 此计算机无法读取您插入的磁盘 之类的错误消息 您如何解决此类错误 是否可以再次访问无法读取的USB上的数据
  • 一文搞懂vue的$attrs和$listeners,和react props的对比后更容易记忆

    近期编写vue组件 用到vue新增的api attrs和 listeners 看了网上很多帖子 感觉介绍的都不直观 并不能让使用者快速了解二者到底是什么作用 本文结合实际使用场景 给出 attrs和 listeners的使用方法 并且引入引
  • gemm c++

    http www pittnuts com 2015 08 gemm of caffe 转载于 https www cnblogs com Wanggcong p 5281521 html
  • SpringBoot>16 - 使用 @Scheduled 实现定时任务

    简介 实现定时任务的方式很多 基于JDK的Timer Quartz等等 本章介绍 SpringBoot1 5 中Spring Task实现定时任务 非常方便 个人学习总结 链接 springboot springcloud docker 等
  • 【STM32】【HAL库】遥控关灯2 分机

    相关连接 STM32 HAL库 遥控关灯0 概述 STM32 HAL库 遥控关灯1主机 STM32 HAL库 遥控关灯2 分机 STM32 HAL库 遥控关灯3 遥控器 需求 接收RF433和红外信号 根据信号内容控制舵机 硬件设计 主控采