Как построить робота - последователь линии
Часть четвертая из серии статей о создании робота, который может следовать за линиями или стенами и избегать препятствий!
Статьи по Теме
Как построить робот:
Часть 1: Дизайн и схема
Часть 2. Дизайн печатной платы
Часть 3: Тестирование оборудования
Часть 5: Предотвращение препятствий
Часть 6: Настенный робот
обзор
Это часть 4 серии статей о моем опыте создания робота, который может делать разные вещи. Я думал, что было бы аккуратно создать робота, который легко было бы собрать вместе с одним паяльником и был бы также доступным. Я выполнил следующие требования для своего робота:
- Многие комплекты стоят дорого, поэтому они должны быть относительно недорогими.
- Его необходимо легко собрать без специального оборудования.
- Он должен быть легко программирован без сложной среды разработки или программиста.
- Он должен быть достаточно мощным для расширяемости.
- Он должен работать от простого источника питания.
- Он должен иметь возможность следовать по линии или стене и избегать препятствий.
В этой статье я расскажу о том, как программировать робота как последователя линии.
Следуйте строке «hljs»> является роботом слева от строки? повернуть направо - это робот справа от линии? Повернуть налево - это робот на линии? двигаться вперед
Поиск подходящей поверхности
Многие люди используют черную электрическую ленту на полу, чтобы делать роботы. Это огромная боль и создает беспорядок. Белая сухая доска для стирания - отличная поверхность, чтобы испытать разные линии, следуя курсам. Я нашел эту плату 2x4 в Home Depot за 10 долларов. Вы можете легко добавлять треки, рисуя черным маркером. Белый фон и черный маркер имеют достаточно контрастности, так что датчики могут легко отличить линию. Вместо того, чтобы откалибровать датчики для каждой поверхности, я собираюсь предположить, что все они читают примерно одинаковые для заданного цвета. Затем я могу сравнить их относительно друг друга, чтобы определить, какой датчик в данный момент считывает самое темное значение. Пока линия, которую я рисую, закрывает только один датчик за один раз, этот алгоритм обеспечит надежный способ определения положения робота.

Написание программы
Код ниже начинается с инициализации драйвера робота, а затем ожидания 5 секунд. Это позволяет мне достаточно времени, чтобы поставить робота на дорожку, прежде чем он начнет двигаться. После этого робот непрерывно проверяет датчики и определяет, как двигаться, используя вышеприведенный алгоритм. Скорость вперед может быть задана с помощью определения ROBOT_SPEED. Это число из 255. Если робот движется слишком быстро, у алгоритма может не хватить времени для исправления движения. Я также добавил чек, если робот будет поднят или собирается упасть с курса. Если все датчики читают 1000, это означает, что робот, скорее всего, отключен от земли, потому что ни один свет не отражается назад. Это полезно, если вы хотите, чтобы робот остановился, пока вы его перемещаете.
Потенциальные улучшения
Этот алгоритм не использует усреднение или отслеживает ошибку. Вы увидите в видео ниже, что иногда робот выглядит так, будто он дрожит взад и вперед. Это вызвано колебаниями в алгоритме, потому что робот перевыполняет линию. Одним из способов исправить это было бы использование алгоритма PID (пропорциональный интеграл-производная). В ореховой оболочке этот тип алгоритма отслеживает, где был робот (интеграл), где он может идти (производный), и где он в настоящее время (пропорциональный). Алгоритм, который я реализовал, заботится только о том, что сейчас происходит с роботом. Если вы хотите иметь более быстрый робот, вам, вероятно, потребуется удалить колебания (чрезмерные исправления), которые замедляют работу робота.
#include "robot.h" #define ROBOT_SPEED 100 void setup() { Serial.begin(38400); Serial.println("Boot"); rbt_init(); delay(5000); } uint16_t lleft, lmid, lright; boolean wleft, wmid, wright; void loop() { rbt_sns(&lleft, &lmid, &lright, &wleft, &wmid, &wright); Serial.print("Left: "); Serial.print(lleft); Serial.print("Mid: "); Serial.print(lmid); Serial.print("Right: "); Serial.println(lright); //off the line if(lleft == 1000 & lmid == 1000 & lright == 1000){ rbt_move(BRAKE, 0); } //follow track else{ if(lleft > lmid & lleft > lright){ rbt_move(LEFT, ROBOT_SPEED); } if(lmid > lleft & lmid > lright){ rbt_move(FWD, ROBOT_SPEED); } if(lright > lmid & lright > lleft){ rbt_move(RIGHT, ROBOT_SPEED); } } }
Скачать код
Следуйте за строкой
Вывод
В этой статье я показал процесс написания алгоритма управления, чтобы следовать за строкой. Линейный последователь - это аккуратный способ узнать о теории управления и следить за тем, чтобы робот проходил курс полностью автономно! В следующей статье я сделаю робота перемещаться по полу и не натыкаться на препятствия и стены.
Следующая статья в серии: создайте собственный робот - избегайте препятствий