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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STC15W4K32S4单片机的NRF遥控器设计 -> 正文阅读

[嵌入式]基于STC15W4K32S4单片机的NRF遥控器设计

基于STC15W4K32S4单片机的遥控器

之前在立创平台画了一个遥控器的电路板,目前已调试完毕,分享一下。

一. 设计思路。

基于STC15W4K32S4单片机设计一款可以控制小车前后左右运动的简单遥控器,并且可以结合OLED 屏显示小车实时的运动状态。

二. 硬件框架。

在这里插入图片描述
外设的各模块将为以STC15W4K32S4为内核的单片机提供能量及信号,经过单片机计算及转换后可经过其他模块进行输出。

三. 原理图的设计。

1.总原理图。

在这里插入图片描述
总原理图是由STC15W主控芯片,降压模块,蜂鸣器模块,USB供电模块,按键模块,开关模块,无线模块,OLED外设引脚等电路结合组成

2.各模块的分析及硬件的选型。

1. 芯片。

在这里插入图片描述
在这里插入图片描述

首先是芯片的选择,该作品选择的芯片型号是STC15W4K32S4-30I-LQFP64S,一般遵循够用原则,在单片机引脚够用的情况下,我们不会选择这么多引脚和内存的芯片,我的话是当时画图时手上刚好有这款多余的芯片才把他作为主控芯片,看到到上面原理图那些小叉叉了没有,那些都是用不到空出来的引脚,比较浪费,如果其他同学想做的话可以根据实际情况选择恰当的芯片,尽量不要浪费太多的引脚 。
右边的是指示灯和烧录引脚TXD和RXD的引出,用于外部烧录,这样做的目的是减少了烧录模块的空间,为板子节省空间,不过烧录时只能用外部的烧录模块进行烧录,独立性差了点。
功能:完成取指令、将指令译码形成各种微操作并执行指令,同时控制计算机的各个部件有条不紊地工作。

2.供电模块。
在这里插入图片描述

在这里插入图片描述
这个电路板用的接口是我们比较常见的micro USB接口(如上面实物图),个人觉得比较难焊,很考验焊接技术和耐心,如果插脚没焊好的话在使用过程中比较容易掉,现在画新的电路板比较喜欢采用下面这款有4个插脚的,焊完比较牢固。
功能:为单片机以及其他外设模块提供电源供应。
在这里插入图片描述
3.降压模块。
在这里插入图片描述
在这里插入图片描述
在降压模块电路中位于左边的排针是为以后外接电源做准备的,防止外部供电电压太大烧坏单片机而设计降压模块电路对其进行降压,所用到的降压芯片是AMS1117-5.0,个人感觉还行吧,价格也比较可观。然后就是用几个瓷电容对电压进行稳压滤波,如果条件允许的话用钽电容效果也是不错的。
功能:对外接电源进行降压至5V,可为单片机进行供电。

4.开关电路
在这里插入图片描述
在这里插入图片描述
开关用的是贴片的拨片开关,体积小而且也美观。其他同样是钽电容滤波以及LED指示灯,便于观察开关是否打开和芯片是否有通电。
功能:控制总电路的开和关,指示灯看显示电路是否为通电状态。

5.按键模块。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
摇杆原理图里中间那两个引脚得连接单片机ADC特定引脚,因为摇杆的原理类似于滑动变阻器,可通过代码对其引脚电压的检测来判断摇杆滑动的位置。摇杆用的是上面那种,某宝一个也就几块钱,手感还不错,属于自恢复型的。按键的话就是用普通按键,便宜好用,不过最好软件消抖。
功能:外部输入,后续结合代码和无线模块可以实现对小车的控制。

6.蜂鸣器模块。
在这里插入图片描述
在这里插入图片描述
蜂鸣器我们一般选择的是有源蜂鸣器,当 PNP 型三极管基极为低电平时,则三极管导通电流从 VCC 流向蜂鸣器,从而使得蜂鸣器发出“滴…滴…”的响声。在蜂鸣器两端并联二极管之后,蜂鸣器断电之后的电磁能通过蜂鸣器与二极管形成的环路消耗掉了,从而避免了蜂鸣器断电之后由于电感的电磁能造成反向冲击。
功能:可结合按键发出声响,根据自己想法设置提示音。

7.无线模块。
在这里插入图片描述
在这里插入图片描述
无线模块我们一般选择的型号是NRF24L01,某宝一个几块钱,对于我们实现短距离的简单控制还是挺好用的,性价比高,不过供电电压最好不要超过3.7V,不然很容易烧掉,而且记得加稳压滤波电容,之前不懂事烧了挺多个的。
功能:结合代码与小车上的无线模块进行无线通信,实现远程控制功能。

8.OLED屏幕。
在这里插入图片描述

在这里插入图片描述
一样是加滤波和稳压电容,焊接时把排母焊好一点,防止因为焊接不良导致莫名其妙的雪花。
功能:可以显示电路电压,小车的运动状态,无线模块是否连接上等功能。

四. PCB图及成品。

在这里插入图片描述
PCB图的话就注意把元器件的位置预先想好,滤波电容的话就尽量靠近模块吧,然后有大电流的地方就适当把线加粗会好点。
在这里插入图片描述
通过3D浏览可查看元器件摆布的位置,毕竟美观也是很重要的。
在这里插入图片描述
焊接后的成品!

五. 软件设计。

主函数就是对各个被用到的模块进行初始化,然后不断刷新ADC读取3D摇杆X轴回来的电压值对摇杆的位置进行判断,最后从按键读到的数据存入TxBuf[0]中,然后发送出去,并将信息显示在OLED屏幕上。代码写得比较乱,其他函数就不一一展示了。

//======================
//主函数
//======================
void main(void)
{
  uint ADC_Voltage_0 = 0;			//ADC读取3D摇杆X轴回来的电压值
  uint ADC_Voltage_1 = 0;			//ADC读取3D摇杆Y轴回来的电压值
  uint YG_x = 0;
  uint YG_y = 0;	
	
  Timer_4_Init(); //定时器初始化
  ADC_Init(); //ADC初始化
  P52 = 0;  //蜂鸣器关闭
  OLED_Clear(); //OLED清屏
  OLED_Init(); //OLED初始化
  init_NRF24L01();	//无线模块初始化
  delayms(10);
	
	while(1)
	{	
		
		//===== 发送模式 =====//
		
		 nrf_TxMod();
		
/****************当3D摇杆X轴电压变化时液晶屏刷新数据****************************/
		
	ADC_Voltage_0 = Read_Calculate_ADC(1);					//启动第x通道A/D模拟数字转换函数//ADC口
	YG_y = ADC_Voltage_0;
	OLED_ShowNum(0,6,YG_y,3,16);//数据显示
		
	ADC_Voltage_1 = Read_Calculate_ADC(4);					//启动第x通道A/D模拟数字转换函数
	YG_x = ADC_Voltage_1;
 OLED_ShowNum(103,6,YG_x,3,16);//数据显示
		
	/*通过上方左右按键调换模式*/	
	
		if (P60 == 0 )//左按钮按下
			{
				delayms(30);
				if (P60 == 0 )
					OLED_Clear();
					w++;
			}

		if (P24 == 0 )//右按钮按下
			{ 
				delayms(30);
				if (P24 == 0 )
				OLED_Clear();
					w = 0;
			}
/*//把数据存入TxBuf[0]中,然后发送出去,并将信息显示在OLED屏幕上*/
		if(w==0)
		{
			 if(YG_y < 100 || KEY_xia == 0) {	TxBuf[0] = 2;	oled2();} //后退
			 if(YG_y > 400 || KEY_shan == 0) { TxBuf[0] = 1; oled1(); }//前进
			 if(YG_x < 100 || KEY_zhuo == 0){ TxBuf[0] = 3; oled3();}//左转
			 if(YG_x > 400 || KEY_you == 0) { TxBuf[0] = 4;oled4();}//右转
			 if(YG_x < 400 && YG_x > 100 && KEY_zhuo != 0 && KEY_you != 0 ) { oled6();}//停止
			 if (YG_y < 400 && YG_y > 100 && KEY_xia != 0 && KEY_shan != 0) { oled5();}//停止				
			 if(YG_y > 400 && YG_x < 100){ TxBuf[0] = 3; oled1(); oled3();}//前左转
			 if(YG_y > 400 && YG_x > 400){ TxBuf[0] = 4; oled1(); oled4();}//前右转
			 if(YG_y < 100 && YG_x < 100){ TxBuf[0] = 5; oled2(); oled3();}//后左转
			 if(YG_y < 100 && YG_x > 400){ TxBuf[0] = 6; oled2(); oled4();}//后右转
			 if(YG_x < 400 && YG_x > 100 && KEY_zhuo != 0 && KEY_you != 0 && YG_y < 400 && YG_y > 100 && KEY_xia != 0 && KEY_shan != 0)	//无操作待机	 
		{
			TxBuf[0] = 0;	
		}
	}
		if(w==1)
		{
			oled7();
			if( KEY_xia == 0) {	TxBuf[0] = 2;	oled7();oled9();} //东西人行道开放
			if( KEY_shan == 0) { TxBuf[0] = 1; oled7();oled8(); }//人行道全开放
			if( KEY_zhuo == 0){ TxBuf[0] = 3; oled7();oled10();}//南北人行道开放
			if( KEY_you == 0) { OLED_Clear(); TxBuf[0] = 0;oled7();oled11();}//右转
		
		
		
		}
		if(w==2)
		{ 
			TxBuf[0] = 7;
			oled12();//自动巡线模式
		
		}
		nrf_trans(TxBuf);			//将待发送的数据写入NRF24L01
		while_times = 30;		//检测是否发送成功 循环检测?次  【可更改,让接收循环次数大于发送循环次数效果较好】
		while(while_times--  ) //发送超时,或者发送成功,跳出循环 进入接收模式
		{
			get_nrf_sta();			//获取状态标志
			if(TX_DS == 1)			//发送成功,跳出循环
				break;
		}
		//===== 接收模式 =====//在小车上调用
//		nrf_RxMod();
//		while_times = 120;		//检测是否接收成功 循环检测?次 【可更改,让接收循环次数大于发送循环次数效果较好】
//		while(while_times--) 	//接收超时或者接收成功,跳出循环 进入发送模式
//		{
//			get_nrf_sta();			//获取状态标志
//			if(RX_DR == 1)			//接收成功
//			{	
//				nrf_read(RxBuf);	//接收成功后,将NRF24L01接收到的数据读到单片机的RxBuf数组中。
//				break;						//跳出循环
//			}
//		}
//		if(RX_DR == 1)				//是因为接收到数据,而不是因为超时才跳出循环
//		{
//			if(RxBuf[0] == 1)		//前进
//			{ P25 = 1;
//				P20 = 1;
//				P21 = 1;
//				P22 = 0;
//			  P24 = 1;
//				P23 = 0;}
//			
//				if(RxBuf[0] == 2)	 //后退	
//			{ P25 = 1;
//				P20 = 1;
//				P21 = 0;
//				P22 = 1;
//			  P24 = 0;
//				P23 = 1;}
//			if(RxBuf[0] == 3)		//左转
//			{ P25 = 0;
//				P20 = 1;
//				P21 = 1;
//				P22 = 0;
//			  P24 = 0;
//				P23 = 1;}
//			if(RxBuf[0] == 4)		//右转
//			{ 
//			  P25 = 1;
//				P20 = 0;
//				P21 = 0;
//				P22 = 1;
//			  P24 = 1;
//				P23 = 0;}
//			if(RxBuf[0] == 5)		//后左转
//			{ 
//			  P25 = 0;
//				P20 = 1.;
//				P21 = 0;
//				P22 = 1;
//			  P24 = 1;
//				P23 = 0;}
//			if(RxBuf[0] == 6)		//后右转
//			{ 
//			  P25 = 1;
//				P20 = 2.;
//				P21 = 1;
//				P22 = 0;
//			  P24 = 0;
//				P23 = 1;}
//			//LED_ON;
//      if(RxBuf[0] == 7)		//后右转
//			{ 
//			  xunxian();}
//		 if(RxBuf[0] == 0)   //停下
//				
//			{ P25 = 0;
//				P20 = 0;
//				P21 = 0;
//				P22 = 1;
//			  P24 = 0;
//				P23 = 1;}
//			//LED_OFF;
//		}
	}
}

六. 验证功能。

在这里插入图片描述
进行外部烧录中。
在这里插入图片描述
烧录成功!

测试
由于无法上传视频,我只能暂时用图片代替。在测试过程中小车能实现前后左右运动,并且我在测试过程中增加了抓取功能(调节舵机的脉宽值),也实现了功能,测试成功。后续我会增加更多的功能如无线切换到自动巡线模式以及结合摄像头实现远程图像捕捉功能等等。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 11:50:39  更:2021-07-25 11:51:48 
 
开发: 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年5日历 -2024/5/20 8:43:30-

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