先发代码再进行解释吧
#include <Wire.h> // Include the I2C library (required)
#include "QGPMaker_IICSensorbar.h"
#include "QGPMaker_MotorShield.h"
// Create the motor shield object with the default I2C address
QGPMaker_MotorShield AFMS = QGPMaker_MotorShield();
// Select which 'port' M1, M2, M3 or M4. In this case, M3
QGPMaker_DCMotor *myMotor3 = AFMS.getMotor(3);// 前左轮
QGPMaker_DCMotor *myMotor4= AFMS.getMotor(4);// 后左
QGPMaker_DCMotor *myMotor2= AFMS.getMotor(2);// 后右
QGPMaker_DCMotor *myMotor1 = AFMS.getMotor(1);// 前右
// IICSensorBar I2C address :
const byte IIC_ADDRESS = 0x3F;
SensorBar io;
// Pin definition:
const byte INPUT_PIN_S0 = 0; // S0最左边的传感
const byte INPUT_PIN_S1 = 1;
const byte INPUT_PIN_S2 = 2;
const byte INPUT_PIN_S3 = 3;
const byte INPUT_PIN_S4 = 4; // S4
void setup()
{
Serial.begin(9600);
AFMS.begin();
// Call io.begin(<address>) to initialize. If it
// successfully communicates, it'll return 1.
if (!io.begin(IIC_ADDRESS))
{
Serial.println("Failed to communicate.");
while (1) ;
}
// use io.pinMode(<pin>, <mode>) to set input pins as either
// INPUT or INPUT_PULLUP
io.pinMode(INPUT_PIN_S0, INPUT);
io.pinMode(INPUT_PIN_S1, INPUT);
io.pinMode(INPUT_PIN_S2, INPUT);
io.pinMode(INPUT_PIN_S3, INPUT);
io.pinMode(INPUT_PIN_S4, INPUT);
}
void loop()
{
int A=io.digitalRead(INPUT_PIN_S0);
int B=io.digitalRead(INPUT_PIN_S1);
int C=io.digitalRead(INPUT_PIN_S2);
int D=io.digitalRead(INPUT_PIN_S3);
int E=io.digitalRead(INPUT_PIN_S4);
if(!C)// 直行
{
myMotor1->run(BACKWARD);
myMotor2->run(BACKWARD);
myMotor3->run(BACKWARD);
myMotor4->run(BACKWARD);
myMotor1->setSpeed(155);
myMotor2->setSpeed(155);
myMotor3->setSpeed(155);
myMotor4->setSpeed(155);
}
if(!E)// 左转
{ myMotor1->run(BRAKE);
myMotor2->run(BRAKE);
myMotor3->run(BRAKE);
myMotor4->run(BRAKE);
myMotor2->run(BACKWARD);
myMotor1->run(BACKWARD);
myMotor2->setSpeed(170);
myMotor1->setSpeed(170); }
if(!D)// 左转
{ myMotor1->run(BRAKE);
myMotor2->run(BRAKE);
myMotor3->run(BRAKE);
myMotor4->run(BRAKE);
myMotor2->run(BACKWARD);
myMotor1->run(BACKWARD);
myMotor2->setSpeed(160);
myMotor1->setSpeed(160); }
if(!A)// 右转
{ myMotor1->run(BRAKE);
myMotor2->run(BRAKE);
myMotor3->run(BRAKE);
myMotor4->run(BRAKE);
myMotor4->run(BACKWARD);
myMotor3->run(BACKWARD);
myMotor4->setSpeed(170);
myMotor3->setSpeed(170); }
if(!B)// 右转
{ myMotor1->run(BRAKE);
myMotor2->run(BRAKE);
myMotor3->run(BRAKE);
myMotor4->run(BRAKE);
myMotor4->run(BACKWARD);
myMotor3->run(BACKWARD);
myMotor4->setSpeed(160);
myMotor3->setSpeed(160); }
}
博主用的巡线传感器是简单点说就是有五个传感部位,每个传感部位检测到下面黑线的时候显示0(可以通过io.digitalRead来读取传感器)然后根据检测到黑线的传感器位置可以进行轮胎的调整来进行转弯,这个地方的轮胎速度需要各位进行测试来确定最合适的(不要盲目搬用)然后写一下小车如何通过控制轮胎来控制转弯
这里解释一下哈:主要是博主插上电机后由于位置插反了所以是用的BACKWORD表示前进 不要被博主误导了。 还有就是经过测试博主发现的先停后启动巡线的效果比较好 所以博主也采用了BRAKE函数先停 这个的实战效果确实比较好的 很好的避免了小车的抽搐问题