当前位置:首页 > 公众号精选 > 嵌入式案例Show
[导读]基本构想如下: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的数据。

U8 Infrared_Receiver_Process(void){ U16 nTime_Num = 0; U8 nData = 0; U8 nByte_Num = 0; U8 nBit_Num = 0; nTime_Num = Infrared_Receiver_GetLowLevelTime();//t0=nTime_Num;if((nTime_Num >= 500) || (nTime_Num <= 400))//9ms 数据头高电平 hx1838输入的反的{ return INFRARED_RECEIVER_ERROR;}nTime_Num = Infrared_Receiver_GetHighLevelTime();//4.5ms 低电平 hx1838输入的反的if((nTime_Num >= 250) || (nTime_Num <= 200)){ return INFRARED_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=28 if((nTime_Num >= 60) || (nTime_Num <= 20)) { return INFRARED_RECEIVER_ERROR; }  nTime_Num = Infrared_Receiver_GetHighLevelTime();//1690us(nTime_Num=84.5) 是逻辑1 560us是逻辑0 nTime_Num=28 if((nTime_Num >=60) && (nTime_Num < 100)) { nData = 1; } else if((nTime_Num >=10) && (nTime_Num < 50)) { nData = 0; } else { return INFRARED_RECEIVER_ERROR; }  gInfraredReceiver_Data <<= 1; gInfraredReceiver_Data |= nData; }} return INFRARED_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口线。



代码实现:

void start(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();}  void stop(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();}  void ack(void){u8 i;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();}void write_data(u8 wr_data){u8 i;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();}void tm1637_DispStr(u8 *str){u8 i;u8 ledCode[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();} 

小船控制逻辑

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

void dealIrKeyDown(){u8 len;len = irKeyfifo_count;if(len > 0){ irKeyDataOut = irKeyfifo_DataOut(); //按键显示 U8ToHexstr(irKeyDataOut.index,dispStr); U8ToHexstr(irKeyDataOut.cmd,dispStr+2); tm1637_DispStr(dispStr); switch(irKeyDataOut.cmd){ case KEY_OK: case KEY_OK_CHANGHONG: motor1_Stop(); motor2_Stop(); break; case KEY_UP: case KEY_UP_CHANGHONG: motor1_ForwardRun(); motor2_ForwardRun(); break; case KEY_DOWN: case KEY_DOWN_CHANGHONG: motor1_BackwardRun(); motor2_BackwardRun(); break; case KEY_LEFT: case KEY_LEFT_CHANGHONG: motor1_ForwardRun(); motor2_Stop(); state = SHIP_LEFT; break; case KEY_RIGHT: case KEY_RIGHT_CHANGHONG: motor2_ForwardRun(); motor1_Stop(); state = SHIP_RIGHT; break; default: motor1_Stop(); motor2_Stop(); state = SHIP_STOP; break; } }}

04 DIY成品展示和演示视频


05 总结存在的问题

    遥控不灵敏

    毕竟红外遥控的使用场合并不是移动的物体上,再加上距离近,经常会出现遥控要按多次的情况。后期考虑改进stm的协议处理方法,增加容错性,如果还是不行就考虑升级为2.4G专用的玩具遥控。

    防水性问题

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

    后期考虑升级防水性能。

    没有声光电,不够酷炫。

    考虑升级,增加led灯条。



免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在微控制器领域,MSP430与STM32无疑是两颗璀璨的明星。它们各自凭借其独特的技术特点和广泛的应用领域,在市场上占据了重要的位置。本文将深入解析MSP430与STM32之间的区别,探讨它们在不同应用场景下的优势和局限...

关键字: MSP430 STM32 单片机

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

STM32与51单片机之间有什么差异呢?两者可以说是一场科技与性能的较量了。在科技飞速发展的今天,微控制器(MCU)已广泛应用于各类电子设备和系统中,发挥着举足轻重的作用。其中,STM32和51单片机作为两种常见的微控制...

关键字: STM32 51单片机 MCU

电磁铁是一种利用电流产生磁场的装置,具有快速响应、易于控制等特点,在工业自动化、电子设备、科学实验等领域有着广泛的应用。STM32是一款功能强大的微控制器,具有高性能、低功耗、易于编程等优点,是控制电磁铁的理想选择。本文...

关键字: 电磁铁 微控制器 STM32

边缘人工智能的实现涉及到三个基本 要素:安全性,连接性、自主性,而其中自主性是AI能力的体现,也是边缘AI有别于其他传统的物联网的关键。而通过ST Edge AI套件,就可以帮助各种不同类型的开发者实现覆盖全硬件平台的全...

关键字: 边缘人工智能 AI STM32

今天,小编将在这篇文章中为大家带来STM32单片机最小系统的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 单片机最小系统 STM32

STM32是一款由STMicroelectronics生产的微控制器系列,具有高性能、低功耗和丰富的外设资源。其中,串口通信是一种常用的通信方式,可以实现与其他设备之间的数据传输。

关键字: STM32 串口通信 微控制器

STM32是一种广泛使用的微控制器,具有丰富的通信接口。其中,串口通信是STM32与其他设备或系统进行数据交换的重要方式之一。本文将详细介绍STM32串口通信的原理、应用及常见故障。

关键字: STM32 串口通信

由于目前缺乏相应的监测技术,地下电缆线路出现异常运行状态无法被及时发现,久而久之易演变成大故障,最终只能通过更换地下电缆进行修复,耗费大量的人力、物力。鉴于此,开发了一种基于STM32的地下电缆异常状态检测系统,利用热传...

关键字: STM32 地下电缆

交通灯控制器是用于控制交通信号灯运行的设备,它可以根据交通流量、行人需求以及其他因素,动态地调整信号灯的变化时间和绿灯时长,以保证交通的流畅和安全。

关键字: 交通信号灯 STM32
关闭
关闭