这周做了一个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); } } }