XtremeLiner
ROB-75088О XtremeLiner'е
XtremeLiner - обновлённая версия моего старого проекта “Challenger”, в которой улучшены аэродинамичность и быстрота реагирования датчиков на свет. В новой версии стоит 8-ми канальный датчик линии вместо 3-х канального. Исправленна большая проблема с неконтролируемыми заносами и энерцией. Также изменёны некоторые компоненты (новая Arduino и драйвера) и алгоритм движения.
О компонетах
На данный момент в роботе стоит Iskra Uno, но в ближайшим момент она будет заменена на меньшуго размера плату Arduino Nano
Драйвера моторов (2 мотора) на чипе TB6612.
Считывает линию 8-ми канальный оптический датчик линии
Алгоритм работы
Сам робот работает на ПИД-регуляторе (с весами). Это такой алгоритм, который находит некую ошибку и пытается её устранить, тем самым постоянно корректируя направление движения.
uint8_t S1 = A5;
uint8_t S2 = A4;
uint8_t S3 = A3;
uint8_t S4 = A2;
uint8_t S5 = A1;
uint8_t S6 = A0;
int sensorBarrier[6] = {800, 800, 800, 800, 800, 800};
int sensorWeights[6] = {-3, -2, -1, 1, 2, 3};
uint8_t sensorPins[6] = {A5, A4, A3, A2, A1, A0};
int sensorValues[6] = {0, 0, 0, 0, 0, 0};
double kP = ###; // коэффицент П
double kI = ###; // коэффицент И
double kD = ###; // коэффицент Д
double integral = 0;
double lastErr = 0;
uint8_t LS = 5;
uint8_t RS = 6;
uint8_t LD = 7;
uint8_t RD = 4;
int speedDef = 150;
void setup() {
pinMode(S1, INPUT);
pinMode(S2, INPUT);
pinMode(S3, INPUT);
pinMode(S4, INPUT);
pinMode(S5, INPUT);
pinMode(S6, INPUT);
pinMode(LD, OUTPUT);
pinMode(LS, OUTPUT);
pinMode(RD, OUTPUT);
pinMode(RS, OUTPUT);
Serial.begin(9600);
}
void loop() {
int position = 0; //degrees
int activeSensors = 0;
double input = 0;
for(int i = 0; i < 6; i++)
{
sensorValues[i] = analogRead(sensorPins[i]);
if (sensorValues[i] > sensorBarrier[i])
{
position += sensorWeights[i];
activeSensors++;
}
}
if (activeSensors > 0) {
input = (double)position / activeSensors;
} else { //потеря линии
input = 0;
}
double P = input;
integral += input;
double I = integral;
double D = input - lastErr;
lastErr = input;
double totalErr = kP * P + kI * I + kD * D;
lamotor(speedDef - totalErr); // задаёт скорость левому мотору, направление изменяется положительными и отрицательными значниями
ramotor(speedDef + totalErr); // задаёт скорость правому мотору, направление изменяется положительными и отрицательными значниями
if (Serial.available()) {
Serial.println(input);
}
}
Файлы
Добавлен 22.11.2024