用富斯i6遥控器控制船
笔记目录
- 一.整体思路
- 二.富斯i6遥控器
- 1.富斯i6刷十通道
- 2.富斯i6玩模拟器
- 三.cubemx配置
- 1.时钟和sys配置
- 2.串口配置
- 3.输入捕获的配置
- 4.PWM输出配置
- 5.中断配置
- 6.IO口配置
- 7.生成代码
- 四.程序
- 1.printf重映射
- 2. 脉冲捕获和pwm输出
- 3.更改遥控器配置
- 展示
- 代码
- 学习时间
一.整体思路
富斯i6遥控器发送指令
接收器接收->stm32解析接收器接受的pwm波形->stm32调整pwm并传给L298N->驱动电机
(这里使用的接收器是FS-iA6,没有PPM输出只有PWM输出)
二.富斯i6遥控器
1.富斯i6刷十通道
参考资料: https://www.moz8.com/forum.php?mod=viewthread&tid=63118
软件及固件下载
链接:https://pan.baidu.com/s/1mYgsdUY5MKstdEMBARQfIw
提取码:6666
复制这段内容后打开百度网盘手机App,操作更方便哦
2.富斯i6玩模拟器
需要买一个加密狗。
穿越机模拟器适用于windows(我只试过win10)
下载地址:链接:https://pan.baidu.com/s/14yvS_LbgzKS6NVhknLtkxw 提取码:6666 复制这段内容后打开百度网盘手机App,操作更方便哦
三.cubemx配置
这里使用的是正点原子的精英板(stm32f103ZET6)
硬件连线:
1.时钟和sys配置
2.串口配置
3.输入捕获的配置
4.PWM输出配置
5.中断配置
6.IO口配置
因为要用L298N除了两个pwm信号线之外还需要四根线。
7.生成代码
四.程序
1.printf重映射
打开生成好的代码,在usart.c程序中的/* USER CODE BEGIN 0 */
和/* USER CODE END 0 */
之间加入以下代码就可以使用printf了
#include "stdio.h"
#if 1
//#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle;
}; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{ while((USART1->SR&0X40)==0);//循环发送,直到发送完毕USART1->DR=(uint8_t)ch; return ch;
}
#endif
2. 脉冲捕获和pwm输出
输入捕获程序参考:https://www.pianshen.com/article/367541452/
pwm程序参考:http://news.eeworld.com.cn/mcu/ic464736.html
在main.c中添加头文件
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
在main.c中进行通道使能
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_4);__HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//启动。置1 CCER的输出使能位bit4HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//CCER的bit0HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_SET);
在/* USER CODE BEGIN 4 */
中填写捕获处理以及调整pwm的代码
这里只用到了遥控器的通道一和通道二,通过串口可以看出遥控器最大量程为50。
输入捕获:49(低)-74(中)-99(高)
电机pwm范围是:0(低)-999(中)-0(高)
通过一系列的计算得到了下面的程序
/* USER CODE BEGIN 4 */
uint16_t Channel1HighTime, Channel2HighTime, Channel3HighTime, Channel4HighTime;
uint16_t Channel1Period, Channel2Period, Channel3Period, Channel4Period;
uint8_t Channel1Edge = 0, Channel2Edge = 0, Channel3Edge = 0, Channel4Edge = 0;
uint16_t Channel1Percent, Channel2Percent, Channel3Percent, Channel4Percent;
uint16_t Channel1PercentTemp[3] = {0, 0, 0};
uint8_t Channel1TempCount = 0;
uint16_t Channel1RisingTimeLast=0, Channel1RisingTimeNow, Channel1FallingTime;
uint16_t Channel2RisingTimeLast=0, Channel2RisingTimeNow, Channel2FallingTime;
uint16_t Channel3RisingTimeLast=0, Channel3RisingTimeNow, Channel3FallingTime;
uint16_t Channel4RisingTimeLast=0, Channel4RisingTimeNow, Channel4FallingTime;uint16_t Channel1pwm, Channel2pwm, Channel3pwm, Channel4pwm;void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{/* Prevent unused argument(s) compilation warning */UNUSED(htim);/* NOTE : This function Should not be modified, when the callback is needed,the __HAL_TIM_IC_CaptureCallback could be implemented in the user file*/if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){if(Channel1Edge == 0){Channel1RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);//获取上升沿时间点__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);//切换捕获极性HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);Channel1Edge = 1;if(Channel1RisingTimeLast == 0){Channel1Period = 0;}else{if(Channel1RisingTimeNow > Channel1RisingTimeLast){Channel1Period = Channel1RisingTimeNow - Channel1RisingTimeLast;}else{Channel1Period = Channel1RisingTimeNow + 0xffff - Channel1RisingTimeLast + 1;}}Channel1RisingTimeLast = Channel1RisingTimeNow;}else if(Channel1Edge == 1){Channel1FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1); __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);if(Channel1FallingTime < Channel1RisingTimeNow){Channel1HighTime = Channel1FallingTime + 0xffff - Channel1RisingTimeNow + 1;}else{Channel1HighTime = Channel1FallingTime - Channel1RisingTimeNow;}if(Channel1Period != 0){Channel1Percent = (uint8_t)(((float)Channel1HighTime / Channel1Period) * 1000);Channel1pwm=(19.98*Channel1Percent-979.02);//Channel1pwm=39.96*Channel1Percent-2957.04;}Channel1Edge = 0;}}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){if(Channel2Edge == 0){Channel2RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);Channel2Edge = 1;if(Channel2RisingTimeLast == 0){Channel2Period = 0;}else{if(Channel2RisingTimeNow > Channel2RisingTimeLast){Channel2Period = Channel2RisingTimeNow - Channel2RisingTimeLast;}else{Channel2Period = Channel2RisingTimeNow + 0xffff - Channel2RisingTimeLast + 1;}}Channel2RisingTimeLast = Channel2RisingTimeNow;}else if(Channel2Edge == 1){Channel2FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2); __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);if(Channel2FallingTime < Channel2RisingTimeNow){Channel2HighTime = Channel2FallingTime + 0xffff - Channel2RisingTimeNow + 1;}else{Channel2HighTime = Channel2FallingTime - Channel2RisingTimeNow;}if(Channel2Period != 0){Channel2Percent = (uint8_t)(((float)Channel2HighTime / Channel2Period) * 1000);Channel2pwm=(39.96*Channel2Percent-2957.04);//printf("Channel1 = %d Channel1pwm = %d\r\n", Channel1Percent,Channel1pwm);//printf("Channel2 = %d Channel2pwm = %d\r\n", Channel2Percent,Channel2pwm);if(Channel2Percent<74) //后退{HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_RESET);
// if(Channel1Percent<74)
// {
// __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, Channel1pwm);
// __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 999-Channel2pwm);
// }
// else if(Channel1Percent==74) //后退
// {__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 999-Channel2pwm);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 999-Channel2pwm);printf("后退");
// }
// else
// {
// __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 999-Channel2pwm);
// __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, Channel1pwm);
// }}else if(Channel2Percent==74) //停止{HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0);printf("停止");}else {HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_SET);if(Channel1Percent<74) //左转{__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 999-Channel2pwm);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 999-Channel1pwm);printf("左转 %d",Channel1pwm);}else if(Channel1Percent==74) //前进{__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2,999-Channel2pwm);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 999-Channel2pwm);printf("前进");}else //右转{__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2,Channel1pwm);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 999-Channel2pwm);printf("右转 %d\r\n",1000-Channel1pwm);}}}Channel2Edge = 0;}}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3){if(Channel3Edge == 0){Channel3RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3);Channel3Edge = 1;if(Channel3RisingTimeLast == 0){Channel3Period = 0;}else{if(Channel3RisingTimeNow > Channel3RisingTimeLast){Channel3Period = Channel3RisingTimeNow - Channel3RisingTimeLast;}else{Channel3Period = Channel3RisingTimeNow + 0xffff - Channel3RisingTimeLast + 1;}}Channel3RisingTimeLast = Channel3RisingTimeNow;}else if(Channel3Edge == 1){Channel3FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3); __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3);if(Channel3FallingTime < Channel3RisingTimeNow){Channel3HighTime = Channel3FallingTime + 0xffff - Channel3RisingTimeNow + 1;}else{Channel3HighTime = Channel3FallingTime - Channel3RisingTimeNow;}if(Channel3Period != 0){Channel3Percent = (uint8_t)(((float)Channel3HighTime / Channel3Period) * 1000);//printf("Channel3 = %d ", Channel3Percent);}Channel3Edge = 0;}}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4){if(Channel4Edge == 0){Channel4RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_4);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_4, TIM_INPUTCHANNELPOLARITY_FALLING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_4);Channel4Edge = 1;if(Channel4RisingTimeLast == 0){Channel4Period = 0;}else{if(Channel4RisingTimeNow > Channel4RisingTimeLast){Channel4Period = Channel4RisingTimeNow - Channel4RisingTimeLast;}else{Channel4Period = Channel4RisingTimeNow + 0xffff - Channel4RisingTimeLast + 1;}}Channel4RisingTimeLast = Channel4RisingTimeNow;}else if(Channel4Edge == 1){Channel4FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_4); __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_4, TIM_INPUTCHANNELPOLARITY_RISING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_4);if(Channel4FallingTime < Channel4RisingTimeNow){Channel4HighTime = Channel4FallingTime + 0xffff - Channel4RisingTimeNow + 1;}else{Channel4HighTime = Channel4FallingTime - Channel4RisingTimeNow;}if(Channel4Period != 0){Channel4Percent = (uint8_t)(((float)Channel4HighTime / Channel4Period) * 1000);//printf("Channel4 = %d\r\n", Channel4Percent);}Channel4Edge = 0;}}
}/* USER CODE END 4 */
3.更改遥控器配置
展示
VID20210406215438
代码
点这里下载
学习时间
2021.4.6
用富斯i6遥控器控制船相关推荐
- 图文并茂详细教程之——富斯I6遥控器电压回传模块的安装和使用(苍穹四轴)
摘自:https://mp.weixin.qq.com/s/Avo1RlEkWL-qLLJ2S7RA6w 图文并茂详细教程之--富斯I6遥控器电压回传模块的安装和使用 CJKK 苍穹四轴DIY 201 ...
- arduino遥控器控制灯开关以及亮度
遥控器控制灯的开关,能能通过按ch进行,其他的键无法进行操作. 在控制亮度的情况下,可以通过ch+和ch-加减亮度的数值进行增加或降低亮度.同样,在灯没有亮的情况之下是不允许调节亮度的,当然,灯也不会 ...
- 如何使用Logitech Harmony遥控器控制智能家居设备
On some remotes, you may also have home control buttons that you can use with devices like Philips H ...
- arduino 红外遥控器控制LED灯
/* 日期:2016.9.1 功能:红外遥控器控制LED灯 开,关,闪烁,呼吸 元件:跳线公公头 * 5led 220欧电阻红外接收管,红外遥控 接线:红外灯面向自己从左到右分别接 IO3 ,GND ...
- Arduino用遥控器控制LED灯开关和亮度
最近在学习物联网,毕竟现在人工智能包括无人驾驶,自动避障等行业的火热,所以在这里分享学习笔记 工具: 硬件:Arduino,遥控器,红外线,传感器,网上有卖不是很贵十几块钱 软件:Mixly 步骤 一 ...
- html控制树莓派小车,用家里旧的红外遥控器控制树莓派小车
0x01 前言 红外遥控是一种无线.非接触控制技术,在工业控制.航空航天.家电等领域都得到了广泛应用.大部分的电视的遥控器,空调遥控器就都是红外遥控.在baidu上检索了树莓派小车的各种控制方案,没有 ...
- 最简单DIY蓝牙PS2遥控器控制蓝牙智能小车
51单片机物联网智能小车系列文章目录 第一篇:最简单DIY的51蓝牙遥控小车设计方案 第二篇:最简单DIY串口蓝牙硬件实现方案 第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车 文章目录 51单片 ...
- 基于Arduino的红外遥控器控制MP3播放
基于Arduino的红外遥控器控制MP3播放(MP3音乐模块.红外接收模块.红外遥控器) ✨通过红外遥控器来控制音乐播放
- 技术分享 | 遥控器控制(Joystick)
一.遥控器控制 在真实飞行过程中,我们使用真实的遥控器作为控制无人机的主要操作来源,遥控器始终拥有最高的权限,精湛的遥控器操作手法可以保证无人机安稳着陆,但对于很多非专业人士来说,遥控的操作技巧是需要 ...
最新文章
- 选本还是从缓存设计理念选择更好
- Redis 通用 key 命令
- sobol敏感性分析 matlab代码
- ubuntu 安装自动解决依赖冲突
- python双向索引什么意思_python字典支持双向索引吗
- IIS/ASP.NET 管道
- java数组对角线的和_java – 2d数组对角线填充
- 怎么解决tomcat端口占用问题?
- FlashFTP教程
- textarea高度自适应且不出现滚动条
- linux下制作dos启动u盘启动,linux dos启动盘怎样做
- 含参积分求导/积分上限函数求导/
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别
- 除了啤酒与尿布 大数据又助电商玩口碑营销
- 【微信网页授权】SpringBoot+uniapp实现网页授权获取用户基本信息
- Java实现旅行商问题
- 27年台湾珍珠鲜奶茶品牌Sharetea将引进上海
- 南昌大学计算机考研学硕,南昌大学电子信息工程专硕考研心得
- web前端常用网址大全
- Python每日bug定时发送飞书群