完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
这几天有时间做了一个手机控制的蓝牙遥控小车车,终于今天实现了,把过程和心得跟大家分享一下。
废话不多说,先上实物图 一、项目元件清单 1、某宝购买一个智能小车底盘(本人车是四驱的,因此有四个电机,两块亚克力板和一些配件螺丝) 2、L298n模块 两个(一个298控制两个电机) 3、HC-06蓝牙模块 4、电池盒跟18650电池3个 5、单片机最小系统 6、杜邦线至少12根,当然越多越好 7、若干根导线(连接电机用的,以及电池盒连到L298N跟单片机) 二、制作过程 首先,先去了解一下L298N的接线,我当时也是懵逼了好久,反正摸索着也会了,一般店家都有资料。然后是蓝牙模块的使用,拿到蓝牙模块后,有开发板的话(没有就用单片机的烧录器),先按照TXD接TXD,RXD接RXD,打开电脑的串口助手与蓝牙构建通信,打开AT,发送AT指令集,比如设设波特率,改个名字,改个配对的密码。但通过蓝牙与单片机连接通信的时候,就是TXD接RXD了。最后一个就是,本人在接线的时候经常碰壁。比如,你以为接好的线他其实没接好,根本没通,还是拿万用表B了才知道。 因为本人忘了买电池盒,所以我是用12V的直流电接着的,导致遥控车拖着跟电线。 三、实物图 (拖着跟电线以及充电宝供电的车 不过我没通电) 资料内包括L298N的部分资料,以及蓝牙的说明书(看AT指令集就好)和源程序。 /手机蓝牙遥控小车 APP可以在应用市场搜 蓝牙串口助手 左转右转大概是90度 我的是四驱的,如果是只有一个l298N的话就把带2的删了 pwm有十级变速/ #include #define Left_moto2_pwm P0_4 //接驱动模块ENA 使能端,输入PWM信号调节速度 左后轮 #define Right_moto2_pwm P0_5 //接驱动模块ENB 右后轮 #define Left_moto_pwm P1_4 //接驱动模块ENA 使能端,输入PWM信号调节速度 左前轮 #define Right_moto_pwm P1_5 //接驱动模块ENB 右前轮 #define uchar unsigned char #define uint unsigned int ***it P0_4=P0^4; //定义P0_4 ***it P0_5=P0^5; //定义P0_5 ***it P1_4=P1^4; //定义P1_4 ***it P1_5=P1^5; //定义P1_5 /电机驱动IO定义/ ***it IN1 = P1^2; //为1 左电机反转 前轮 ***it IN2 = P1^3; //为1 左电机正转 前轮 ***it IN3 = P1^6; //为1 右电机正转 前轮 ***it IN4 = P1^7; //为1 右电机反转 前轮 /****it EN1 = P1^4; //为1 左电机使能 ***it EN2 = P1^5; //为1 右电机使能 */ ***it IN5 = P0^2; //为1 左电机反转 后轮 ***it IN6 = P0^3; //为1 左电机正转 后轮 ***it IN7 = P0^6; //为1 右电机正转 后轮 ***it IN8 = P0^7; //为1 右电机反转 后轮 /****it EN3 = P0^4; //为1 左电机使能 后轮 ***it EN4 = P0^5; //为1 右电机使能 后轮 */ bit Right_moto_stop=1; bit Left_moto_stop =1; unsigned int time=0; int pwm=1; #define left_motor_en EN1 = 1 //左电机使能 #define left_motor_stops EN1 = 0 //左电机停止 #define right_motor_en EN2 = 1 //右电机使能 #define right_motor_stops EN2 = 0 //右电机停止 #define left_motor2_en EN3 = 1 //左电机使能 后 #define left_motor2_stops EN3 = 0 //左电机停止 后 #define right_motor2_en EN4 = 1 //右电机使能 后 #define right_motor2_stops EN4 = 0 //右电机停止 后 #define left_motor_go IN1 = 0, IN2 = 1//左电机正传 #define left_motor_back IN1 = 1, IN2 = 0//左电机反转 #define right_motor_go IN3 = 1, IN4 = 0//右电机正传 #define right_motor_back IN3 = 0, IN4 = 1//右电机反转 #define left_motor2_go IN5 = 0, IN6 = 1//左电机正传 #define left_motor2_back IN5 = 1, IN6 = 0//左电机反转 #define right_motor2_go IN7 = 1, IN8 = 0//右电机正传 #define right_motor2_back IN7 = 0, IN8 = 1//右电机反转 unsigned char pwm_val_left =0;//变量定义 unsigned char push_val_left =0;// 左电机占空比N/10 unsigned char pwm_val_right =0; unsigned char push_val_right=0;// 右电机占空比N/10 void delay(uint z) { uint x,y; for(x = z; x > 0; x–) for(y = 114; y > 0 ; y–); } //蓝牙初始化 void UART_INIT() { SM0 = 0; SM1 = 1;//串口工作方式1 REN = 1;//允许串口接收 EA = 1;//开总中断 ES = 1;//开串口中断 TMOD = 0x20;//8位自动重装模式 TH1 = 0xfd; TL1 = 0xfd;//9600波特率 TR1 = 1;//启动定时器1 } /************************************************************************/ void run(void) //pwm调速函数 { push_val_left =pwm; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度 push_val_right =pwm; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度 if(pwm10) pwm=0; if(pwm0&&pwm<0) pwm=0; } /***********************************************************************/ / PWM调制电机转速 / /***********************************************************************/ /* 左侧电机调速 */ /*调节push_val_left的值改变电机转速,占空比 */ void pwm_out_left_moto(void) { if(Left_moto_stop) { if(pwm_val_left<=push_val_left) { Left_moto_pwm=1; Left_moto2_pwm=1; } else { Left_moto_pwm=0;Left_moto2_pwm=0; } if(pwm_val_left>=10) pwm_val_left=0; } else { Left_moto_pwm=0;Left_moto2_pwm=0; } } /*****************************************************************/ / 右侧电机调速 / void pwm_out_right_moto(void) { if(Right_moto_stop) { if(pwm_val_right<=push_val_right) { Right_moto_pwm=1; Right_moto2_pwm=1; } else {Right_moto_pwm=0; Right_moto2_pwm=0;} if(pwm_val_right>=10) pwm_val_right=0; } else {Right_moto_pwm=0;Right_moto2_pwm=0; } } /**************************************************/ ///TIMER0中断服务子函数产生PWM信号/ void timer0()interrupt 1 using 2 { TH0=0XF8; //1Ms定时 TL0=0X30; time++; pwm_val_left++; pwm_val_right++; pwm_out_left_moto(); pwm_out_right_moto(); } //小车前进 void forward() { ET0 = 1; run(); //pwm 程序 left_motor_go; //左电机前进 right_motor_go; //右电机前进 left_motor2_go; //左电机前进 后轮 right_motor2_go; //右电机前进 后轮 } void left_go() //左转 { ET0 = 1; run(); left_motor_back; right_motor_go; left_motor2_back; right_motor2_go; delay(700); forward(); } //右转 void right_go() { ET0 = 1; run(); delay(50); right_motor_back; left_motor_go; right_motor2_back; left_motor2_go; delay(700); forward(); } //小车左转圈 void left() { ET0 = 1; run(); delay(50); right_motor_go; // 右电机前进 left_motor_back; // 左电机后退 right_motor2_go; // 右电机前进 left_motor2_back; // 左电机后退 } //小车右转圈 void right() { ET0 = 1; run(); left_motor_go; right_motor_back; left_motor2_go; right_motor2_back; } //小车后退 void back() { ET0 = 1; run(); left_motor_back; right_motor_back; left_motor2_back; right_motor2_back; } //小车停止 void stop() { ET0 = 0; P1=0; P0=0; } //串口中断 void UART_SER() interrupt 4 { if(RI) { RI = 0;//清除接收标志 switch(SBUF) { case ‘g’: forward(); break;//前进 case ‘b’: back(); break;//后退 case ‘l’: left(); break;//左转圈 case ‘r’: right(); break;//右转圈 case ‘s’: stop(); break;//停止 case ‘z’: left_go(); break;//左转行驶 case ‘y’: right_go(); break;//右转行驶 case ‘p’: pwm++;break; //加速 case ‘c’: pwm–;break; //减速 } } } void main() { TMOD=0X01; TH0= 0XF8; //1ms定时 TL0= 0X30; TR0= 1; ET0= 1; EA = 1; UART_INIT();//串口初始化 while(1); } 最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步, 如果需要 完整代码或设计文件,请在下方留言或者私信我,看到后会第一时间回复。 谢谢! |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
328浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 23:05 , Processed in 2.005714 second(s), Total 82, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号