用红外寻线传感器对车轮测速使小车走直线

嗯~~受制于两个电机并不完全一样导致小车不能走直线的问题,一开始我的解决方案是通过实验测出俩电机转速相等的PWM的两个值,但后来老师说由于电池电压是不断下降的,所以这种方法并不能保持俩电机的转速一直相等。于是,我们就只好用现有的红外寻线传感器来实现这一功能。

我们是用一根杆子伸出车体,把传感器挂在上面,保持同一高度同一角度面对车轮,车轮上贴上一半黑的纸,如图:

9CFAEE0D27859B370F0D574527ABA14F_B500_900_500_380

(呃~~拍这张图时我已经把杆子和传感器给拆了,但轮子就是贴成这样的啦~~)

嗯~~最后把代码贴上吧~~

int pinI1=8;//定义I1接口
int pinI2=9;//定义I2接口
int speedpin=11;//定义EA(PWM调速)接口,left
int pinI3=6;//定义I3接口
int pinI4=7;//定义I4接口
int speedpin1=10;//定义EB(PWM调速)接口right
int input=15;//超声波输出端口(发射)连接开发板模拟0
int output=14;//超声波输入端口(接收)连接开发板模拟1
int xun1=4;//定义寻线左接口
int xun2=5;//定义寻线右接口
int speed1;//定义左转速
int speed2;//定义右转速
unsigned long time1,time2,oldtime1,oldtime2;
void setup()
{
  Serial.begin(9600);
  pinMode(pinI1,OUTPUT);
  pinMode(pinI2,OUTPUT);
  pinMode(speedpin,OUTPUT);
  pinMode(pinI3,OUTPUT);
  pinMode(pinI4,OUTPUT);
  pinMode(speedpin1,OUTPUT);
  pinMode(input,INPUT);
  pinMode(output,OUTPUT);
  digitalWrite(pinI4,HIGH);//使直流电机(右)顺时针转
  digitalWrite(pinI3,LOW);
  digitalWrite(pinI1,HIGH);//使直流电机(左)逆时针转
  digitalWrite(pinI2,LOW);
  speed1=400;
  speed2=400;
}
void loop()
{
  analogWrite(speedpin,speed1);
  analogWrite(speedpin1,speed2);
  time1=pulseIn(xun1,LOW);
  time2=pulseIn(xun2,LOW);
  if (time1>0)
  {
   oldtime1=time1; 
  }
  if (time2>0)
  {
   oldtime2=time2; 
  }
  if (oldtime1>oldtime2)
  {
    speed1++; 
  }
  if (oldtime2>oldtime1)
  {
    speed2++;  
  }
}

用红外寻线传感器对车轮测速使小车走直线》上有1条评论

  1. Pingback引用通告: BZ编程小组 作品 | BZ编程小组

发表评论

电子邮件地址不会被公开。 必填项已用*标注