Changed main.ino to test.ino, added values to the PID constants.

This commit is contained in:
giorgos 2022-06-03 18:01:44 +03:00
parent 51140583be
commit 11d448226d
4 changed files with 131 additions and 61 deletions

View file

@ -1,40 +0,0 @@
int MODE = 8;
int left_motor_in = 6;
int left_motor_out = 9;
int right_motor_in = 3;
int right_motor_out = 5;
void setup() {
Serial.begin(9600);
Serial.println("Start");
init_motor();
}
void loop() {
left_motor_go(250);
right_motor_go(250);
}
void init_motor(){
pinMode(left_motor_in, OUTPUT);
pinMode(left_motor_out, OUTPUT);
pinMode(right_motor_in, OUTPUT);
pinMode(right_motor_out, OUTPUT);
pinMode(MODE, OUTPUT);
digitalWrite(MODE, HIGH);
}
//range:0<value<255
void left_motor_go(int motor_speed){
analogWrite(left_motor_in, motor_speed);
digitalWrite(left_motor_out, LOW);
}
//range:0<value<255
void right_motor_go(int motor_speed){
analogWrite(right_motor_in, motor_speed);
digitalWrite(right_motor_out, LOW);
}

View file

@ -5,7 +5,7 @@ const uint8_t SensorCount = 8;
uint16_t sensorValues[SensorCount]; uint16_t sensorValues[SensorCount];
float Kp = 0.07; //set up the constants value float Kp = 0.07; //set up the constants value
float Ki = 0.001; float Ki = 0.0008;
float Kd = 0.6; float Kd = 0.6;
int P; int P;
int I; int I;
@ -22,8 +22,8 @@ const uint8_t basespeedb = 100;
//Set up the drive motor carrier pins //Set up the drive motor carrier pins
int mode = 8; int mode = 8;
int aphase = 6; int aphase = 9;
int aenbl = 9; int aenbl = 6;
int bphase = 5; int bphase = 5;
int benbl = 3; int benbl = 3;
@ -35,9 +35,7 @@ void setup() {
Serial.begin(9600); Serial.begin(9600);
qtr.setTypeRC(); qtr.setTypeRC();
//Set up the sensor array pins //Set up the sensor array pins
qtr.setSensorPins((const uint8_t[]) { qtr.setSensorPins((const uint8_t[]){10, 11, 12, 14, 15, 16, 18, 19}, SensorCount);
10, 11, 12, 14, 15, 16, 18, 19
}, SensorCount);
qtr.setEmitterPin(7);//LEDON PIN qtr.setEmitterPin(7);//LEDON PIN
pinMode(mode, OUTPUT); pinMode(mode, OUTPUT);
@ -52,7 +50,7 @@ void setup() {
boolean Ok = false; boolean Ok = false;
while (Ok == false) { //the loop won't start until the robot is calibrated while (Ok == false) { //the loop won't start until the robot is calibrated
if (digitalRead(buttoncalibrate) == HIGH) { if(digitalRead(buttoncalibrate) == HIGH) {
calibration(); //calibrate the robot for 10 seconds calibration(); //calibrate the robot for 10 seconds
Ok = true; Ok = true;
} }
@ -70,9 +68,9 @@ void calibration() {
} }
void loop() { void loop() {
if (digitalRead(buttonstart) == HIGH) { if(digitalRead(buttonstart) == HIGH) {
onoff = ! onoff; onoff =! onoff;
if (onoff = true) { if(onoff = true) {
delay(1000);//a delay when the robot starts delay(1000);//a delay when the robot starts
} }
else { else {
@ -81,16 +79,14 @@ void loop() {
} }
if (onoff == true) { if (onoff == true) {
PID_control(); PID_control();
Serial.print(">>>>>PID-control");
} }
else { else {
forward_brake(0, 0); forward_brake(0,0);
Serial.print(">>>>>forward-brake");
} }
} }
void forward_brake(int posa, int posb) { void forward_brake(int posa, int posb) {
//set the appropriate values for aphase and bphase so that the robot goes straight //set the appropriate values for aphase and bphase so that the robot goes straight
digitalWrite(aphase, HIGH); digitalWrite(aphase, LOW);
digitalWrite(bphase, HIGH); digitalWrite(bphase, HIGH);
analogWrite(aenbl, posa); analogWrite(aenbl, posa);
analogWrite(benbl, posb); analogWrite(benbl, posb);
@ -103,7 +99,7 @@ void PID_control() {
I = I + error; I = I + error;
D = error - lastError; D = error - lastError;
lastError = error; lastError = error;
int motorspeed = P * Kp + I * Ki + D * Kd; int motorspeed = P*Kp + I*Ki + D*Kd;
int motorspeeda = basespeeda + motorspeed; int motorspeeda = basespeeda + motorspeed;
int motorspeedb = basespeedb - motorspeed; int motorspeedb = basespeedb - motorspeed;
@ -120,7 +116,6 @@ void PID_control() {
if (motorspeedb < 0) { if (motorspeedb < 0) {
motorspeedb = 0; motorspeedb = 0;
} }
Serial.print(motorspeeda);Serial.print(" ");Serial.println(motorspeedb); //Serial.print(motorspeeda);Serial.print(" ");Serial.println(motorspeedb);
Serial.print(position);
forward_brake(motorspeeda, motorspeedb); forward_brake(motorspeeda, motorspeedb);
} }

115
test/test.ino Normal file
View file

@ -0,0 +1,115 @@
#include <QTRSensors.h>
QTRSensors qtr;
const uint8_t SensorCount = 8;
uint16_t sensorValues[SensorCount];
int MODE = 8;
int left_motor_in = 6;
int left_motor_out = 9;
int right_motor_in = 3;
int right_motor_out = 5;
void setup() {
Serial.begin(9600);
Serial.println("Start");
init_motor();
qtr.setTypeRC();
qtr.setSensorPins((const uint8_t[]){10, 11, 12, 14, 15, 16, 18, 19}, SensorCount);
qtr.setEmitterPin(7);
delay(500);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);// turn on Arduino's LED to indicate we are in calibration mode
Serial.println("Starting Calibration");
// 2.5 ms RC read timeout (default) * 10 reads per calibrate() call
// = ~25 ms per calibrate() call.
// Call calibrate() 400 times to make calibration take about 10 seconds.
for (uint16_t i = 0; i < 400; i++)
{
qtr.calibrate();
}
digitalWrite(LED_BUILTIN, LOW); // turn off Arduino's LED to indicate we are through with calibration
Serial.println("Calibration finished");
// print the calibration minimum values measured when emitters were on
Serial.begin(9600);
for (uint8_t i = 0; i < SensorCount; i++)
{
Serial.print(qtr.calibrationOn.minimum[i]);
Serial.print(' ');
}
Serial.println();
// print the calibration maximum values measured when emitters were on
for (uint8_t i = 0; i < SensorCount; i++)
{
Serial.print(qtr.calibrationOn.maximum[i]);
Serial.print(' ');
}
Serial.println();
Serial.println();
delay(1000);
}
void loop() {
uint16_t position = qtr.readLineBlack(sensorValues);
for (uint8_t i = 0; i < SensorCount; i++)
{
Serial.print(sensorValues[i]);
Serial.print('\t');
}
Serial.println(position);
delay(250);
if (position >= 3000 and position <= 4300) {
left_motor_go(200);
right_motor_go(200);
Serial.print(position);Serial.println("center");
}
if (position < 3000) {
left_motor_go(200);
right_motor_go(0);
Serial.print(position);Serial.println("left");
}
if (position > 4300) {
left_motor_go(0);
right_motor_go(200);
Serial.print(position);Serial.println("right");
}
}
void init_motor(){
pinMode(left_motor_in, OUTPUT);
pinMode(left_motor_out, OUTPUT);
pinMode(right_motor_in, OUTPUT);
pinMode(right_motor_out, OUTPUT);
pinMode(MODE, OUTPUT);
digitalWrite(MODE, HIGH);
}
//range:0<value<255
void left_motor_go(int motor_speed){
analogWrite(left_motor_in, motor_speed);
digitalWrite(left_motor_out, LOW);
}
//range:0<value<255
void right_motor_go(int motor_speed){
analogWrite(right_motor_in, motor_speed);
digitalWrite(right_motor_out, LOW);
}