Оглавление:

Робот с маслом: робот Arduino в условиях экзистенциального кризиса: 6 шагов (с изображениями)
Робот с маслом: робот Arduino в условиях экзистенциального кризиса: 6 шагов (с изображениями)

Видео: Робот с маслом: робот Arduino в условиях экзистенциального кризиса: 6 шагов (с изображениями)

Видео: Робот с маслом: робот Arduino в условиях экзистенциального кризиса: 6 шагов (с изображениями)
Видео: Дедушка не выдержал и дал ответ за Украинский флаг 2024, Июль
Anonim
Image
Image

Этот проект основан на мультсериале «Рик и Морти». В одном из эпизодов Рик создает робота, единственная цель которого - приносить масло. У нас, студентов Bruface (Брюссельский инженерный факультет), есть задание для проекта мехатроники, который заключается в создании робота на основе предложенной темы. Задача этого проекта: создать робота, который подает только масло. Это может быть экзистенциальный кризис. Конечно, робот в эпизоде «Рик и Морти» - довольно сложный робот, и необходимо сделать некоторые упрощения:

Поскольку его единственная цель - принести масло, есть более простые альтернативы. Вместо того, чтобы заставить робота выглядеть и схватить масло, прежде чем он принесет его нужному человеку, робот может носить масло все время. Таким образом, основная идея состоит в том, чтобы сделать тележку, которая транспортирует масло туда, где оно должно быть.

Помимо транспортировки масла, роботу необходимо знать, куда ему нужно доставить масло. В эпизоде Рик использует свой голос для вызова робота и управления им. Это требует дорогостоящей системы распознавания голоса и было бы слишком сложно. Вместо этого каждый за столом получает кнопку: как только эта кнопка активирована, робот может найти эту кнопку и подойти к ней.

Напомним, что робот должен соответствовать следующим требованиям:

  • Он должен быть безопасным: он должен избегать препятствий и не падать со стола;
  • Робот должен быть маленьким: пространство на столе ограничено, и никому не нужен робот, который подает масло, но его размер составляет половину самого стола;
  • Работа робота не может зависеть от размера или формы стола, поэтому его можно использовать на разных столах;
  • Масло нужно донести до нужного человека за столом.

Шаг 1: Основная концепция

Вышеупомянутые требования могут быть выполнены с использованием различных методов. На этом этапе объясняются принятые решения по основному дизайну. Подробности о том, как эти идеи реализуются, можно найти в следующих шагах.

Чтобы выполнить свой долг, робот должен двигаться, пока не будет достигнут пункт назначения. Что касается применения робота, то очевидно, что использование колес вместо «шагающего» движения лучше для его движения. Поскольку стол представляет собой плоскую поверхность, и робот не может развивать очень высокие скорости, два приводимых в действие колеса и один шаровой шарнир - это самое простое и легкое в управлении решение. Управляемые колеса должны приводиться в движение двумя двигателями. Двигатели должны иметь большой крутящий момент, но им не нужно достигать высокой скорости, поэтому будут использоваться серводвигатели непрерывного действия. Еще одно преимущество серводвигателей - простота использования с Arduino.

Обнаружение препятствий может быть выполнено с помощью ультразвукового датчика, который измеряет расстояние, прикрепленного к серводвигателю, чтобы выбрать направление измерения. Края можно обнаружить с помощью датчиков LDR. Использование датчиков LDR потребует создания устройства, содержащего как светодиодную подсветку, так и датчик LDR. Датчик LDR измеряет отраженный свет и может рассматриваться как своего рода датчик расстояния. Тот же принцип существует и с инфракрасным светом. Существуют инфракрасные датчики приближения с цифровым выходом: близко или нет. Это именно то, что нужно роботу для обнаружения краев. Объединив 2 краевых датчика, расположенных как две антенны для насекомых, и один активированный ультразвуковой датчик, робот сможет избегать препятствий и краев.

Обнаружение кнопки также может быть выполнено с помощью ИК-датчиков и светодиодов. Преимущество IR в том, что он невидим, что делает его использование не мешающим людям за столом. Можно также использовать лазеры, но тогда свет будет видимым, а также опасным, когда кто-то направляет лазер в глаз другого человека. Кроме того, пользователю нужно будет нацеливать датчики на роботе только тонким лазерным лучом, что будет довольно раздражать. Оборудовав робота двумя ИК-датчиками и сконструировав кнопку с ИК-светодиодом, робот знает, в каком направлении ему нужно двигаться, следя за интенсивностью ИК-света. Когда нет кнопки, робот может развернуться, пока один из светодиодов не улавливает сигнал от одной из кнопок.

Масло помещается в отсек в верхней части робота. Этот отсек может состоять из коробки и крышки, открывающей коробку. Чтобы открыть крышку и переместить ультразвуковой датчик, чтобы сканировать и обнаруживать препятствия, нам нужны два двигателя, и для этой цели более приспособлены непостоянные серводвигатели, потому что двигатели должны двигаться в определенном положении и поддерживать это положение.

Дополнительной особенностью проекта было взаимодействие с внешней средой с помощью голоса робота. Зуммер прост и приспособлен для этой цели, но его нельзя использовать в любое время, потому что текущий приток высок.

Основная сложность проекта заключается в кодировании, так как механическая часть довольно проста, и нужно учитывать множество случаев, чтобы робот не застревал или не делал что-то нежелательное. Основные проблемы, которые нам необходимо решить, - это потеря ИК-сигнала из-за препятствия и остановка при достижении кнопки!

Шаг 2: материалы

Механических частей

  • 3D-принтер и станок для лазерной резки

    • PLA будет использоваться для 3D-печати, но вы также можете использовать ABS.
    • Пластина из березовой фанеры толщиной 3 мм будет использоваться для лазерной резки, так как это дает возможность легко вносить изменения в дальнейшем, также можно использовать оргстекло, но его труднее модифицировать после лазерной резки, не повредив его.
  • Болты, гайки, шайбы

    Большинство компонентов удерживаются вместе с помощью болтов с полукруглой головкой M3, шайб и гаек, но для некоторых из них требуется набор болтов M2 или M4. Длина болтов находится в пределах 8-12 мм

  • Прокладки для печатных плат, 25 мм и 15 мм
  • 2 серводвигателя с совместимыми колесами
  • Какая-то толстая металлическая проволока диаметром около 1-2 мм.

Электронные части

  • Микроконтроллер

    1 плата arduino UNO

  • Серводвигатели

    • 2 больших серводвигателя: Feetech непрерывного действия 6 кг, 360 градусов
    • 2 микро-серводвигателя: Feetech FS90
  • Датчики

    • 1 ультразвуковой датчик
    • 2 ИК-датчика приближения
    • 2 ИК-фотодиода
  • Аккумуляторы

    • 1 держатель батареи 9 В + аккумулятор
    • 1 батарейный отсек 4AA + батарейки
    • 1 батарейный блок 9В + аккумулятор
  • Дополнительные компоненты

    • Некоторые прыгающие провода, провода и паяльные пластины
    • Некоторые резисторы
    • 1 ИК-светодиод
    • 3 переключателя
    • 1 зуммер
    • 1 кнопка
    • 1 разъем Arduino для батареи 9 В

Шаг 3: Тестирование электроники

Тестирование электроники
Тестирование электроники
Тестирование электроники
Тестирование электроники

Создание кнопки:

Кнопка просто состоит из переключателя, инфракрасного светодиода и резистора 220 Ом, подключенных последовательно от батареи 9 В. Он помещен в батарейный блок на 9 В для компактного и чистого дизайна.

Создание модулей инфракрасного приемника:

Эти модули сделаны со сквозными паяльными платами, которые позже будут прикреплены к роботу винтами. Электрические схемы этих модулей изображены на общих схемах. Принцип заключается в измерении интенсивности инфракрасного света. Чтобы улучшить измерения, можно использовать коллиматоры (сделанные из термоусадочных трубок) для фокусировки в определенном интересующем направлении.

Различные требования проекта должны быть выполнены с помощью электронных устройств. Количество устройств должно быть ограничено, чтобы поддерживать относительно низкую сложность. Этот шаг содержит схемы подключения и каждый код для тестирования всех частей по отдельности:

  • Серводвигатели непрерывного действия;
  • Ультразвуковой датчик;
  • Серводвигатели непостоянного действия;
  • Зуммер;
  • Обнаружение направления ИК-кнопки;
  • Обнаружение края с помощью датчиков приближения;

Эти коды могут помочь понять компоненты вначале, но они также очень полезны для отладки на более поздних этапах. Если возникает определенная проблема, ошибку можно легче обнаружить, протестировав все компоненты по отдельности.

Шаг 4: 3D-печать и дизайн деталей, вырезанных лазером

Дизайн деталей с 3D-печатью и лазерной резкой
Дизайн деталей с 3D-печатью и лазерной резкой
Дизайн изделий с 3D-печатью и лазерной резкой
Дизайн изделий с 3D-печатью и лазерной резкой
Дизайн изделий с 3D-печатью и лазерной резкой
Дизайн изделий с 3D-печатью и лазерной резкой

Лазерная резка деталей

Сборка состоит из трех основных горизонтальных пластин, удерживаемых вместе проставками для печатной платы, чтобы получить открытую конструкцию, обеспечивающую легкий доступ к электронике в случае необходимости.

В этих пластинах должны быть вырезаны необходимые отверстия для прикручивания проставок и других компонентов для окончательной сборки. В основном, все три пластины имеют отверстия в одном и том же месте для прокладок и специальные отверстия для электроники, закрепленные соответственно на каждой пластине. Обратите внимание, что в средней пластине есть отверстие для пропускания проводов посередине.

Меньшие части вырезаются по размеру большого сервопривода, чтобы прикрепить их к сборке.

3D-печатные изделия

Помимо лазерной резки, некоторые детали необходимо будет распечатать на 3D-принтере:

  • Подставка для ультразвукового датчика, которая соединяет его с одним рычагом микро-серводвигателя.
  • Подставка для поворотного колеса и двух инфракрасных кромочных датчиков. Особая конструкция коробчатых концов детали для ИК-датчиков действует как экран, чтобы избежать помех между кнопкой, излучающей ИК-сигнал, и ИК-датчиками, которым необходимо сосредоточиться только на том, что происходит на земле.
  • Подставка для микро-серводвигателя, открывающая крышку
  • И, наконец, сама крышка, сделанная из двух частей, чтобы иметь больший рабочий угол, избегая столкновения с микро-серводвигателем, открывающим крышку:

    • Нижний, который будет крепиться к верхней пластине
    • И верх, который соединен с нижним шарниром и приводится в действие сервоприводом с помощью толстой металлической проволоки. Мы решили добавить роботу немного индивидуальности, придав ему голову.

После того, как все детали спроектированы и файлы экспортированы в формате, соответствующем используемым машинам, детали могут быть фактически изготовлены. Имейте в виду, что 3D-печать занимает много времени, особенно с учетом размеров верхней части крышки. Вам может потребоваться один или два дня, чтобы напечатать все части. Однако лазерная резка занимает всего несколько минут.

Все файлы SOLIDWORKS находятся в заархивированной папке.

Шаг 5: Сборка и подключение

Image
Image
Сборка и электромонтаж
Сборка и электромонтаж
Сборка и электромонтаж
Сборка и электромонтаж
Сборка и электромонтаж
Сборка и электромонтаж

Сборка будет представлять собой сочетание проводки и свинчивания компонентов вместе, начиная снизу вверх.

Нижняя пластина

Нижняя пластина собрана с аккумуляторным блоком 4AA, серводвигателями, печатной частью (крепление шаровой опоры под пластиной), двумя краевыми датчиками и 6 шайбами-фемальными прокладками.

Средняя пластина

Затем можно установить среднюю пластину, сжимая серводвигатели между двумя пластинами. Затем эту пластину можно закрепить, поместив на нее еще один набор распорок. Некоторые кабели можно пропустить через центральное отверстие.

Ультразвуковой модуль может быть прикреплен к сервоприводу прерывистого действия, который закреплен на средней пластине с Arduino, аккумуляторной батареей 9 В (питающей Arduino) и двумя модулями инфракрасного приемника в передней части робота. Эти модули выполнены со сквозными паяльными платами и прикреплены к пластине винтами. Электрические схемы этих модулей изображены на общих схемах.

Верхняя пластина

На этой части сборки переключатели не зафиксированы, но робот уже может делать все, кроме действий, требующих крышки, таким образом, это позволяет нам провести некоторые тесты, чтобы исправить порог, адаптировать код движения и легко доступ к портам ардуино.

Когда все это будет достигнуто, верхнюю пластину можно закрепить с помощью распорок. Последние компоненты, а именно два переключателя, кнопка, сервопривод, зуммер и система крышки, могут быть окончательно закреплены на верхней пластине для завершения сборки.

Последнее, что нужно проверить и исправить, - это угол сервопривода, чтобы правильно открыть крышку.

Порог краевых датчиков должен быть адаптирован с помощью входящего в комплект потенциометра (с помощью плоской отвертки) для различных поверхностей стола. У белого стола должен быть более низкий порог, чем, например, у коричневого стола. Также высота датчиков будет влиять на необходимый порог.

В конце этого шага сборка завершена, и последняя оставшаяся часть - это недостающие коды.

Шаг 6. Кодирование: соединяем все вместе

Весь код, необходимый для работы робота, находится в заархивированном файле, который можно скачать. Самый важный из них - это «основной» код, который включает настройку и функциональный цикл робота. Большинство других функций написано в суб-файлах (также в заархивированной папке). Эти субфайлы должны быть сохранены в той же папке (которая называется «основная»), что и основной скрипт, прежде чем загружать его в Arduino.

Сначала определяется общая скорость робота вместе с переменной «напомнить». Это «напоминание» - это значение, которое запоминает, в каком направлении вращался робот. Если «remind = 1», робот поворачивает / поворачивает налево, если «remind = 2», робот поворачивает / поворачивает направо.

int speed = 9; // Общая скорость робота

int напомнить = 1; // Начальное направление

При настройке робота инициализируются различные субфайлы программы. В этих суб-файлах записаны основные функции по управлению двигателями, датчиками,…. Инициализируя их в настройке, функции, описанные в каждом из этих файлов, можно использовать в основном цикле. Активировав функцию r2D2 (), робот будет издавать шум, как робот R2D2 из франшизы фильма Звездные войны, когда он запускается. Здесь функция r2D2 () отключена, чтобы зуммер не потреблял слишком много тока.

// Настройка @ сброс // ----------------

void setup () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); initialize_lid (); initialize_buzzer (); // r2D2 (); int напомнить = 1; // начальное направление Starter (напомнить); }

Функция Starter (напоминание) сначала вызывается в настройке. Эта функция заставляет робота поворачиваться и искать ИК-сигнал одной из кнопок. Как только он найдет кнопку, программа выйдет из функции Starter, изменив переменную cond на false. Во время вращения робота он должен знать о своем окружении: он должен обнаруживать края и препятствия. Это проверяется каждый раз, прежде чем он продолжит разворачиваться. Как только робот обнаруживает препятствие или кромку, будет выполнен протокол обхода этих препятствий или кромок. Эти протоколы будут объяснены позже на этом этапе. Функция Starter имеет одну переменную, которая является переменной напоминания, о которой говорилось ранее. Давая значение напоминания функции Starter, робот знает, в каком направлении ему нужно повернуться, чтобы найти кнопку.

// Стартовый цикл: развернитесь и найдите кнопку // ------------------------------------ ----------------

void Starter (int remind) {if (isedgeleft () || isedgeright ()) {// Обнаружить края edgeDetected (напомнить); } else {bool cond = true; while (cond == true) {если (buttonleft () == false && buttonright () == false && isButtonDetected () == true) {cond = false; } else {if (remind == 1) {// Мы поворачивали налево if (isobstacleleft ()) {stoppeed (); избежать препятствий (напомнить); } else if (isedgeleft () || isedgeright ()) {// Обнаружить края edgeDetected (напомнить); } else {turnleft (скорость); }} еще если (напомнить == 2) {если (isobstacleright ()) {stoppeed (); избежать препятствий (напомнить); } else if (isedgeleft () || isedgeright ()) {// Обнаружить края edgeDetected (напомнить); } else {поворот (скорость); }}}}}}

Если робот находит кнопку, то выходит из первого цикла запуска и начинается основной функциональный цикл робота. Этот основной цикл довольно сложен, поскольку каждый раз роботу необходимо определять, есть ли перед ним препятствие или край. Основная идея состоит в том, что робот следует за кнопкой, находя ее и каждый раз теряя. Используя два ИК-датчика, мы можем выделить три ситуации:

  • разница между инфракрасным светом, обнаруживаемым левым и правым датчиком, превышает определенный порог, и есть кнопка.
  • разница в ИК-освещении меньше порога, а перед роботом есть кнопка.
  • разница в ИК-освещении меньше порогового значения, и перед роботом НЕТ кнопки.

Процедура отслеживания работает следующим образом: когда кнопка обнаружена, робот движется к кнопке, поворачиваясь в том же направлении, в котором он вращался (используя переменную напоминания), и в то же время перемещается немного вперед. Если робот повернется слишком далеко, кнопка снова будет потеряна, и в этот момент робот помнит, что ему нужно повернуть в другом направлении. Это также делается при небольшом продвижении вперед. При этом робот постоянно поворачивает налево и поворачивает направо, но при этом все еще продвигается к кнопке. Каждый раз, когда робот находит кнопку, он просто продолжает вращаться, пока не потеряет ее, и в этом случае он начинает двигаться в другом направлении. Обратите внимание на разницу в функциях, которые используются в цикле Starter и в основном цикле: цикл Starter использует Turnleft () или turnright (), а в основном цикле используются «moveleft ()» и «moveright ()». Функции движения влево / вправо не только заставляют робота поворачиваться, но и одновременно заставляют его двигаться вперед.

/ * Функциональный цикл ---------------------------- Здесь есть только процедура отслеживания * /

int lost = 0; // Если lost = 0 кнопка найдена, если lost = 1 кнопка потеряна void loop () {if (isedgeleft () || isedgeright ()) {

if (! isobstacle ()) {

движение вперед (скорость); задержка (5); } еще {избежать препятствий (напомнить); } else {if (remind == 1 && lost == 1) {// Мы поворачивали налево, stoppeed (); если (! isobstacleright ()) {moveright (скорость); // Повернитесь, чтобы найти кнопку} else {prevent_obstacle (напомнить); } напомнить = 2; } иначе, если (напомнить == 2 && потерянный == 1) {stoppeed (); если (! isobstacleleft ()) {moveleft (скорость); // Мы поворачивали направо} else {prevent_obstacle (напомнить); } напомнить = 1; } else if (lost == 0) {if (remind == 1) {// Мы поворачивали налево if (! isobstacleleft ()) {moveleft (speed); // Мы поворачивали направо} else {stoppeed (); избежать препятствий (напомнить); } //} else if (remind == 2) {if (! isobstacleright ()) {moveright (скорость); // Обернитесь, чтобы найти кнопку} else {stoppeed (); избежать препятствий (напомнить); }}} задержка (10); проиграл = 0; }} //}}

Теперь дается небольшое объяснение двух наиболее сложных процедур:

Избегайте краев

Протокол, позволяющий избегать краев, определен в функции, называемой «edgeDetection ()», которая записывается в суб-файл «перемещение». Этот протокол основан на том факте, что робот должен столкнуться с ребром только тогда, когда он достиг своего пункта назначения: кнопки. Как только робот обнаруживает край, первое, что он делает, - это немного отодвигается назад, чтобы находиться на безопасном расстоянии от края. Как только это будет сделано, робот ждет 2 секунды. Если кто-то нажимает кнопку на передней панели робота в течение этих двух секунд, робот знает, что он достиг человека, который хочет масло, открывает отделение для масла и представляет масло. На этом этапе кто-то может взять масло у робота. Через несколько секунд робот устанет ждать и просто закроет крышку сливочного масла. После закрытия крышки робот выполнит цикл запуска для поиска другой кнопки. Если случится так, что робот наткнется на край, не достигнув места назначения, и кнопка на передней части робота не будет нажата, робот не откроет крышку для масла и немедленно выполнит цикл запуска.

Избегайте препятствий

В подфайле "движение" также находится функция escape_obstacle (). Сложность обхода препятствий заключается в том, что у робота довольно большая слепая зона. Ультразвуковой датчик расположен в передней части робота, что означает, что он может обнаруживать препятствия, но не знает, когда он их преодолевает. Для решения этой проблемы используется следующий принцип: как только робот встречает препятствие, он использует переменную reming для поворота в другом направлении. Таким образом, робот избежит столкновения с препятствием. Робот продолжает вращаться, пока ультразвуковой датчик не перестанет обнаруживать препятствие. Во время поворота робота счетчик увеличивается до тех пор, пока препятствие не перестанет обнаруживаться. Этот счетчик дает приблизительное значение длины препятствия. Двигаясь вперед и одновременно уменьшая встречное сопротивление, можно избежать препятствия. Как только счетчик достигнет 0, функцию стартера можно снова использовать для перемещения кнопки. Конечно, робот выполняет функцию стартера, поворачиваясь в том направлении, в котором он помнил, что двигался до того, как столкнулся с препятствием (снова используя переменную напоминания).

Теперь, когда вы полностью понимаете код, вы можете начать его использовать!

Обязательно адаптируйте пороги к вашей среде (например, отражение ИК-излучения выше в белых таблицах) и адаптируйте различные параметры к вашим потребностям. Также большое внимание следует уделить питанию различных модулей. Очень важно, чтобы серводвигатели не питались от порта Arduino 5V, так как они потребляют большой ток (это может повредить микроконтроллер). Если для датчиков используется тот же источник питания, что и для сервоприводов, могут возникнуть некоторые проблемы с измерением.

Рекомендуемые: