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);
 }
}

Файлы

Добавлен 02.07.2024