Робот-следящий за линией управления ПИД
Компоненты и расходные материалы
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
Приложения и онлайн-сервисы
![]() |
|
Об этом проекте
Обзор
Одной из функций, которая нужна большинству автономных роботов-вездеходов, является следование по линии. Цель этого проекта - создать робота-следящего за линией и начать изучение ПИД-регулятора в увлекательной игровой форме.
Детали
Робот правильно работает с двумя двигателями, платой Росбота и 5-канальным датчиком. В отличие от других, вам не нужно покупать дополнительный драйвер двигателя с H-мостом или различные компоненты, так как основная плата Rosbot имеет встроенный двойной драйвер с двумя H-мостами. Просто подключите двигатели к основной плате Rosbot, и она будет обеспечивать больше энергии, чем Arduino Uno.


- Рама робота: Корпус KittenBot из анодированного алюминия
Классное и прочное шасси с множеством монтажных отверстий (4,8 мм LEGO Technic), вы определенно можете повторно использовать это шасси для других забавных проектов.
- Мозг робота :Базовая плата RosBot
Материнская плата на базе Arduino UNO с двумя встроенными драйверами двигателя с двойным Н-мостом.
- Глаза робота :5-канальный ИК-датчик слежения за линией
5-канальный инфракрасный детектор, более точный и стабильный.
Шаг 1. Сборка
Этот робот довольно прост в сборке, следуйте инструкциям, и это займет у вас около 15 минут.

Сначала прикрепите моторы по бокам шасси, просто вставьте резиновое колесо.

Установите 5-канальный ИК-датчик на переднюю часть корпуса.

Прикрепите базовую плату Rosbot к шасси, и робот будет готов к подключению.
Шаг 2. Отжать
Ниже приведены подключения для 5-канального ИК-датчика:
- VCC на 5 В
- GND на GND RosBot
- T1-T4 к контакту A0-A3
- T5 для закрепления SDA
Двигатели постоянного тока просто подключаются к контактам A + A- и B + B-.

Кодирование
В кодах у нас есть конечный автомат, который указывает каждый возможный выходной сигнал массива датчиков. Робот движется в определенном направлении в соответствии с выходным сигналом матрицы датчиков.
void stateMachine (int a) {switch (a) {case B00000:outlineCnt ++; ломать; case B11111:outlineCnt ++; ломать; case B00010:case B00110:outlineCnt =0; пикселей.setPixelColor (2, пикселей.Color (0, 50, 0)); смещение =1; ломать; case B00001:case B00011:outlineCnt =0; pixel.setPixelColor (2, пикселей.Color (0, 200, 0)); смещение =2; ломать; case B00100:outlineCnt =0; пикселей.setPixelColor (2, пикселей.Color (0, 0, 20)); смещение =0; ломать; case B01000:case B01100:outlineCnt =0; pixel.setPixelColor (2, пикселей.Color (50, 0, 0)); смещение =-1; ломать; case B10000:case B11000:outlineCnt =0; пикселей.setPixelColor (2, пикселей.Color (200, 0, 0)); смещение =-2; ломать; по умолчанию:Serial.println (a, BIN); OutlineCnt ++; ломать; }
Мы уже установили значение ошибки, члена пропорции, интегрального члена и производного члена.

float Kp =25; float Ki =0.15; float Kd =1200; float error, errorLast, erroInte; float calcPid (ввод с плавающей запятой) {float errorDiff; вывод с плавающей точкой; ошибка =ошибка * 0,7 + ввод * 0,3; // фильтр // ошибка =input; errorDiff =error - errorLast; erroInte =ограничение (erroInte + error, -50, 50); output =Kp * error + Ki * erroInte + Kd * errorDiff; Serial.print (ошибка); Серийный.принт (''); Serial.print (erroInte); Серийный.принт (''); Serial.print (errorDiff); Серийный.принт (''); Serial.println (вывод); errorLast =ошибка; возврат вывода;
Изменяйте значения, чтобы найти наиболее подходящие для вашего робота.
Код
- Робот-последователь линии
Робот-последователь линии Arduino
В коды мы включаем NeoPixel от Adafruit, но это необязательно.#include#define S_NULL 0 #define S_ONTRACE 1Adafruit_NeoPixel pixels =Adafruit_NeoPixel (4, 4, NEO_GRB + NEO_KHZpeed (int) spdL, int spdR) {spdR =-spdR; если (spdL <0) {analogWrite (5, 0); analogWrite (6, -spdL); } else {analogWrite (5, spdL); analogWrite (6, 0); } если (spdR <0) {analogWrite (9, 0); analogWrite (10, -spdR); } else {analogWrite (9, spdR); analogWrite (10, 0); }} int bias =0; int outlineCnt =0; void stateMachine (int a) {switch (a) {case B00000:outlineCnt ++; ломать; case B11111:outlineCnt ++; ломать; case B00010:case B00110:outlineCnt =0; пикселей.setPixelColor (2, пикселей.Color (0, 50, 0)); смещение =1; ломать; case B00001:case B00011:outlineCnt =0; pixel.setPixelColor (2, пикселей.Color (0, 200, 0)); смещение =2; ломать; case B00100:outlineCnt =0; пикселей.setPixelColor (2, пикселей.Color (0, 0, 20)); смещение =0; ломать; case B01000:case B01100:outlineCnt =0; pixel.setPixelColor (2, пикселей.Color (50, 0, 0)); смещение =-1; ломать; case B10000:case B11000:outlineCnt =0; пикселей.setPixelColor (2, пикселей.Color (200, 0, 0)); смещение =-2; ломать; по умолчанию:Serial.println (a, BIN); OutlineCnt ++; ломать; } pixel.setPixelColor (0, pixels.Color (outlineCnt * 10, 0, 0)); если (outlineCnt> 10) {doDcSpeed (0,0); } else {float ff =150; float ctrl =calcPid (смещение); doDcSpeed (ff-ctrl, ff + ctrl); } pixel.show ();} float Kp =25; float Ki =0.15; float Kd =1200; float error, errorLast, erroInte; float calcPid (ввод с плавающей запятой) {float errorDiff; вывод с плавающей точкой; ошибка =ошибка * 0,7 + ввод * 0,3; // фильтр // ошибка =input; errorDiff =error - errorLast; erroInte =ограничение (erroInte + error, -50, 50); output =Kp * error + Ki * erroInte + Kd * errorDiff; Serial.print (ошибка); Серийный.принт (''); Serial.print (erroInte); Серийный.принт (''); Serial.print (errorDiff); Серийный.принт (''); Serial.println (вывод); errorLast =ошибка; возврат вывода;} int echoTrace () {int ret =0; int a [5]; for (int i =0; i <5; i ++) {a [i] =constrain ((1025 - analogRead (A0 + i)) / 10 - 4, 0, 20); если (a [i]> 2) ret + =(0x1 < LinefollowRobot
https://github.com/KittenBot/LinefollowRobot
Схема

Производственный процесс
- Будущее робототехники
- Баскетбол
- Мяч для гольфа
- Учебное пособие - sPiRobot:контролируйте и смотрите, что видит ваш робот из любого места
- Автоматизация:переработка линии роботов
- Расширенная линия робота SCARA
- Роботы сборочного конвейера:полное руководство
- Последователь промышленной линии для поставки материалов
- ПИД-управление захватом робота в Matlab / Simulink
- Контроль качества автоматизированной упаковочной линии