C51小车项目-笔记10-进阶版

一、循迹小车

TCRT5000传感器的红外发射二极管不断发射红外线 当发射出的红外线没有被反射回来或被反射回来但强度不够大时, 红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态 被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和, 此时模块的输出端为低电平,指示二极管被点亮

循迹模块TCRT5000长相如下图:

 接线:

 VCC:接电源正极(3-5V)

GND:接电源负极

DO:TTL开关信号输出0、1

AO:模拟信号输出(不同距离输出不同的电压,此脚一般可以不接)

 循迹小车原理:

由于黑色具有较强的吸收能力,当循迹模块发射的红外线照射到黑线时,红外线将会被黑线吸收,导致 循迹模块上光敏三极管处于关闭状态,此时模块上一个LED熄灭。在没有检测到黑线时,模块上两个LED 常亮

 

 循迹模块安装在小车车头两侧

下方小车两个模块都能反射回来红外,输出低电平,灯亮,直走

上方小车左模块遇到黑线,红外被吸收,左模块输出高电平,右模块输出低电平,左转,反之右转

 代码如下:

void main()
{
	Time0Init();
	Time1Init();   
	//UartInit();
	//Delay1000ms();
	
	while(1){
		
		if(leftSensor == 0 && rightSensor == 0){//前进
			speedLeft = 28;//10份单位时间全速运行,30份停止,所以慢,20ms是40份的500us
			speedRight = 30;
		}
		if(leftSensor == 1 && rightSensor == 0){//左转
			speedLeft = 10;//10份单位时间全速运行,30份停止,所以慢,20ms是40份的500us
			speedRight = 40;
		}
		if(leftSensor == 0 && rightSensor == 1){//右转
			speedLeft = 28;
			speedRight = 15;
		}
		if(leftSensor == 1 && rightSensor == 1){//停止
			speedLeft = 0;
			speedRight = 0;
		}
	}
 } 

 走直线的时候,如果小车往左偏,证明左边马达比右边马达马力大,所以要把右边的速度调快,多次测试,找到合适的数值

二、跟随小车/避障小车

使用的模块:超声波、舵机、C51开发板、电机等

演示视频如下:

避障小车

代码如下:

char dir;
	double disMiddle;
	double disRight;
	double disLeft;
	
	Time1Init();//定时器1初始化
	Time0Init();//定时器0初始化
	//舵机初始位置
	sgMiddle();//正前方

 	Delay200ms();
	Delay200ms();
	dir = MIDDLE;//用临时变量接收MIDDLE、LEFT、RIGHT的值,用它来判断当前小车头的状态

	while(1){
		//PWM(脉冲宽度调制)信号来控制旋转角度
		//2.0ms的高电平时间对应舵机转动到135°,而2.5ms的高电平时间对应舵机转动到180,我现在是2.0ms
		if(dir != MIDDLE){//车头不在正前方
			sgMiddle();

			dir = MIDDLE;//让车头变为正前方
			Delay200ms();
		}
		disMiddle = get_distance();//测距
		if(disMiddle>35){//前方距离大于35
			//前进	
			Delay200ms();
			openStatusLight();//距离D5亮D6灭
			goForward();//向前走
			
		}else if(disMiddle < 20){//前方距离小于20
			goBack();//后退
			Delay20ms();
		}else{
			//停止
			stop();
			//测左边距离
			closeStatusLight();//D5灭D6亮
			sgLeft();//
			Delay200ms();
			//Delay2000ms();
			disLeft = get_distance();//左边距离
			
			sgMiddle();
			Delay20ms();
			//Delay2000ms();
			
			sgRight();
			dir = RIGHT;
			Delay200ms();
			//Delay2000ms();
			disRight = get_distance();//右边距离
			
			if(disLeft < disRight){//如果右边距离大于左边距离,则向右转
				goRight();
				Delay20ms();
				stop();
			}
			if(disLeft > disRight){//如果左边距离大于右边距离,则向左转
				goLeft();
				Delay20ms();
				stop();
			}
		}
	}	
 } 
 
  
 
 

 三、OLED二次开发小车

 实现用OLED显示小车速度,还可以通过蓝牙模块显示小车的速度和控制小车前后左右移动。

这里使用的测速模块是

用于电机转速测试

有遮挡,输出高电平;无遮挡,输出低电平

  • 测试原理和单位换算

轮子走一圈,经过一个周长,C = 2x3.14x半径= 3.14 x 直径(6.5cm) 对应的码盘也转了一圈,码盘有20个格子,每经过一个格子,会遮挡(高电平)和不遮挡(低电平), 那么一个脉冲就是走了 3.14 * 6.5 cm /20 = 1.0205CM  

定时器可以设计成一秒,统计脉冲数,一个脉冲就是1cm 假设一秒有80脉冲,那么就是80cm/s

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值