点击上方蓝字关注我哦~

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

嵌入式软件

  1. 红外遥控器驱动

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=28if((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=28if((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

总结存在的问题

  1. 遥控不灵敏

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

    防水性问题

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

    后期考虑升级防水性能。

    没有声光电,不够酷炫。

    考虑升级,增加led灯条。

如果有感兴趣的同学可以关注后加小编微信索取代码工程和某宝组件链接。

喜欢本篇内容请给我们点个再看

一个DIY制作遥控船的方案相关推荐

  1. 测试环境搭建流程_案例解析:一个完整的项目测试方案流程,应该是怎么的?...

    作为一名软件测试工程师,为项目制作完成的测试方案并执行,是我们日常工作的重要部分,同时,也是一名合格的软件测试工程师应有的专业素养.那么,很多小白和测试新手肯定要问了:一个完整的项目测试方案流程,应该 ...

  2. DIY制作高精度低温漂电阻箱0.1~9.9GΩ(1)-- 项目介绍

    最新工作需要,DIY制作了一款高精度低温漂的电阻箱.想起在大学电子设计大赛时,也动手制作过一个多档位电阻箱.这次将参数进行提升优化,电阻的选型真是下了超大血本了,电路上没有什么复杂原理,电阻串联相加即 ...

  3. u盘怎么样在w ndows7上使用,Windows7安装U盘 DIY 制作全攻略

    Win7之家( www.win7china.com):Windows7安装U盘 DIY 制作全攻略 本文上手度:适合对BIOS设置.ISO镜像软件不熟悉的用户,高手请不用口水,请直接去软媒论坛Win7 ...

  4. 一个完整的SEO优化方案

    一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析人员 接下来,我们就对这四个小组分配工作. 首先,前端/页编人员主要负责站内优化,主要从四 ...

  5. 一个游戏制作的全过程

    原文地址:http://tieba.baidu.com/p/1060660229 大家每天在玩游戏,真正知道一款游戏制作的背后故事么?以下,请看 游戏策划 一个游戏的诞生,往往都是策划们脑海中的灵感一 ...

  6. 计算机幻灯片制作培训方案,教师ppt课件制作活动培训方案..doc

    教师ppt课件制作活动培训方案. 小学教师ppt课件制作活动培训会 培训时间:2014.11.26?地点:计算机室 主讲教师:肖兰 参与人员:全体教师 培训内容 第一讲powerpoint基础??Po ...

  7. 分享 使用普通笔记本电脑,DIY制作合成混音MTV视频,并上传分享的步骤

    分享 使用普通笔记本电脑,DIY制作合成混音MTV视频,并上传分享的步骤 设备:笔记本一台(自带麦克风),耳机一个(必须) 1. 首先选好你要唱的歌曲,多练习几次 2. 用谷歌搜索一下,下载这首歌的伴 ...

  8. 飞机航模的diy制作知识

    飞机航模的diy制作知识 在网上找到一些飞机航模制作文章,收集在这里. 初级橡皮筋动力飞机制作: http://wenku.baidu.com/view/047dd48ccc22bcd126ff0c9 ...

  9. 案例解析:一个完整的项目测试方案流程,应该是怎么的?

    作为一名软件测试工程师,为项目制作完成的测试方案并执行,是我们日常工作的重要部分,同时,也是一名合格的软件测试工程师应有的专业素养.那么,很多小白和测试新手肯定要问了:一个完整的项目测试方案流程,应该 ...

最新文章

  1. Linux中history历史命令使用方法详解
  2. 牛客题霸 NC21 链表内指定区间反转
  3. es6 var、let、const命令
  4. 20190807:排序数组删除重复项
  5. java图像的灰度值获取_java获取图像灰度
  6. 任意给定一个正整数N,求一个最小的正整数M(M1),使得N*M的十进制表示形式里只含有1和0。...
  7. 深度学习与人类语言处理-语音识别(part1)
  8. C++代码实现 生成器模式
  9. 光照度和光强度的区别
  10. 基于微信小程序的课程学习小程序
  11. marxico马克飞象
  12. nag在逆向中是什么意思_CrackMe003-如何理解透VB逆向中的4C大法(图文+视频)-重在思维方法...
  13. 【回眸】RS485VSRS232,I2C,SPI特点、什么是PMIC、RTOS移植相关问题
  14. 网 络 存 储 技 术
  15. IP地址分类 三类IP地址 IPV4
  16. 对于毛星云opencv教程中的方法汇总
  17. Java——ArrayList(动态数组)介绍
  18. 华为虚拟home键关闭_实体按键将全面消失?手机、耳机相继使用虚拟按键
  19. python3 bytes与str转换
  20. mysql myisam 优化,mysql myisam 优化设置 | 很文博客

热门文章

  1. win10找不到打印机_Win10电脑找不到自家Wifi无线网络解决方法 可能是无线信道问题...
  2. 计算机科学与技术英文文章,计算机科学与技术英文文献
  3. 人体绘画参考素材,美女跑步姿体动作不同角度参考资料
  4. Spring boot 正常启动 浏览器无法访问Controller
  5. 一个发包乱序问题记录
  6. rtx3090ti和gtx1080ti参数对比
  7. 雷达散射ISAR成像理论
  8. Github项目分享——hello-algorithm
  9. 反反复复的植物神经紊乱 到底如何调节才是对的
  10. python解码中文文本报错的解决办法