Skip to main content

P-Controller

const int trigPin = 9;
const int echoPin = 10;

const int ENA = 5;
const int IN1 = 2;
const int IN2 = 3;

const int ENB = 6;
const int IN3 = 4;
const int IN4 = 7;

float set_point = 15.0; // Stop 15 cm from wall
float gain = 10.0; // Proportional gain

void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);

pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}

void loop() {
float distance = getDistance();

// P controller
float error = distance - set_point;
int speed = gain * error;

drive(speed);

delay(50);
}

void stopMotors() {
analogWrite(ENA, 0);
analogWrite(ENB, 0);
}

float getDistance() {
// Measure distance
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

long duration = pulseIn(echoPin, HIGH, 30000);

float distance = duration * 0.0343 / 2;
return distance;
}

float drive(int speed) {
// consider constraining speed to 0-255
if (speed >= 0) {
// Drive forward
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);

analogWrite(ENA, speed);
analogWrite(ENB, speed);
} else if (speed <= 0) {
// Drive backwards
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);

analogWrite(ENA, speed);
analogWrite(ENB, speed);

}

}