直入主题:
硬件部分:l298n、单片机最小系统(最优选,因为有很多外设的板子会影响输出电压大小,导致输出电压不够)、12V直流电源、HC-05蓝牙模块、USB转TTl模块、小车底盘一个(带电机的)、杜邦线若干。
下图为HC-05蓝牙模块,此模块有6引脚。
下图为USB转 TTL模块,此模块有5引脚。
下图为L298N电机驱动模块。
下图为单片机最小系统(单片机下为12V直流电源)
基本介绍完小车各部件,下面讲一下各模块怎么使用。
首先说HC-05蓝牙模块,这个模块是一个主从一体的蓝牙模块,需要先和USB转TTL模块连接VCC-VCC、GND-GND、TXD-RXD、RXD-TXD,然后和电脑相连(注意:连接电脑时需要同时按住HC-05上黑色小按钮,红灯双闪就对了),然后打开串口调试软件(链接:https://pan.baidu.com/s/1O-5b1qmakEjfLp74LzPw0A 提取码:oxez ),我用的是链接中的串口调试软件V2.4,工具中波特率设置为38400,发送AT,收到OK就对了。
然后发送以下指令:AT+ROLE=0(设置为从机,此时只可以被搜索)
AT+CMODE=1(允许连接)
AT+UART=9600(设置模块比特率为9600)
AT+NAME=随意英文(设置模块名字)
AT+PSWD=1234(设置密码)
还需要在手机下载蓝牙串口app。
然后讲一下L298N电机驱动模块,模块正对自己(左2蓝,右2蓝,下3蓝),左2蓝和右2蓝分别连接一个电机,是输出端,IN1、IN2、IN3、IN4是输入端,两两一对,12左、34右,当1和2分别一个高电平一个低电平时(即in1=0、in2=1),电机转(in1=1,in2=0反转)。ENA、ENB为PWM调速端口。下3蓝中,最左是12v直流输入,中间gnd,最右5v输出,可以给单片机5v供电。
然后再说一下连线部分:电源给L298N供电,L298n给两个电机以及单片机供电,单片机2.7654分别连接in1234,2.32分别接ena、enb。蓝牙模块TXD、RXD接单片机3.0、3.1。
在本程序中设置31.32.33.34为字符段发送,HC-05接收到通过单片机3.1、3.0输入给单片机,然后单片机引脚做出反应,使l298n输入端做出反应,实现电机前后转,两轮转速不同实现转向。
下面给出全部源代码,此小车只是做出最简单的前后左右,其它细节还需要进一步完善。
#include<reg52.h> sbit in1=P2^7; sbit in2=P2^6; sbit in3=P2^5; sbit in4=P2^4; sbit ena=P2^3; sbit enb=P2^2; typedef unsigned int uint; typedef unsigned char uchar; uint pass = 0; //传递数据位 void delay(unsigned int z) //延时函数 { unsigned int y; for(;z>0;z--) for(y=0;y<125;y++); } void delay_10um(unsigned int n) { while(n--); } void qianjin() //前进 { in1=1; in2=0; in3=1; in4=0; ena=1; enb=1; delay_10um(40); ena=0; enb=0; delay_10um(60); } void houtui() //后退 { in1=0; in2=1; in3=0; in4=1; ena=1; enb=1; delay_10um(40); ena=0; enb=0; delay_10um(60); } void zuozhuan() //左转 { in1=1; in2=0; ena=1; delay_10um(60); ena=0; delay_10um(40); in3=1; in4=0; enb=1; delay_10um(40); enb=0; delay_10um(60); } void youzhuan() //右转 { in1=1; in2=0; ena=1; delay_10um(40); ena=0; delay_10um(60); in3=1; in4=0; enb=1; delay_10um(60); enb=0; delay_10um(40); } void tingzhi() //停止 { in1=0; in2=0; } void UART_init() { TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; //波特率9600 SM0 = 0; SM1 = 1; // 串口工作方式1 10位异步 REN = 1; //串口允许接收 TR1 = 1; EA = 1; ES =1 ; //串口中断 } int main() { UART_init(); //波特率9600 while(1) { if(pass == 0x31) qianjin(); if(pass == 0x32) zuozhuan(); if(pass == 0x33) youzhuan(); if(pass == 0x34) houtui(); if(pass == 0x35) tingzhi(); } } void UART_INTERRUPT() interrupt 4 { pass = SBUF; RI = 0; SBUF = pass; while(!TI); TI = 0; }