基于STM32的DIY遥控小船制作.docx

上传人:b****6 文档编号:8905487 上传时间:2023-02-02 格式:DOCX 页数:13 大小:120.21KB
下载 相关 举报
基于STM32的DIY遥控小船制作.docx_第1页
第1页 / 共13页
基于STM32的DIY遥控小船制作.docx_第2页
第2页 / 共13页
基于STM32的DIY遥控小船制作.docx_第3页
第3页 / 共13页
基于STM32的DIY遥控小船制作.docx_第4页
第4页 / 共13页
基于STM32的DIY遥控小船制作.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

基于STM32的DIY遥控小船制作.docx

《基于STM32的DIY遥控小船制作.docx》由会员分享,可在线阅读,更多相关《基于STM32的DIY遥控小船制作.docx(13页珍藏版)》请在冰豆网上搜索。

基于STM32的DIY遥控小船制作.docx

基于STM32的DIY遥控小船制作

  

 

  

基于STM32的DIY遥控小船制作

 

  

 

 

 

 

 

 

 

   

 

 

 

 

 

 

 

[导读]基本构想如下:

stm32驱动两个小电机,小电机上安装两个螺旋桨,可以实现双桨前进、后退,单桨转弯等。

01前言

周末带小朋友去公园玩耍,别的小孩在池塘里玩饮料瓶做的漂流船,看着他欢乐的跟着跑跳,无比羡慕的眼神,却又不能上手的小失落,又回想起儿时用泡沫板和小电机以及电池做的小船,和那时对于电驱动产生的无比兴趣,我决定升级一下儿时的装备,基于STM32给小朋友DIY一个遥控小船,使他成为公园里焦点,同时也期待他对电气控制产生一点点好奇。

基本构想如下:

stm32驱动两个小电机,小电机上安装两个螺旋桨,可以实现双桨前进、后退,单桨转弯等。

供电使用18650电池,通过升压放电板管理电池的充放电。

遥控使用最廉价的红外遥控,来控制小船的各种动作。

同时可以增加一组数码管作为输出设备。

在万能的某宝上可以淘到所有需要的材料,并且价格都十分实惠。

材料

单价

备注

船体

0

废旧收纳盒

驱动电机、螺旋桨

10.5

红外遥控器、红外接收器

3.5

18650电池

0

废旧小电扇拆件

充电升压放电板

5.8

STM32最小系统板

16.2

4位数码管显示器

4.3

电池盒

1.8

线材

0

废线材

电源开关

1.8

合计

43.9

02硬件模块

红外遥控模块

一般遥控玩具使用的是2.4G高频无线遥控模块,但是本着能省则省的原则,选用遥控器带接收头3.5元还包邮的HX1838红外遥控模块。

这种遥控器类似电视遥控器,优点是便宜,开发简单,缺点是控制距离短,并且要像遥控电视一样指着玩具操作,这些缺陷留着下一代产品迭代时升级。

电机驱动模块

电机使用直流小电机,3-6V可驱动,使用一片L298N驱动板驱动。

STM32输出PWM可调速,可正反转。

数码管显示

基于TM1637的四位数码管,用于显示一些简单的信息。

TM1637是天微公司出品的LED驱动专用芯片,集成简单,开发方便。

除了TM1637,天微公司还有一系列TM16XX的芯片,主要区别就是位输出和段输出个数多少。

电池和充放电模块

18650电池具有容量大,寿命长,安全性高等优点,普遍使用在充电宝,笔记本电池、仪器仪表中,甚至特斯拉的电池组也是由7000多节这样的电池组合成的。

充放电线路板,主要的作用是将电池3.7V的输出电压升压到5V,供给STM32及外围电路使用,同时还具备给电池充电的功能。

实际上等同于一个充电宝,充电宝的原理就是若干个18650电池并联,再用一块充放电板管理而已。

03嵌入式软件

红外遥控器驱动

HX1838采用的是NEC编码格式。

载波频率为38khz。

逻辑1是2.25ms,脉冲时间560us;逻辑0为1.12ms,脉冲时间560us。

根据脉冲时间长短来解码。

协议示意图:

一组数据组成:

1.起始是9ms的高电平脉冲

2.4.5ms的低电平

3.8位地址码,低位在前

4.8位地址码的反码,用于校验

5.8位命令码,低位在前

6.8位命令码的反码。

需要注意的是1838红外一体接收头为了提高接受灵敏度。

输入高电平,其输出的是相反的低电平。

实际测量接收到的按键波形如下图,可以看到电平是相反的。

代码实现:

使用下降沿外部中断作为一次按键的检测触发,然后每个20us读取一次数据管脚,按照上述的协议逻辑,读出一个u32的数据。

U8Infrared_Receiver_Process(void){U16nTime_Num=0;U8nData=0;U8nByte_Num=0;U8 nBit_Num =0;nTime_Num=Infrared_Receiver_GetLowLevelTime();//t0=nTime_Num;if((nTime_Num>=500)||(nTime_Num<=400))//9ms数据头高电平hx1838输入的反的{returnINFRARED_RECEIVER_ERROR;}nTime_Num=Infrared_Receiver_GetHighLevelTime();//4.5ms低电平hx1838输入的反的if((nTime_Num>=250)||(nTime_Num<=200)){returnINFRARED_RECEIVER_ERROR;}for(nByte_Num=0;nByte_Num<4;nByte_Num++)//4个8位码{for(nBit_Num=0;nBit_Num<8;nBit_Num++){nTime_Num=Infrared_Receiver_GetLowLevelTime();//560us高电平hx1838输入的反的nTime_Num=28if((nTime_Num>=60)||(nTime_Num<=20)){returnINFRARED_RECEIVER_ERROR;}nTime_Num=Infrared_Receiver_GetHighLevelTime();//1690us(nTime_Num=84.5)是逻辑1560us是逻辑0nTime_Num=28if((nTime_Num>=60)&&(nTime_Num<100)){nData=1;}elseif((nTime_Num>=10)&&(nTime_Num<50)){nData=0;}else{returnINFRARED_RECEIVER_ERROR;}gInfraredReceiver_Data<<=1;gInfraredReceiver_Data|=nData;}}returnINFRARED_RECEIVER_OK;}

经过调试,得到遥控器的按键键值如下:

KEY_OK=0x38,KEY_UP=0x18,KEY_DOWN=0x4a,KEY_LEFT=0x10,KEY_RIGHT=0x5a,KEY_1=0xa2,KEY_2=0x62,KEY_3=0xe2,KEY_4=0x22,KEY_5=0x02,KEY_6=0xc2,KEY_7=0xe0,KEY_8=0xa8,KEY_9=0x90,KEY_STAR=0x68,KEY_0=0x98,KEY_SHARP=0x80,

另外由于NEC编码格式的红外遥控广泛的用于电视遥控,我们也可以找一个电视遥控器,把键值读出来,写入到stm的程序中,这样就可以用电视遥控器来操作小船了。

数码管显示驱动

TM1637与其他的一些TM芯片有一些区别,没有同步通信的STB脚,控制时序也有相应改变。

在输入数据时当CLK是高电平时,DIO上的信号必须保持不变;只有CLK上的时钟信号为低电平时,DIO上的信号才能改变。

数据输入的开始条件是CLK为高电平时,DIO由高变低;结束条件是CLK为高时,DIO由低电平变为高电平。

TM1637的数据传输带有应答信号ACK,当传输数据正确时,会在第八个时钟的下降沿,芯片内部会产生一个应答信号ACK将DIO管脚拉低,在第九个时钟结束之后释放DIO口线。

代码实现:

voidstart(void){dio_output();GPIO_SetBits(CLK_GPIO_PORT,CLK_GPIO_PIN);GPIO_SetBits(DIO_GPIO_PORT,DIO_GPIO_PIN);Delay();GPIO_ResetBits(DIO_GPIO_PORT,DIO_GPIO_PIN);Delay();}voidstop(void){dio_output();/*GPIO_ResetBits(CLK_GPIO_PORT,CLK_GPIO_PIN);Delay();*/GPIO_ResetBits(DIO_GPIO_PORT,DIO_GPIO_PIN);Delay();GPIO_SetBits(CLK_GPIO_PORT,CLK_GPIO_PIN);Delay();GPIO_SetBits(DIO_GPIO_PORT,DIO_GPIO_PIN);Delay();}voidack(void){u8i;dio_input();GPIO_ResetBits(CLK_GPIO_PORT,CLK_GPIO_PIN);Delay();while(readDio()==1&&(i<250))i++;GPIO_SetBits(CLK_GPIO_PORT,CLK_GPIO_PIN);Delay();GPIO_ResetBits(CLK_GPIO_PORT,CLK_GPIO_PIN);dio_output();}voidwrite_data(u8wr_data){u8i;for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据{GPIO_ResetBits(CLK_GPIO_PORT,CLK_GPIO_PIN);if(wr_data&0x01){GPIO_SetBits(DIO_GPIO_PORT,DIO_GPIO_PIN);}else{GPIO_ResetBits(DIO_GPIO_PORT,DIO_GPIO_PIN);}Delay();wr_data>>=1;GPIO_SetBits(CLK_GPIO_PORT,CLK_GPIO_PIN);Delay();}ack();}voidtm1637_DispStr(u8*str){u8i;u8ledCode[5];for(i=0;i<4;i++){ledCode[i]=GetLedCode(str[i]);}start();write_data(0x44);//固定地址模式stop();start();write_data(LED_GRID1);write_data(ledCode[0]);stop();start();write_data(LED_GRID2);write_data(ledCode[1]);stop();start();write_data(LED_GRID3);write_data(ledCode[2]);stop();start();write_data(LED_GRID4);write_data(ledCode[3]);stop();start();write_data(0x89);stop();}

小船控制逻辑

目前的逻辑比较简单,就是收到按键后控制电机的转停。

voiddealIrKeyDown(){u8len;len=irKeyfifo_count;if(len>0){irKeyDataOut=irKeyfifo_DataOut();//按键显示U8ToHexstr(irKeyDataOut.index,dispStr);U8ToHexstr(irKeyDataOut.cmd,dispStr+2);tm1637_DispStr(dispStr);switch(irKeyDataOut.cmd){caseKEY_OK:

caseKEY_OK_CHANGHONG:

motor1_Stop();motor2_Stop();break;caseKEY_UP:

caseKEY_UP_CHANGHONG:

motor1_ForwardRun();motor2_ForwardRun();break;caseKEY_DOWN:

caseKEY_DOWN_CHANGHONG:

motor1_BackwardRun();motor2_BackwardRun();break;caseKEY_LEFT:

caseKEY_LEFT_CHANGHONG:

motor1_ForwardRun();motor2_Stop();state=SHIP_LEFT;break;caseKEY_RIGHT:

caseKEY_RIGHT_CHANGHONG:

motor2_ForwardRun();motor1_Stop();state=SHIP_RIGHT;break;default:

motor1_Stop();motor2_Stop();state=SHIP_STOP;break;}}}

04DIY成品展示和演示视频

05总结存在的问题

遥控不灵敏

毕竟红外遥控的使用场合并不是移动的物体上,再加上距离近,经常会出现遥控要按多次的情况。

后期考虑改进stm的协议处理方法,增加容错性,如果还是不行就考虑升级为2.4G专用的玩具遥控。

防水性问题

正常使用不会有水进入,但是在没有大人的情况下交给小孩操作,就没那么保险了。

后期考虑升级防水性能。

没有声光电,不够酷炫。

考虑升级,增加led灯条。

 

免责声明:

本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。

文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

 

-全文完-

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1