极客手工:自制51四驱无线遥控小车
遥控小车大家应该都玩过,网上也有各种DIY小车的制作详解。我做的这个遥控小车和其他的作品大同小异,但作为单片机设计,这次我把单片机按键发送程序、无线模块使用、电机驱动作为本教程的核心内容。
小车参数:
控制键5个:前进、后退、左转、右转、停止;
有效距离200米。
硬件组装
准备工作:
材料:直流电机4个,L293D电机驱动模块、蓄电池一块,车身底盘一个。
说明:车身底盘大家根据自己的购买力自行购买,蓄电池也是。至于L293D模块,淘宝上卖的比较贵,不过我用的就是成品模块,效果非常好,钱不多的同学可以自己买芯片,自制模块。原理很简单,官方资料也很详细。或者改为继电器控制都可以,具体看自己的实际购买力。用模块的好处是,模块可以输出5V电源给系统供电,详情请参考淘宝。
如果你买的是现成的底盘,把电机固定上去就OK了。至于想自己做底盘的,我想说,一定要结实,这次的小车马力很足,因为有电机驱动,速度比较快(不带减速齿轮的底盘一定要小心,速度非常快),后劲也足,不小心撞墙很正常,所以底盘必须够结实!
组装好后,就是电机和驱动模块的接线了,下面我就详细的说一下L293D模块的使用。
L293D是专门的电机驱动芯片,工作电压5V,驱动电压输入可达36V,输出电流正负600ma,4个控制端,4个输出端。
原理图:
其中A为输出控制端,Y为输出控制端,1A即控制1Y,以此类推。1,2EN 3,4EN需要短接,芯片最大工作电压不得超过7V。
封装图:
Vcc1接工作电压,5V。Vcc2接电机的驱动电源,一般来说,这个电压要比5V高,我用的是12V蓄电池,把12v的正极接到VCC2。要记住的是,芯片、单片机、蓄电池电源是需要共地的,不要因为电机是12V,单片机控制部分是5V就把电源完全独立开来,正极完全独立,但是GND(负极)都必须接在一起。
驱动芯片与电机的接法:
左边前后轮:
1Y接电机红线,2Y接电机黑线,左边前轮电机
3Y接电机红线,4Y接电机黑线,左边后轮电机
前进指令:1A=1(输出12V),2A=0(输出0V),3A=1(输出12V),4A=0(输出0V)
后退指令:1A=0(输出12V),2A=1(输出0V),3A=0(输出12V),4A=1(输出0V)
右边的和左边的接法完全一样。
注意:前进和后退并不是绝对的,因为是直流电机,不刻意的强调正负极,主要看你电机是如何接线的,结果完全可以与教程相反。不过一定要保证电机接线的统一性,不能随意,不能前轮接顺时针线序,后轮却是逆时针线序。如果买的电机连接线不带颜色,一定要自己测好哪种接法是顺时针的,哪种是逆时针,否则前轮前进后轮后退,对电机伤害特别大。或者左右边的2对电机转动方向不统一,导致编程麻烦。
芯片默认输出0V ,所以在没有程序的时候,大家不需要担心电机会转动。一个芯片只能控制2个电机,右边的再接个芯片就OK了,网上卖的模块都有2个驱动芯片,刚刚好够4个电机。买模块的好处就是拿来可以直接接线,而且模块上有标号,不必担心接错。建议初学者还是买模块,虽然贵,但是速度有保证!
驱动模块图:
小车转动方式:前进后退就是4个电机同时的正转、反转;左转弯和右转弯有2种方式:A一边转动一边不转,B一边正向转动一边反向转动。这两种各有各的好处,大家可以根据自己的实际情况来确定转弯的方式,不同车的底盘效果肯定是不一样的,转弯的方式是程序控制的,本程序是B种方式。
我的小车图:
这种电机是减速的,所以不会很快。如果是直接电机带动的轮子,再用12V电源的话,速度就会非常快,模块的输出直接连接电机电源线,输出根据标号或根据程序接入到单片机上。
单片机的接线:
这是我的最小系统板,全部引出IO,带板载USB下载功能,PO口输出接8路流水灯(有选通开关),这样设计开发板是为了PO口做输出时专门看输出状态。
我用的是电机驱动模块,L293D的输入是有标号的,1—8直接按照顺序接到P1.0—P1.7就可以了。
驱动芯片和电机连接好后,把线固定好,留出要与单片机连接的8根控制线。同时也要注意给无线模块留一个小空间。
无线模块解说:
我一直使用的是433无线串口模块,具体型号和价格我会附在清单表里,现在我说下它的性能、这种无线模块最大的好处就是有较强的抗干扰性,2个模块直接可以设置ID,只有在一个ID号下的模块才可以通信,而且可以实现一对多通信;这种模块是无需编程的,直接把数据发送到串口即可,模块会自动调制解调,就目前使用的情况而言,还没发现它有调制解调错误的时候,可以说,在数据传输上,这个模块误码率极低。不过需要注意的是,模块2次接收(发送)之间的间隔要大于200ms,这是非常重要的一个参数,如果想做高速数据传输的朋友请慎重选用!
模块的接线非常简单,电源2根线,数据线2根:TX(接单片机RX)、RX(接单片机TX),关于无线模块的设置方案,请参考淘宝睿迪无线XL02-232AP1型号的资料手册。模块在通电的一瞬间红灯绿灯同时会闪一下,然后熄灭,此时进入待机状态,模块发送数据时,红灯亮;接收数据时,绿灯亮。
组装完毕:
我用的是12v蓄电池,接到驱动模块后,模块的5V输出又可以直接给无线模块和最小系统部分供电。虽然看起来比较笨重,但是12V的电源,与一般的小车在速度和耐力上,都有了本质的提高。
遥控部分:
回复“原理仿真”和“原件清单”获取相应资料。
源代码:
;接收程序
ORG 0 ;程序起始地址
SJMP STAR ;跳转到主程序
ORG 30H ;串口中断地址
sjmp loop ;跳转到中断服务程序
STAR:
MOV SP,#5FH ;设置堆栈
MOV SCON,#50H ;串行数据格式(详情请参考51手册)
MOV TMOD,#20H ;定时器工作方式(请参考51手册)
MOV PCON,#0 ;波特率不倍速(请参考51手册)
MOV TH1,#0fdH ;设置波特率在9600
MOV TL1,#0fdH ;设置波特率在9600
SETB EA ;开起中断
clr ET1 ;关闭定时1中断
SETB ES ;开起串口中断
SETB TR1 ;启动定时器1
mov a,#0 ;
mov p1,a ;设置初始值,即开机p1输出00h小车不动作
main:
mov p1,a ;把a值给p1端口
sjmp main ;无限循环main程序
LOOP:
jnb ri,$ ;判断接收位是否接收完
clr ri ;接收完后清空接收位
mov a,sbuf ;发送的数据给a
reti ;返回后,a的值就会给p1
END
;发送程序
ORG 0 ;程序起始地址
SJMP START ;跳转到主程序
ORG 30H ;串口中断地址
START:
MOV SP,#5FH ;设置堆栈
MOV TMOD,#20H ;定时器工作方式(请参考51手册)
MOV PCON,#0 ;波特率不倍速(请参考51手册)
MOV SCON,#50H ;串行数据格式(详情请参考51手册)
MOV TH1,#0fdH ;设置波特率在9600
MOV TL1,#0fdH
setb EA ;开起中断
clr ET1 ;关闭定时1中断
setb ES ;开起串口中断
SETB TR1 ;启动定时器1
main:
lcall kcs ;调用按键扫描程序
jnz key ;有键按下则跳转到key程序段
sjmp main ;无限循环main程序
kcs:
mov p1,#0ffh ;p1给初值
mov a,p1 ;p1的数值给a
cpl a ;取反a
anl a,#0ffh ;与运算
ret
key:
lcall delay ;软件延时程序,按键去抖
jb acc.0,send1
jb acc.1,send2
jb acc.2,send3
jb acc.3,send4
jb acc.4,send5
ret
DELAY:
MOV R5,#20
D1:MOV R6,#10
D2:MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
ret
send1:
mov r1,#10101010b ;前进指令
sjmp send
send2:
mov r1,#01010101b ;后退指令
sjmp send
send3:
mov r1,#01011010b ;左转指令
sjmp send
send4:
mov r1,#10100101b ;右转指令
sjmp send
send5:
mov r1,#00h ;停止指令
sjmp send
send:
MOV SBUF,r1 ;指令给sbuf
JNB TI,$ ;判断是否发送完
reti ;中断返回
END
- 如何使用Hue上创建一个完整Oozie工作流
- MySQL远程代码执行/权限提升漏洞的分析与实践(CVE-2016-6662)
- 如何在CDH集群上部署Python3运行环境及运行Python作业
- Hacking Aria2 RPC Daemon
- 如何修改CDH集群的DataNoe节点HOSTNAME
- Sparkjava Framework 文件遍历漏洞(CVE-2016-9177)分析与探究
- 绕过混合内容警告 - 在安全的页面加载不安全的内容
- 如何在Kerberos环境使用Flume采集Kafka数据并写入HDFS
- 熊市里生成几个BTC靓号,冷存储起来装死吧
- 傲游浏览器漏洞系列(上)- 任意文件写入,UXSS
- 如何使用Cloudera Manager在线为集群减容
- GitLab 任意文件读取漏洞 (CVE-2016-9086) 和任意用户 token 泄露漏洞
- 如何使用Hue通过数据文件创建Collections
- GNU tar 解压路径绕过漏洞(CVE-2016-6321) 分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux内核设备驱动之proc文件系统笔记整理
- CentOS7.6系统下使用yum配置lnmp环境的方法
- Linux内核设备驱动之高级字符设备驱动笔记整理
- Linux使用scp命令进行文件远程拷贝详解
- Linux内核设备驱动之Linux内核模块加载机制笔记整理
- linux无损扩容的方法
- Linux内核设备驱动之内核的时间管理笔记整理
- 使用squid搭建http和https的代理服务器设置指南
- linux中gdb的入门使用教程
- Linux命令中Ctrl+z、Ctrl+c和Ctrl+d的区别和使用详解
- Linux lseek函数的使用详解
- Nginx出现500 Internal Server Error 错误的解决方案
- Linux常见基本命令与用法大全
- Navicat 环境测试 innodb 的默认行锁升级表锁
- Ubuntu18.04更换国内源的方法示例