Hi Guys
Im new to coding and was hoping to get some help with a project i am working on.
my idea was to have a robot which could follow a line, and if the robot came within range of a wall/obstacle it would just stop wait and then continue once it was clear…
i have got the robot to follow a line, but trying to add the Ping sensor (HC-SR04) to the line follower code makes the robot do circles once it is uploaded… ill put my code below, Im sorry in advance if it is messy or could have been done a better way.
Thank-you for your time.
include < ZumoReflectanceSensorArray.h>
include < ZumoBuzzer.h>
include < Pushbutton.h>
include < QTRSensors.h>
include < ZumoMotors.h>
define trigPin 4
define echoPin 5
Pushbutton button(ZUMO_BUTTON);
ZumoMotors motors;
ZumoBuzzer buzzer;
ZumoReflectanceSensorArray reflectanceSensors;
int lastError = 0;
const int MAX_SPEED = 400;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Play a little welcome song
buzzer.play(">g32>>c32");
// Initialize the reflectance sensors module
reflectanceSensors.init();
// Wait for the user button to be pressed and released
button.waitForButton();
// Turn on LED to indicate we are in calibration mode
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
// Wait 1 second and then begin automatic sensor calibration
// by rotating in place to sweep the sensors over the line
delay(1000);
int i;
for(i = 0; i < 80; i++)
{
if ((i > 10 && i <= 30) || (i > 50 && i <= 70))
motors.setSpeeds(-200, 200);
else
motors.setSpeeds(200, -200);
reflectanceSensors.calibrate();
// Since our counter runs to 80, the total delay will be
// 80*20 = 1600 ms.
delay(20);
}
motors.setSpeeds(0,0);
// Turn off LED to indicate we are through with calibration
digitalWrite(13, LOW);
buzzer.play(">g32>>c32");
// Wait for the user button to be pressed and released
button.waitForButton();
// Play music and wait for it to finish before we start driving.
buzzer.play("L16 cdegreg4");
while(buzzer.isPlaying());
}
void loop() {
long duration, distance;
digitalWrite(trigPin, LOW); // start of the pulse
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW); // end of the pulse
duration = pulseIn(echoPin, HIGH); // finding returning pulse *echo*
distance = (duration/2) / 29.1; // math to find distance
if (distance < 30) { // distance you want it to stop at.. *not accurate*
motors.setSpeeds (0,0); // motors stop
}
{
unsigned int sensors[6];
// Get the position of the line. Note that we *must* provide the "sensors"
// argument to readLine() here, even though we are not interested in the
// individual sensor readings
int position = reflectanceSensors.readLine(sensors);
// Our "error" is how far we are away from the center of the line, which
// corresponds to position 2500.
int error = position - 2500;
// Get motor speed difference using proportional and derivative PID terms
// (the integral term is generally not very useful for line following).
// Here we are using a proportional constant of 1/4 and a derivative
// constant of 6, which should work decently for many Zumo motor choices.
// You probably want to use trial and error to tune these constants for
// your particular Zumo and line course.
int speedDifference = error / 4 + 6 * (error - lastError);
lastError = error;
// Get individual motor speeds. The sign of speedDifference
// determines if the robot turns left or right.
int m1Speed = MAX_SPEED + speedDifference;
int m2Speed = MAX_SPEED - speedDifference;
// Here we constrain our motor speeds to be between 0 and MAX_SPEED.
// Generally speaking, one motor will always be turning at MAX_SPEED
// and the other will be at MAX_SPEED-|speedDifference| if that is positive,
// else it will be stationary. For some applications, you might want to
// allow the motor speed to go negative so that it can spin in reverse.
if (m1Speed < 0)
m1Speed = 0;
if (m2Speed < 0)
m2Speed = 0;
if (m1Speed > MAX_SPEED)
m1Speed = MAX_SPEED;
if (m2Speed > MAX_SPEED)
m2Speed = MAX_SPEED;
motors.setSpeeds(m1Speed, m2Speed);
delay(500);
}
}