- Необходимые материалы:
- Концепция робота, избегающего препятствий:
- Принципиальная схема и пояснения:
- Программирование микроконтроллера PIC:
- Робот-обходчик препятствий в действии:
Робот, избегающий препятствий, - еще один известный робот, который придает особый вкус встроенным проектам. Для тех, кто является новым роботом, избегающим препятствий, это обычный колесный робот, который может перемещаться, не сталкиваясь с какими-либо препятствиями. Есть много способов создать робота, избегающего препятствий, в проекте мы собираемся использовать один ультразвуковой датчик (спереди) и два инфракрасных датчика (слева / справа), чтобы у нашего робота были глаза во всех трех направлениях. Таким образом, вы можете сделать его намного умнее и быстрее, обнаруживая объекты со всех трех сторон и соответственно маневрируя. Здесь мы подаем в суд на микроконтроллер PIC PIC16F877A для этого робота, избегающего препятствий.
За работой робота для обхода препятствий можно в реальном времени наблюдать с помощью продукта, который называется «Роботы-уборщики». Хотя технология и датчики, используемые в них, очень сложны, концепция остается той же. Давайте посмотрим, чего мы можем добиться, используя наши обычные датчики и микроконтроллеры PIC.
Также ознакомьтесь с нашими другими роботами, избегающими препятствий:
- Робот, избегающий препятствий на основе Raspberry Pi
- Умный робот-пылесос своими руками с использованием Arduino
Необходимые материалы:
- PIC16F877A
- ИК-датчик (2 шт.)
- Ультразвуковой датчик (1 шт.)
- Редукторный двигатель постоянного тока (2Nos)
- Драйвер двигателя L293D
- Шезлонги (также можно построить свои собственные из картона)
- Внешний аккумулятор (любой доступный источник питания)
Концепция робота, избегающего препятствий:
Концепция робота, избегающего препятствий, очень проста. Мы используем датчики для обнаружения объектов вокруг робота и используем эти данные, чтобы робот не сталкивался с этими объектами. Для обнаружения объекта мы можем использовать любые датчики, такие как ИК-датчик и ультразвуковой датчик.
В нашем роботе мы использовали датчик США в качестве переднего датчика и два ИК-датчика для левого и правого соответственно. Робот будет двигаться вперед, если перед ним нет никаких предметов. Таким образом, робот будет двигаться вперед, пока ультразвуковой датчик (США) не обнаружит какой-либо объект.
Когда датчик США обнаруживает объект, пора изменить направление движения робота. Мы можем повернуть налево или направо, чтобы определить направление поворота, мы используем ИК-датчик, чтобы проверить, есть ли какой-либо объект рядом с левой или правой стороной робота.
Если спереди и справа от робота обнаружен объект, робот вернется и повернет налево. Мы заставляем робота бежать назад на определенное расстояние, чтобы он не столкнулся с объектом при повороте.
Если на передней и левой стороне робота обнаружен объект, робот вернется и повернет направо.
Если робот достигнет угла комнаты, он почувствует объект, присутствующий во всех четырех. В этом случае мы должны отгонять робота назад, пока любая из сторон не освободится.
Другой возможный случай состоит в том, что впереди будет объект, но не может быть никакого объекта ни с левой, ни с правой стороны, в этом случае мы должны случайным образом повернуться в любом направлении.
Надеюсь, это дало бы приблизительное представление о том, как работает избегатель препятствий, теперь давайте перейдем к принципиальной схеме, чтобы построить этого бота и насладиться им в действии.
Принципиальная схема и пояснения:
Полная принципиальная схема этого робота для избегания препятствий на основе PIC показана на рисунке выше. Как видите, мы использовали два ИК-датчика для обнаружения объектов слева и справа от робота соответственно и ультразвуковой датчик для измерения расстояния до объекта, находящегося перед роботом. Мы также использовали модуль драйвера двигателя L293D для управления двумя двигателями, представленными в этом проекте. Это обычные мотор-редукторы постоянного тока для колес, поэтому их очень легко получить. Следующая таблица поможет вам в подключении.
S.No |
Подключено от |
Соединен с |
1 |
ИК-датчик Левый вывод |
RD2 (вывод 21) |
2 |
ИК-датчик Прямой вывод |
RD3 (вывод 22) |
4 |
Мотор 1, канал A, вывод |
RC4 (вывод 23) |
5 |
Двигатель 1 Канал B, контакт |
RC5 (вывод 25) |
6 |
Мотор 2, канал A, штифт |
RC6 (контакт 26) |
7 |
Мотор 2, канал B, контакт |
RC7 (вывод 27) |
8 |
Триггерный штифт США |
RB1 (вывод 34) |
9 |
Эхо-значок США |
RB2 (вывод 35) |
Модуль драйвера двигателя, такой как L293D, является обязательным, потому что величина тока, необходимая для работы редукторного двигателя постоянного тока, не может быть получена через вывод ввода / вывода микроконтроллера PIC. Датчики и модуль питаются от источника + 5V, который регулируется 7805. Модуль драйвера двигателя может питаться даже от +12 В, но для этого проекта я просто придерживался доступного + 5V.
В моем случае полный робот питается от Power Bank. Вы также можете использовать любой обычный блок питания, минуя секцию регулятора, или использовать вышеуказанную схему и использовать любую батарею 9 В или 12 В для робота, как показано на схеме выше. Как только ваши соединения будут выполнены, это будет выглядеть примерно так, как показано ниже.
Программирование микроконтроллера PIC:
Запрограммировать вашего ПОС на работу по избеганию препятствий действительно легко. Нам просто нужно прочитать значение этих трех датчиков и соответствующим образом управлять двигателями. В этом проекте мы используем ультразвуковой датчик. Мы уже узнали, как взаимодействовать ультразвуком с микроконтроллером PIC, если вы здесь новичок, пожалуйста, вернитесь к этому руководству, чтобы понять, как датчик US работает с PIC, так как я опущу подробности об этом здесь, чтобы избежать повторения.
Полная программа или этот робот приводится в конце этой страницы, я также пояснил, важные куски программы ниже.
Как мы знаем, все программы начинаются с объявлений контактов ввода и вывода. Здесь четыре контакта модуля драйвера двигателя и триггерные контакты являются выходными контактами, а контакт Echo и два контакта ИК-выхода будут входными. Мы должны инициализировать модуль Timer 1, чтобы использовать его с ультразвуковым датчиком.
TRISD = 0x00; // PORTD объявлен как выход для сопряжения с ЖК-дисплеем TRISB1 = 0; // Триггерный контакт датчика US отправляется как выходной контакт TRISB2 = 1; // Эхо-вывод датчика УЗИ устанавливается как входной вывод TRISB3 = 0; // RB3 - вывод для светодиода TRISD2 = 1; TRISD3 = 1; // Оба вывода ИК-датчика объявлены как input TRISC4 = 0; TRISC5 = 0; // Выводы двигателя 1 объявлены как выход TRISC6 = 0; TRISC7 = 0; // Выводы двигателя 2 объявлены как выход T1CON = 0x20;
В этой программе нам придется довольно часто проверять расстояние между датчиком и объектом, поэтому мы создали функцию с именем calculate_distance (), внутри которой мы будем измерять расстояние методом, описанным в руководстве по взаимодействию с американскими датчиками. Код показан ниже
void calculate_distance () // функция для расчета расстояния до США {TMR1H = 0; TMR1L = 0; // очищаем биты таймера Trigger = 1; __delay_us (10); Триггер = 0; пока (Echo == 0); TMR1ON = 1; while (Echo == 1); TMR1ON = 0; time_taken = (TMR1L - (TMR1H << 8)); расстояние = (0,0272 * взятое время) / 2; }
Следующим шагом будет сравнение значений ультразвукового датчика и ИК-датчика и соответствующее перемещение робота. В этой программе я использовал значение в см как критическое расстояние, ниже которого робот должен начать изменять направление. Вы можете использовать свои предпочтительные значения. Если нет объекта, робот просто движется вперед
если (расстояние> 5) {RC4 = 0; RC5 = 1; // Мотор 1 вперед RC6 = 1; RC7 = 0; // Двигатель 2 вперед}
Если объект обнаружен, то расстояние будет меньше см. В этом случае мы учитываем значения левого и правого ультразвукового датчика. Исходя из этого значения, мы решаем повернуть налево или направо. Задержка в мс используется, чтобы изменение направления было видимым.
if (RD2 == 0 && RD3 == 1 && distance <= 5) // Левый датчик заблокирован {back_off (); RC4 = 1; RC5 = 1; // Двигатель 1 останавливается RC6 = 1; RC7 = 0; // Мотор 2 вперед __delay_ms (500); } calculate_distance (); if (RD2 == 1 && RD3 == 0 && distance <= 5) // Правый датчик заблокирован {back_off (); RC4 = 0; RC5 = 1; // Мотор 1 вперед RC6 = 1; RC7 = 1; // Двигатель 2 останавливается __delay_ms (500); }
Иногда ультразвуковой датчик обнаруживает объект, но ИК-датчики не обнаруживают его. В этом случае робот по умолчанию поворачивает налево. Вы также можете повернуть его направо или в произвольном направлении в зависимости от ваших предпочтений. Если с обеих сторон есть объекты, мы заставляем его двигаться назад. Код для того же показан ниже.
Calcul_distance (); if (RD2 == 0 && RD3 == 0 && distance <= 5) // Оба датчика открыты {back_off (); RC4 = 0; RC5 = 1; // Мотор 1 вперед RC6 = 1; RC7 = 1; // Двигатель 2 останавливается __delay_ms (500); } calculate_distance (); if (RD2 == 1 && RD3 == 1 && distance <= 5) // Оба датчика заблокированы {back_off (); RC4 = 1; RC5 = 0; // Мотор 1 реверс RC6 = 1; RC7 = 1; // Двигатель 2 останавливается __delay_ms (1000); }
Робот-обходчик препятствий в действии:
Работать над проектом очень интересно и интересно. Как только вы закончите работу со схемой и кодом, просто включите своего бота и оставьте его на земле. Он должен уметь выявлять препятствия и умело их избегать. Но вот самое интересное. Вы можете изменить код и заставить его делать больше вещей, например, избегать лестницы, делать его умнее, сохраняя драгоценные повороты, а что нет?
Этот робот поможет вам понять основы программирования и узнать, как реальное оборудование будет реагировать на ваш код. Всегда весело программировать этого робота и наблюдать, как он ведет себя с кодом в реальном мире.
Здесь мы использовали ту же перфокарту PIC, которую мы сделали для мигания светодиода с помощью микроконтроллера PIC, и использовали эту плату в других проектах серии PIC Tutorial Series.
Ваш робот должен выглядеть примерно так, как показано на картинке выше. Полная работа этого проекта показана на видео ниже.
Надеюсь, вы поняли проект и получили удовольствие от его создания. Если у вас есть какие-либо сомнения или вы застряли, вы можете использовать раздел комментариев, чтобы разместить свои вопросы, и я постараюсь ответить на них.