Как построить робота – следование за стеной
Как построить робота (от Travis Fagerness)
Заставьте своего робота следовать за стеной!
Обзор
Это шестая часть из серии статей о моем опыте построения робота, который мог бы выполнять разные простые вещи. Я думал, что было бы замечательно создать робота, которого легко было бы собрать лишь с одним паяльником, и комплектующие к нему были бы доступны. Я составил следующий список требований к этому роботу:
- Многие наборы стоят дорого, поэтому он должен быть относительно недорог.
- Он должен быть простым в сборке, не требуя специального оборудования.
- Он должен быть простым в программировании, не требуя сложных IDE и программатора.
- Он должен быть мощным для расширяемости.
- Он должен запускаться от простого источника питания.
- Он должен быть способен следовать за линией или за стеной и избегать препятствий.
В данной статье я расскажу о том, как запрограммировать робота, чтобы тот следовал за стенами.
Следование за стенами
Чтобы следовать за стенами, вам нужно как минимум два датчика (2 бита информации) для обработки четырех потенциальных ситуаций, в которых робот может оказаться. Один датчик должен быть спереди, а второй слева или справа от робота. Чем больше датчиков вы используете, тем больше будет у вас информации, позволяющей лучше определить, что происходит. Для этого примера я использовал только два. Робот не может найти стену, поэтому вы должны поместить робота рядом с ней. Если вы поместите робота посередине робота, он будет просто кататься по кругу.
Передний датчик | Правый датчик | Ситуация | Действие |
---|---|---|---|
нет | нет | Робот удаляется от стены | Вернуться назад к стене, повернуть направо. |
да | нет | Робот далеко от стены, но направлен на стену или на препятствие. | Резко повернуть налево, чтобы встать параллельно со стеной. |
нет | да | Робот следует вдоль стены. | Двигаться вперед. |
да | да | Робот находится в углу. | Резко повернуть налево. |
Для правильной работы мне пришлось добавить код для резкого поворота налево. Резкий поворот налево просто означает, что я включаю только правое колесо, поэтому робот разворачивается практически на месте, а не продолжает при повороте двигаться вперед. Я не мог медленно поворачиваться, как в примере со следованием за линией, потому что мы не знаем, насколько близко робот находится от стены. Это ограничение датчика, который я выбрал, поскольку отраженный сигнал зависит от типа поверхности. Кроме того, используется только двоичная логика, поскольку нет способа определить расстояние на основе показаний выбранного датчика. Если бы мы знали расстояние, то могли бы добавить дополнительную логику, чтобы изменять скорость в зависимости от расстояний, чтобы робот быстрее перемещался по комнате. На самом деле я не смог получить от датчика показаний принятого сигнала, отраженного от полностью черной поверхности; поэтому на видео вы увидите, что перед посудомоечной машиной мне пришлось положить белую поверхность. У ультразвукового датчика такой проблемы не будет.
Программирование
Приведенный ниже скетч реализует следующую логику:
- Запускает драйвер робота и ждет 5 секунд. Это дает нам время поставить робота у стены, прежде чем он начнет движение.
- Прочитать показания датчиков.
- Определить состояние по таблице истинности, используя инструкции
if
. - Каждый оператор выполняет действие, зависящее от состояния датчиков.
Примечание: в каталог со скетчем программы необходимо поместить файлы библиотеки Robot (robot.ino и robot.h), исходный текст которых приведен в третьей статье из данной серии.
robot_wall_follower.ino
#include "robot.h"
void setup()
{
Serial.begin(38400);
Serial.println("Boot");
rbt_init();
delay(5000);
rbt_move(FWD,100);
}
uint16_t lleft,lmid,lright;
boolean wleft,wmid,wright;
uint16_t avoid_count=0;
void loop()
{
rbt_sns(&lleft,&lmid,&lright,&wleft,&wmid,&wright);
/* Если стена обнаружена, то двигаться вперед.
* Стена обнаружена, если правый датчик выдает 1, а средний - 0.
*/
if(wright && !wmid)
{
rbt_move(FWD,100);
}
/* Вероятно, приближаемся к стене.
* Не знаем, насколько она близко, поэтому поворачиваем
* так быстро, как можем.
*/
if(wright && wmid)
{
rbt_move(HARD_LEFT,100);
}
/* Удаляемся от стены.
* Медленно поворачиваем назад к стене.
*/
if(!wright && !wmid)
{
rbt_move(RIGHT,130);
}
/* Вероятно, находимся в углу или под углом к стене. */
if(!wright && wmid)
{
rbt_move(HARD_LEFT,100);
}
}
Для резкого поворота налево необходимо внести некоторые изменения в файлы robot.h и robot.ino.
robot.h
Добавьте HARD_LEFT
в перечисление направлений.
/*интерфейс робота*/
typedef enum{
LEFT,
RIGHT,
FWD,
REV,
BRAKE,
HARD_LEFT,
}direction_t;
robot.ino
Добавьте case
для HARD_LEFT
в rbt_move()
.
case HARD_LEFT:
digitalWrite(BPHASE,MOTOR_FWD);
digitalWrite(APHASE,MOTOR_FWD);
analogWrite(AEN,speed);
analogWrite(BEN,0);
break;
Следование вдоль стен на моей кухне
Заключение
В данной статье я показал, как вы можете использовать датчики приближения для следования вдоль стен, чтобы перемещаться по комнате. Это завершает серию статей по созданию робота. Теперь робот может автономно следовать за линией, вдоль стены и избегать препятствий. Можете объединить их в одном роботе, который мог бы делать всё это? Вы также можете добавить управление, добавив BLE модуль, и управлять модулем со своего телефона!