IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 2021-08-08 -> 正文阅读

[嵌入式]2021-08-08

STM32F103+NRF2401+游戏摇杆ADC双单片机通信遥控小车


前言

在电赛延期之后,用了两三天时间,从空的车模到板子的搭建,再到程序,实现了STM32F103+NRF2401+游戏摇杆ADC双单片机通信遥控小车 代码逻辑不难,主要是锻炼板子搭建接线、代码测试、效果运行等方面,涉及到的东西包括PWM、ADC采集、2.4G通信等
实物照片如下

在这里插入图片描述

演示视频链接如下

演示视频

一、实现的功能?

基于STM32F103ZET6系列(两块板子分别为精英版、board),(用两块精英版一样的道理,也可以自己制板,比较麻烦)。主要模块为:游戏摇杆ADC采集模块、LCD屏幕、NRF2401两个、车模一个(包括直流减速电机和转向舵机)其他包括稳压模块等
实现无线遥控小车前进后退左右转,前进后退制动速度、舵机转向角度根据摇杆控制。

二、主要代码及模块讲解

1.主要代码

TX(发送端)代码如下

while(1)
	{	
      show();        //显示游戏摇柄电压值大小,方便调试
      LCD_ShowString(30,150,200,16,16,"NRF24L01 TX_Mode");	
      NRF24L01_TX_Mode(); 
      if(NRF24L01_TxPacket(tmp_buf)==TX_OK)	//检测状态、准备发送数据
      {
         tmp_buf[1]=1;		//点灯测试数据是否成功
         tmp_buf[2]=2;
         
         /***********前进部分***************/
         if(go_speed>150&&go_speed<500)		//检测电压值
         tmp_buf[3]=1;			//1挡最低速、3挡最高速,实现速度调控
         else if(go_speed>500&&go_speed<800)
            tmp_buf[3]=2;
         else if(go_speed>800) tmp_buf[3]=3;
         else tmp_buf[3]=0;
         
         /***********后退部分***************/
         if(back_speed>150&&back_speed<500)
         tmp_buf[5]=1;
         else if(back_speed>500&&back_speed<900)
            tmp_buf[5]=2;
         else if(back_speed>900) tmp_buf[5]=3;
         else tmp_buf[5]=0;
         
         /***********左转部分***************/
         if(left_speed>150&&left_speed<650)
         tmp_buf[7]=1;
         else if(left_speed>650&&left_speed<1000)
            tmp_buf[7]=2;
         else if(left_speed>1000) tmp_buf[7]=3;
         else tmp_buf[7]=0;
         
         /***********右转部分***************/
         if(right_speed>50&&right_speed<550)
         tmp_buf[9]=1;
         else if(right_speed>550&&right_speed<900)
            tmp_buf[9]=2;
         else if(right_speed>900) tmp_buf[9]=3;
         else tmp_buf[9]=0;
         
           
        tmp_buf[32]=0;//加入结束符
      }

2.RX(接收端)

代码如下:

while(1)
	{	
    	 // show();       //调试检查 
		LCD_ShowString(30,150,200,16,16,"NRF24L01 RX_Mode");	
		LCD_ShowString(30,170,200,16,16,"Received DATA:");	
		NRF24L01_RX_Mode();		  
		while(1)
		{         
			if(NRF24L01_RxPacket(tmp_buf)==0)//检测状态、准备接收
			{
				tmp_buf[32]=0;//加入结束符
            LCD_ShowxNum(60,210,tmp_buf[3],4,16,0);	//LCD显示状态、方便调试
            LCD_ShowxNum(60,240,tmp_buf[5],4,16,0);
            LCD_ShowxNum(60,270,tmp_buf[7],4,16,0);
            LCD_ShowxNum(60,300,tmp_buf[9],4,16,0);
			}
         else delay_us(100);
        
        /***********前进部分***************/	
         if(tmp_buf[3]==1) go_speed = 500;
         else if(tmp_buf[3]==2) go_speed = 800;
         else if(tmp_buf[3]==3) go_speed = 1200;
         else go_speed = 0;
         
         /***********后退部分***************/
         if(tmp_buf[5]==1) back_speed = 500;
         else if(tmp_buf[5]==2) back_speed = 800;
         else if(tmp_buf[5]==3) back_speed = 1200;
         else back_speed = 0;
         
		/***********转动部分***************/
         if(tmp_buf[7]==1) left_speed = 1050;//此部分代码后面有解释
         else if(tmp_buf[7]==2) left_speed = 850;
         else if(tmp_buf[7]==3) left_speed = 650;
         if(tmp_buf[9]==1) left_speed = 1450;
         else if(tmp_buf[9]==2) left_speed = 1650;
         else if(tmp_buf[9]==3) left_speed = 1800;
         if(tmp_buf[7]==0&&tmp_buf[9]==0) left_speed = 1250;//TIM_SetCompare3(TIM3,1250); 
         
		//pwm输出,制动前进、后退、左转、右转
         TIM_SetCompare1(TIM3,go_speed);//前进
         TIM_SetCompare2(TIM3,back_speed);//后退
         TIM_SetCompare3(TIM3,left_speed);//角度舵机转动

		};	

demo总体分析和代码部分解读

这个项目总体来说很简单,但自己从车模到代码的编写和测试都需要一定的时间和细心程度

PWM驱动部分

无论是电机驱动还是舵机转角,都需要pwm进行驱动,此demo使用STM32的TIM3定时器输出思路pwm进行调速,具体代码见工程包,网上也有很多。(第四路未用到)

游戏摇杆ADC部分

这部分主要是要通过两路ADC读取一个摇杆的电压值,demo中两个摇杆一共需要四个I/O口来读取电压值,并不是每一个I/O都能当作AD的(不要乱用),此部分要查资料,网上也有很多,详情看代码包

NRF2401模块

这个模块是经典的2.4G通信模块,比起LORA能更快的上手,这个模块的驱动代码网上都有,主要说我开发过程遇到的坑,tmp_buf这个数组是U8型的,看清楚不要传不匹配的数据,这个数组的每一个大小是8位的,也就是说传值的大小只能是0~255(8位二进制最大值),这也是我为什么速度的调控先传1 2 3 0 的档位,接收的时候再根据档位去调控应该输出的速度大小。这个模块一个要检测寄存器的位,就是NRF24L01_TxPacket(tmp_buf)==TX_OK
NRF24L01_RxPacket(tmp_buf)==0
这两句

/最后,代码包链接如下*******/

代码包

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:23:46  更:2021-08-09 10:24:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 1:37:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计