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

相关连接

【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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值