arduino小车的个别功能的实现

      这周做了一个arduino小车,身为萌新,到处找资料学习,最后总算是做成了,初步实现了一下几个功能。

      一、寻迹

            寻迹是做好的第一个功能,做的磕磕绊绊,但总归是做出来了,小车可以按照黑色的线走,但是不会转直角。。。

*代码示例

#include <Servo.h>

#define STOP      0
#define FORWARD   1
#define BACKWARD  2
#define TURNLEFT  3
#define TURNRIGHT 4

int leftMotor1 = 4;
int leftMotor2 = 5;
int rightMotor1 =6;
int rightMotor2 = 7;//引脚可以改变

int trac1 = 10; //从车头方向的最右边开始排序
int trac2 = 11; 


Servo myServo;  //舵机

int inputPin=8;   // 定义超声波信号接收接口
int outputPin=9;  // 定义超声波信号发出接口

void setup() {
  // put your setup code here, to run once:
  //串口初始化
 Serial.begin(9600); 
 //舵机引脚初始化
 //myServo.attach(9);
  //测速引脚初始化
  pinMode(leftMotor1, OUTPUT);
  pinMode(leftMotor2, OUTPUT);
  pinMode(rightMotor1, OUTPUT);
  pinMode(rightMotor2, OUTPUT);
  pinMode(trac1, INPUT);
  pinMode(trac2, INPUT);
}

void loop() {

  tracing();


}
void motorRun(int cmd,int value)
{
  switch(cmd){
    case FORWARD:
      //Serial.println("FORWARD"); //输出状态
      analogWrite(leftMotor1, HIGH);
      analogWrite(leftMotor2, LOW);
      analogWrite(rightMotor1, HIGH);
      analogWrite(rightMotor2, LOW);
      break;
     case BACKWARD:
      //Serial.println("BACKWARD"); //输出状态
      analogWrite(leftMotor1, LOW);
      analogWrite(leftMotor2, HIGH);
      analogWrite(rightMotor1, LOW);
      analogWrite(rightMotor2, HIGH);
      break;
     case TURNLEFT:
      //Serial.println("TURN  LEFT"); //输出状态
      analogWrite(leftMotor1, HIGH);
      analogWrite(leftMotor2, LOW);
      analogWrite(rightMotor1, LOW);
      analogWrite(rightMotor2, HIGH);
      break;
     case TURNRIGHT:
      //Serial.println("TURN  RIGHT"); //输出状态
      analogWrite(leftMotor1, LOW);
      analogWrite(leftMotor2, HIGH);
      analogWrite(rightMotor1,HIGH);
      analogWrite(rightMotor2, LOW);
      break;
     default:
      //Serial.println("STOP"); //输出状态
      analogWrite(leftMotor1, LOW);
      analogWrite(leftMotor2, LOW);
      analogWrite(rightMotor1,LOW);
      analogWrite(rightMotor2, LOW);
  }
}
void tracing()//寻迹
{
  int data[2];
  data[0] = digitalRead(10);
  data[1] = digitalRead(11);

  if(!data[0] && !data[1] )  //左右都没有检测到黑线
  {
    motorRun(FORWARD, 200);
  }

  if(data[0])  //右边检测到黑线
  {
    motorRun(TURNRIGHT, 100);
  }

  if(data[1])  //左边检测到黑线
  {
    motorRun(TURNLEFT, 100);
  }

  if(data[0] && data[1])  //左右都检测到黑线是停止
  {
    motorRun(STOP, 0);
    while(1);
  }
}

二、避障

这是第二个实现的功能。

*代码示例

void avoidance()//避障
{
  int pos;
  int dis[3];//距离
  motorRun(FORWARD,200);
  myServo.write(90);
  dis[1]=getDistance(); //中间

  if(dis[1]<30)
  {
    motorRun(STOP,0);
    for (pos = 90; pos <= 150; pos += 1) 
    {
      myServo.write(pos);             
      delay(15);                       
    }
    dis[2]=getDistance(); //左边
    for (pos = 150; pos >= 30; pos -= 1) 
    {
      myServo.write(pos);             
      delay(15);                       
      if(pos==90)
        dis[1]=getDistance(); //中间
    }
    dis[0]=getDistance();  //右边
    for (pos = 30; pos <= 90; pos += 1) 
    {
      myServo.write(pos);              
      delay(15);                       
    }
    if(dis[0]<dis[2]) //右边距离障碍的距离比左边近
    {
      //左转
      motorRun(TURNLEFT,250);
      delay(500);
    }
    else  //右边距离障碍的距离比左边远
    {
      //右转
      motorRun(TURNRIGHT,250);
      delay(500);
    } 
  }
}

猜你喜欢

转载自blog.csdn.net/zm1450805304/article/details/80725557
今日推荐