一、analogWrite函数的使用
用analogWrite来替换digitalWrite
说明
将一个模拟数值写进Arduino引脚。这个操作可以用来控制LED的亮度, 或者控制电机的转速.
在Arduino UNO控制器中, analogWrite()函数支持以下引脚: 3, 5, 6, 9, 10, 11 在调用analogWrite()函数前,您无需使用pinMode()函数来设置该引脚。
语法
analogWrite(pin, value)
参数
pin :被读取的模拟引脚号码
value :0到255之间的PWM频率值, 0对应off, 255对应on
小车接线情况说明(具体看个人)
2,3控左电机,4,5控右电机
代码示例:
//小车前进的代码是: void qianJin() { // 小车前进的功能 digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); } //如果我们只对前进,左转,右转控制速度 //由于硬件特性:Arduino UNO的3,5口支持analogWrite函数,2,4口不支持 //所以,我希望前进的代码是 void qianJin() { // 小车前进的功能 digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, HIGH); } //此时,把接口4,5的杜邦线对调 //为了速度控制可以优化代码成 void qianJin() { // 小车前进的功能 digitalWrite(2, LOW); analogWrite(3, 120); digitalWrite(4, HIGH); analogWrite(5, 120);//120是 }
控制前进速度的代码:
/* 把IO口4和IO口5的接线对调! 前进代码左轮3是模拟输出,5是模拟输出,2和4口不支持,直接给低电平 3口和5口支持模拟输出,达到小车前进方向上的速度控制目的。 */ void carInit() { // put your setup code here, to run once: pinMode(2, OUTPUT); // 配置2口为输出引脚 pinMode(3, OUTPUT); // 配置3口为输出引脚 //右轮信号方向初始化 pinMode(4, OUTPUT); // 配置4口为输出引脚 pinMode(5, OUTPUT); // 配置5口为输出引脚 } void qianJin() { // 小车前进的功能 digitalWrite(2, LOW); analogWrite(3, 230); digitalWrite(4, LOW); analogWrite(5, 230); } void setup() { // put your setup code here, to run once: carInit(); } void loop() { // put your main code here, to run repeatedly: qianJin(); }
控制前进左转右转:
void carInit() { // put your setup code here, to run once: pinMode(2, OUTPUT); // 配置2口为输出引脚 pinMode(3, OUTPUT); // 配置3口为输出引脚 //右轮信号方向初始化 pinMode(4, OUTPUT); // 配置4口为输出引脚 pinMode(5, OUTPUT); // 配置5口为输出引脚 } void qianJin() { // 小车前进的功能 digitalWrite(2, LOW); analogWrite(3, 150); digitalWrite(4, LOW); analogWrite(5, 150); } void zuoZhuan() { // 小车左转,左边电机速度慢,右边电机速度快 digitalWrite(2, LOW); analogWrite(3, 90); //左 digitalWrite(4, LOW); analogWrite(5, 250);//右 } void youZhuan() { // 小车左转,左边电机速度慢,右边电机速度快 digitalWrite(2, LOW); analogWrite(3, 250); //左 digitalWrite(4, LOW); analogWrite(5, 90);//右 } void setup() { // put your setup code here, to run once: carInit(); } void loop() { // put your main code here, to run repeatedly: youZhuan(); }
二、红外循迹模块介绍
我这里用的是红外循迹模块TCRT5000
简单概括:没反射回来,D0输出高电平,灭灯
(1)什么情况下红外线没有返回来
红外照射在黑线上
在黑线上DO电平表现为高电平!
灯的表现为灭灯
(2)什么时候该左转
说明小车偏右,说明左循迹模块在黑线上,左循迹模块的电平表现为高电平
右循迹模块能接收到红外,电平表现为低电平
(3)什么实时该右转
说明小车偏左,右循迹在黑线上,右循迹高电平,左循迹低电平
三、循迹小车代码实现
/* 做循迹模块接Arduino的11口,右循迹模块接Arduinod的12口 小车控制速度前进 */ int leftX = 11; int rightX = 12; void carInit() { // put your setup code here, to run once: pinMode(2, OUTPUT); // 配置2口为输出引脚 pinMode(3, OUTPUT); // 配置3口为输出引脚 //右轮信号方向初始化 pinMode(4, OUTPUT); // 配置4口为输出引脚 pinMode(5, OUTPUT); // 配置5口为输出引脚 } void qianJin() { // 小车前进的功能 digitalWrite(2, LOW); analogWrite(3, 100); digitalWrite(4, LOW); analogWrite(5, 100); } void ting() { // 小车前进的功能 digitalWrite(2, LOW); analogWrite(3, 0); digitalWrite(4, LOW); analogWrite(5, 0); } void zuoZhuan() { // 小车左转,左边电机速度慢,右边电机速度快 digitalWrite(2, LOW); analogWrite(3, 80); //左 digitalWrite(4, LOW); analogWrite(5, 250);//右 } void youZhuan() { // 小车左转,左边电机速度慢,右边电机速度快 digitalWrite(2, LOW); analogWrite(3, 250); //左 digitalWrite(4, LOW); analogWrite(5, 80);//右 } void setup() { // put your setup code here, to run once: carInit(); pinMode(leftX,INPUT); pinMode(rightX,INPUT); } void loop() { // put your main code here, to run repeatedly: //什么时候该左转 //左循迹模块的电平表现为高电平,右循迹模块表现为低电平 if( digitalRead(leftX) == 1 && digitalRead(rightX) == 0 ){ zuoZhuan(); } //什么时候右转 //右循迹高电平,左循迹低电平 if( digitalRead(leftX) == 0 && digitalRead(rightX) == 1 ){ youZhuan(); } //什么时候前进 //左右都为低电平 if( digitalRead(leftX) == 0 && digitalRead(rightX) == 0 ){ qianJin(); } //什么时候停 //左右都为高电平 if( digitalRead(leftX) == 1 && digitalRead(rightX) == 1 ){ ting(); } }
四、实物示例