完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
简单介绍
大一时做了一辆循迹小车,第一次做小项目,没有经验,走了很多弯路,前前后后花费了大概一个月的时间。被小车折磨了一个月后,我学到了很多东西,体会很深,很想写下来与大家分享。主要献给和我一样第一次做项目的朋友们,希望对你们有用。 接下来我分享一下我这个小车的做法和经验。整个过程主要分为查资料、购买原件、组装、编程序、调试小车五步。在这篇博客中我将具体介绍这五步,让你看完后对循迹小车有大体了解,可以独立做出循迹小车,避免走很多弯路。 展示: 前提:
一、关于查资料 需要C语言、51单片机和高中物理电学基本知识。C语言推荐观看浙江大学翁凯老师的C语言课程,51单片机推荐郭天祥老师的书籍。 二、购买原件 必要的模块 1、 小车底盘 建议买 直接购买4 轮两层的, 厚一些的亚克力板, 板子颜色随便, 也 可以买铝合金的, 更坚实 2、 电机驱动(型号: L289N) 3、避障循迹模块 可以购买四路集成在一块板子上的,也可以买单独的。 4、降压稳压模块 5、单片机最小系统 6、电池(18650 电池组, 或者 3 节 18650 单电池使用电池盒) 非必要的模块 1、 超声波测距模块 2、蜂鸣器(有源蜂鸣器) 3、光敏开关或声音开关 4、声控开关 5、杜邦线(母对母建议多买一份、 公对母、 公对公, 长度建议 20cm, 可以买点长的) 6、开关 7、螺丝及铜柱, 8、1602 显示模块 9、显示电池电压模块 三、组装 1、注意电池最好放上面,便于充电。 2、布线要整洁 四、程序(供参考) #include #define uint unsigned int #define uchar unsigned char ***it Kaiguan=P1^4; //声控开关 ***it Fengming=P0^0; //蜂鸣器 ***it left1=P1^1; ***it left2=P0^2; //红外传感器 ***it left3=P1^0; ***it right1=P1^2; ***it right2=P1^3; ***it right3=P0^1; ***it ENA=P3^2; //电机驱动使能A端 ***it in1=P3^3; ***it in2=P3^4; ***it in3=P3^5; ***it in4=P3^6; ***it ENB=P3^7; //电机驱动使能B端 uchar t, zkba, zkbb; void delay(uint xms) //延时函数 { uint a,b; for(a=xms;a>0;a--) for(b=110;b>0;b--); } void Timer0Init() //定时器0初始化 { TMOD=0X01; TH0=(65532-100)/256; TL0=(65532-100)%256; EA=1; ET0=1; TR0=1; } void Timer0() interrupt 1 //定时器0 pwm调速 { TH0=(65536-100)/256; TL0=(65536-100)%256; ++t; if(t ENA=1; } else { ENA=0; } if(t ENB=1; } else { ENB=0; } if(t>=100) { t=0; } } void zhizou() // 直走 { in1=0; in2=1; in3=1; in4=0; zkba=85; zkbb=85; } void turn_left() // 左拐 { in1=1; in2=0; in3=1; in4=0; zkba=10; zkbb=70; } void turn_right1() // 右拐 { in1=0; in2=1; in3=0; in4=1; zkba=65; zkbb=15; } void turn_right2() // 右拐 { in1=0; in2=1; in3=0; in4=1; zkba=70; zkbb=40; } void stop() // 停止 { in1=1; in2=1; in3=1; in4=1; zkba=0; zkbb=0; } void fasheng() // 发声 { Fengming=1; delay(30); Fengming=0; } void xunji() //循迹 { uchar flag ; if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 1)&&(right3==1)) // 直走 { flag=0; } if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 0)&&(right3==1)) // 右拐 { delay(5); if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 0)&&(right3==1)) flag=1; } if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 0)&&(right3==0)) // 右拐 { flag=5; } if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 1)&&(right3==1)) // 左拐 { delay(15); if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 1)&&(right3==1)) flag = 2; } if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 0)&&(right3==1)) // 左拐 { delay(15); if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 0)&&(right3==1)) flag = 2; } if((left1==1)||(left2==1)) { delay(4); if((left1==1)||(left2==1)) // 发声 flag = 3; } if((left1==1)||(left2==1)) { delay(8); if((left1==1)||(left2==1)) // 发声 flag = 3; } if((left3 == 1)||(left1==1)) // 停 { delay(5); if((left3 == 1)&&(left1==1)) flag = 4; } if((left3 == 1)||(left2==1)) // 停 { delay(10); if((left3 == 1)&&(left2==1)) flag = 4; } switch(flag) { case 0:zhizou(); break; case 1:turn_right1(); break; case 2:turn_left(); break; case 3:fasheng(); break; case 5:turn_right2(); break; case 4:turn_left(); delay(100); zhizou(); delay(60); stop(); while(1); break; default:zhizou(); break; } } void main() { Fengming=0; Timer0Init(); delay(30); while(1) { if(Kaiguan==0) { while(1) { xunji(); } } } } 五、调试 1、主要是修改pwm的占空比调速和红外检测黑白线,修改xunji()函数 |
|
|
|
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1178浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 12:26 , Processed in 1.438486 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号