基于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;
uint ADC_Voltage_1 = 0;
uint YG_x = 0;
uint YG_y = 0;
Timer_4_Init();
ADC_Init();
P52 = 0;
OLED_Clear();
OLED_Init();
init_NRF24L01();
delayms(10);
while(1)
{
nrf_TxMod();
ADC_Voltage_0 = Read_Calculate_ADC(1);
YG_y = ADC_Voltage_0;
OLED_ShowNum(0,6,YG_y,3,16);
ADC_Voltage_1 = Read_Calculate_ADC(4);
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;
}
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);
while_times = 30;
while(while_times-- )
{
get_nrf_sta();
if(TX_DS == 1)
break;
}
}
}
六. 验证功能。
进行外部烧录中。 烧录成功!
测试 由于无法上传视频,我只能暂时用图片代替。在测试过程中小车能实现前后左右运动,并且我在测试过程中增加了抓取功能(调节舵机的脉宽值),也实现了功能,测试成功。后续我会增加更多的功能如无线切换到自动巡线模式以及结合摄像头实现远程图像捕捉功能等等。
|