Оглавление:

Ровер, управляемый через Интернет: 14 шагов (с изображениями)
Ровер, управляемый через Интернет: 14 шагов (с изображениями)

Видео: Ровер, управляемый через Интернет: 14 шагов (с изображениями)

Видео: Ровер, управляемый через Интернет: 14 шагов (с изображениями)
Видео: Лунный ровер и победа США 2024, Ноябрь
Anonim
Ровер, управляемый через Интернет
Ровер, управляемый через Интернет
Ровер, управляемый через Интернет
Ровер, управляемый через Интернет

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

В этом руководстве мы рассмотрим, что нужно для создания простого, но надежного ровера с Wi-Fi / веб-управлением. Используемое шасси - Actobotics Gooseneck. Я выбрал его из-за его размера, возможностей расширения и стоимости, но вы можете использовать любое другое шасси по своему усмотрению.

Для такого проекта нам понадобится хороший надежный одноплатный компьютер, и для этого бота я решил использовать Raspberry Pi (RPI) на базе Linux. RPI (и Linux) дает нам множество вариантов кодирования, а для кодирования будет использоваться Python. В качестве веб-интерфейса я использую Flask, легкий веб-фреймворк для Python.

Для привода двигателей я выбрал RoboClaw 2x5a. Он обеспечивает простую последовательную связь для управления им и хорошо работает с RPI и двигателями на Gooseneck.

Наконец, у него есть веб-камера для видео обратной связи типа POV для удаленного управления. Позже я расскажу о каждой теме более подробно.

Шаг 1. Требуется оборудование

Необходимое оборудование
Необходимое оборудование
Необходимое оборудование
Необходимое оборудование
Необходимое оборудование
Необходимое оборудование
Необходимое оборудование
Необходимое оборудование
  • Шасси Actobotics Gooesneck или подходящая замена по вашему выбору
  • Raspberry Pi по вашему выбору (или клон) - на этом боте используется модель B RPI, но подойдет любой, имеющий как минимум два USB-порта.
  • Стандартная сервопластина B x1
  • Одноугловой кронштейн канала 90 ° x1
  • Драйвер двигателя RoboClaw 2x5a
  • S3003 или аналогичный сервопривод стандартного размера
  • Малый макет или мини-макет
  • Перемычки между женщиной и женщиной
  • Перемычки между мужчинами и женщинами
  • Веб-камера (необязательно) - я использую Logitech C110, и вот список поддерживаемых камер для RPI.
  • Источник питания 5v-6v для сервопривода
  • Аккумулятор 7,2–11,1 В для питания приводного двигателя
  • Внешний аккумулятор USB 5 в, 2600 мАч (или выше) для RPI
  • USB-адаптер Wi-Fi

На моем боте я использую 4-дюймовые колеса, чтобы сделать его немного более вездеходным и закрытым. Для этого варианта вам понадобятся:

  • 4-дюймовые колеса для тяжелых условий эксплуатации x2
  • Ступица с установочным винтом диаметром 4 мм (0,770 дюйма) x2

Шаг 2: Сборка шасси

Сборка шасси
Сборка шасси
Сборка шасси
Сборка шасси
Сборка шасси
Сборка шасси

Сначала соберите шасси, следуя инструкциям, прилагаемым к шасси или видео. После завершения у вас должно получиться что-то вроде изображения. ПРИМЕЧАНИЕ. При сборке шейной части просто отключите монтажный кронштейн.

В моем боте я решил заменить колеса, которые поставлялись с шасси, на 4-дюймовые сверхмощные колеса. Это необязательно и не нужно, если вы не хотите делать то же самое.

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

Монтаж электроники
Монтаж электроники
Монтаж электроники
Монтаж электроники
Монтаж электроники
Монтаж электроники

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

Шаг 4: Добавление веб-камеры

Добавление веб-камеры
Добавление веб-камеры
Добавление веб-камеры
Добавление веб-камеры
Добавление веб-камеры
Добавление веб-камеры

Для этого шага возьмите 90-градусный кронштейн, легкую ступицу сервопривода и четыре (4) винта 0,3125 дюйма:

  • Возьмите сервоцентр, поместите ее на одну сторону кронштейна и закрепите их вместе винтами 0,2125 дюйма, как показано на рисунке.
  • Затем установите сервопривод в кронштейн сервопривода.
  • Прикрепите 90-градусный кронштейн с рогом сервопривода к стержню сервопривода и используйте винт рог, поставляемый с сервоприводом, чтобы соединить их вместе.
  • Теперь закрепите сервопривод в кронштейне на вершине гусиной шеи с помощью оставшихся винтов.
  • Закрепите камеру с помощью стяжки или двустороннего скотча на 90-градусном кронштейне.

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

Шаг 5: Подключите все

Подключение всего этого
Подключение всего этого
Подключение всего этого
Подключение всего этого
Подключение всего этого
Подключение всего этого
Подключение всего этого
Подключение всего этого

Электропроводка для этого робота довольно прямолинейна.

Моторы:

Припаяйте выводы к обоим двигателям, если вы еще этого не сделали

Поверните переднюю часть робота (конец с гусиной шеей) от вас:

  • Подключите провода двигателя на левом двигателе к каналам M1A и M1B.
  • Подключите провода двигателя на правом двигателе к каналам M2A и M2B.

Соединения с землей (GND):

  • Подключите один контакт заземления RoboClaw к плате перемычки заземления. Линия заземления на RoboClaw находится ближе всего к центру (см. Рис.)
  • Подключите PIN 6 на RPI к плате перемычек. См. Рисунок заголовка RPI для получения информации о назначении контактов.
  • Подключите GND от серво аккумуляторной батареи к одному из контактов на плате перемычки.
  • Подключите перемычку от платы перемычек к проводу GND сервоприводов.

RPI для RoboClaw:

Подключите вывод RPI GPIO14 TXD к выводу RoboClaw S1

Власть:

  • Подключите провод POS от сервоаккумулятора к выводу POS сервопривода.
  • Подключите провод POS от аккумуляторной батареи двигателя к POS (+) входной клеммы питания двигателя RoboClaw. Мы пока оставим клемму GND отключенной.

Шаг 6. Настройка RPI

Настройка RPI
Настройка RPI

Я предполагаю, что пользователь здесь кое-что знает о Linux и RPI. Я не рассказываю, как настроить или подключиться к одному из них. Если вам нужна помощь, воспользуйтесь приведенными ниже страницами.

Чтобы настроить RPI, взгляните на следующие страницы:

  • Базовая настройка RPI
  • RPI Краткое руководство
  • Гильда установки NOOBS

Для общих переходных страниц отличным местом для начала являются главная страница RPI и страницы eLinux.

См. Эту ссылку для общей настройки Wi-Fi RPI.

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

  • Настройка камеры RPI
  • Настройка камеры eLinix RPI

Потоковое видео:

Есть несколько способов заставить потоковое видео работать с RPI, но я предпочитаю использовать движение.

Чтобы установить его на свой RPI, выполните следующее: sudo apt-get install motion

В этом руководстве также рассматривается настройка его для потоковой передачи.

Шаг 7: Настройка последовательного порта RPI

Нам нужно будет отключить режим консоли Linux для использования RX и TX, поскольку мы хотим разговаривать с контроллером мотора RoboClaw через этот порт. Для этого вы можете использовать этот метод или этот инструмент. Выбор метода остается за вами, поскольку в конечном итоге они оба делают одно и то же.

Шаг 8: Установка модулей Python

Вам понадобится python, установленный на RPI, а также пакет установщика пакетов python.

Чтобы установить pip, выполните:

  1. sudo apt-get install python-setuptools
  2. sudo easy_install pip

Потом:

  1. sudo pip установить колбу
  2. sudo pip установить pyserial
  3. sudo pip установить RPIO

Это будут все модули, необходимые для запуска кода.

Шаг 9: Настройка RoboClaw

У меня есть код робота, который разговаривает с RoboClaw в стандартном последовательном режиме на скорости 19200 бод.

Чтобы настроить RoboClaw для этого, выполните:

  1. Нажмите кнопку "РЕЖИМ" на RoboClaw.
  2. Нажимайте кнопку настройки, пока светодиодный индикатор не мигнет 5 (пять) раз между задержками.
  3. Нажмите кнопку «LIPO», чтобы сохранить
  4. Затем нажимайте кнопку «SET», пока светодиод не мигнет 3 (три) раза между задержками.
  5. Нажмите кнопку LIPO, чтобы сохранить

Вот и все, что нужно для настройки контроллера мотора. При необходимости см. Ссылку в формате pdf, указанную выше.

Шаг 10: Установка программы / файлов Rover

Загрузите и скопируйте файл rover.zip в свой RPI в каталоге пользователя pi.

Если вы используете Linux или Mac, вы можете использовать scp для этого:

scp ~ / расположение / из / файла / rover.zip pi @ your_rpi_ip: / ~

Для Windows вы можете загрузить и использовать pscp, а затем выполнить:

pscp /location/of/the/file/rover.zip pi @ your_rpi_ip: / ~

Как только zip-файл будет скопирован в RPI, войдите в него как пользователь pi.

Теперь запустите:

разархивировать rover.zip

Это распакует файлы в папку с именем 'rover', в которой будут находиться следующие файлы:

  • restrover.py (код на Python для робота)
  • статический (содержит файлы изображений для кнопок на странице управления)
  • шаблоны (содержит файл index.htlm, веб-страницу управления)

Если вы используете веб-камеру, измените строку в нижней части файла index.html в папке шаблона. Измените URL-адрес в строке IFRAME, чтобы он соответствовал URL-адресу src для вашего видеопотока.

Шаг 11: запуск бота

Запуск бота
Запуск бота

Подключите питание USB к RPI.

Чтобы запустить код бота, войдите в систему как пользователь pi и запустите:

  • cd rover
  • sudo python restrover.py

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

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

Теперь подключите провод GND (-) к клемме NEG (-) на входе питания двигателя RoboClaw.

Шаг 12: доступ к странице управления ботами

Доступ к странице управления ботами
Доступ к странице управления ботами
Доступ к странице управления ботами
Доступ к странице управления ботами

После того, как скрипт python робота будет запущен, включите RoboClaw, а затем перейдите к IP-адресу вашего RPI, например:

ваш_rpi_ip

Вы должны увидеть всплывающую страницу веб-управления, как на изображениях. Если нет, проверьте выходной терминал RPI, найдите ошибки и исправьте их.

Оказавшись на странице, вы готовы управлять ботом.

Робот запустится в режиме «Средний бег» и на средней скорости.

Ботом можно управлять с помощью кнопок на странице или клавиш на клавиатуре.

Ключи:

  • w - вперед
  • z - назад / назад
  • а - длинный левый поворот
  • s - длинный правый поворот
  • q - короткий левый поворот
  • е - короткий правый поворот
  • 1 - панорамирование камеры влево
  • 2 - панорамирование камеры вправо
  • 3 - панорамирование полностью влево
  • 4 - панорама полная правая
  • / - главная / центральная камера
  • h - остановка / остановка робота

Между отправленными командами есть буфер задержки в полсекунды. Я сделал это, чтобы исключить нежелательные повторяющиеся команды. Вы, конечно, можете удалить это из кода, если хотите (в index.html)

Остальные элементы управления и управление им не требуют пояснений.

Шаг 13: Код Python / Flask

Этот бот использует Python и веб-фреймворк Flask. Вы можете узнать больше о Flask здесь, если вам интересно.

Большое отличие от приложения Flask и обычного скрипта Python - это класс / метод @ app.route, используемый для обработки URI. В остальном это по большей части обычный Python.

#! / usr / bin / env python

# # Ровер, управляемый Wi-Fi / Интернетом # # Написано Скоттом Бизли, 2015 г.) # Подключитесь к коммуникационному порту, чтобы поговорить с контроллером мотора Roboclaw. Попробуйте: found ") sys.exit (0) # Переменные управления скоростью и приводом last_direction = -1 speed_offset = 84 turn_tm_offset = 0,166 run_time = 0,750 # Нейтральное положение сервопривода (исходное) servo_pos = 1250 servo = PWM. Servo () servo.set_servo (18, servo_pos) # Небольшая задержка для установления времени time.sleep (3) # # Обработчики URI - все действия страницы бота выполняются здесь # # Отправка страницы управления ботами (домашняя страница) @ app.route ("/") def index (): return render_template ('index.html', name = None) @ app.route ("/ forward") def forward (): global last_direction, run_ti me print "Forward" go_forward () last_direction = 0 # sleep 100ms + run_time time.sleep (0.100 + run_time) # Если не непрерывно, то останавливаться после задержки, если run_time> 0: last_direction = -1 halt () return "ok" @ app.route ("/ backward") def backward (): global last_direction, run_time print "Backward" go_backward () last_direction = 1 # sleep 100 мс + run_time time.sleep (0.100 + run_time) # Если не непрерывно, то остановится после задержки если run_time> 0: last_direction = -1 halt () return "ok" @ app.route ("/ left") def left (): global last_direction, turn_tm_offset print "Left" go_left () last_direction = -1 # sleep @ 1 / 2 секунды time.sleep (0.500 - turn_tm_offset) # stop halt () time.sleep (0.100) return "ok" @ app.route ("/ right") def right (): global last_direction, turn_tm_offset print "Right" go_right () # сон @ 1/2 секунды time.sleep (0.500 - turn_tm_offset) last_direction = -1 # stop halt () time.sleep (0.100) return "ok" @ app.route ("/ ltforward") def ltforward (): global last_direction, turn_t m_offset print "Левый поворот вперед" go_left () # сон @ 1/8 секунды time.sleep (0.250 - (turn_tm_offset / 2)) last_direction = -1 # stop halt () time.sleep (0.100) return "ok" @app.route ("/ rtforward") def rtforward (): global last_direction, turn_tm_offset print "Правый поворот вперед" go_right () # sleep @ 1/8 секунды time.sleep (0.250 - (turn_tm_offset / 2)) last_direction = -1 # stop halt () time.sleep (0.100) return "ok" @ app.route ("/ stop") def stop (): global last_direction print "Stop" halt () last_direction = -1 # сон 100 мс time.sleep (0.100) return "ok" @ app.route ("/ panlt") def panlf (): global servo_pos print "Panlt" servo_pos - = 100, если servo_pos 2500: servo_pos = 2500 servo.set_servo (18, servo_pos) # время сна 150 мс. sleep (0.150) return "ok" @ app.route ("/ home") def home (): global servo_pos print "Home" servo_pos = 1250 servo.set_servo (18, servo_pos) # sleep 150ms time.sleep (0.150) return "ok" @ app.route ("/ panfull_lt") def panfull_lt (): global servo_pos print "Pan full l eft "servo_pos = 500 servo.set_servo (18, servo_pos) # sleep 150ms time.sleep (0.150) return" ok "@ app.route (" / panfull_rt ") def panfull_rt (): global servo_pos print" Pan full right "servo_pos = 2500 servo.set_servo (18, servo_pos) # sleep 150ms time.sleep (0.150) return "ok" @ app.route ("/ speed_low") def speed_low (): global speed_offset, last_direction, turn_tm_offset speed_offset = 42 turn_tm_offset = 0.001 # Обновить текущее направление, чтобы получить новую скорость, если last_direction == 0: go_forward () if last_direction == 1: go_backward () # сон 150 мс time.sleep (0.150) return "ok" @ app.route ("/ speed_mid") def speed_mid (): global speed_offset, last_direction, turn_tm_offset speed_offset = 84 turn_tm_offset = 0.166 # Обновить текущее направление, чтобы получить новую скорость if last_direction == 0: go_forward () if last_direction == 1: go_backward () # sleep 150ms time.sleep (0.150) return "ok" @ app.route ("/ speed_hi") def speed_hi (): global speed_offset, last_direction, turn_tm_offset speed_offset = 126 тур. n_tm_offset = 0.332 # Обновить текущее направление, чтобы получить новую скорость, если last_direction == 0: go_forward () if last_direction == 1: go_backward () # сон 150 мс time.sleep (0.150) return "ok" @ app.route ("/ continuous ") def continuous (): global run_time print" Continuous run "run_time = 0 # sleep 100ms time.sleep (0.100) return" ok "@ app.route (" / mid_run ") def mid_run (): global run_time print" Mid run "run_time = 0.750 halt () # sleep 100ms time.sleep (0.100) return" ok "@ app.route (" / short_time ") def short_time (): global run_time print" Short run "run_time = 0.300 halt () # sleep 100 мс time.sleep (0.100) return "ok" # # Функции привода двигателя # def go_forward (): global speed_offset if speed_offset! = 42: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (128 + speed_offset)) else: roboclaw.write (chr (127 - speed_offset)) roboclaw.write (chr (255 - speed_offset)) def go_backward (): global speed_offset if speed_offset! = 42: roboclaw.write (chr (127 - speed_offset)) roboclaw.wri te (chr (255 - speed_offset)) else: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (128 + speed_offset)) def go_left (): global speed_offset if speed_offset! = 42: roboclaw.write (chr (127 - speed_offset)) roboclaw.write (chr (128 + speed_offset)) else: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (255 - speed_offset)) def go_right (): global speed_offset, если speed_offset! = 42: roboclaw.write (chr (1 + speed_offset)) roboclaw.write (chr (255 - speed_offset)) else: roboclaw.write (chr (127 - speed_offset)) roboclaw.write (chr (128 + speed_offset)) def halt (): roboclaw.write (chr (0)) if _name_ == "_main_": app.run (host = '0.0.0.0', port = 80, debug = True)

Если вы не хотите или не нуждаетесь в отладочной информации из Flask, установите для параметра debug значение false в строке app.run.

если _name_ == "_main_":

app.run (хост = '0.0.0.0', порт = 80, отладка = False)

Вы также можете изменить порт, который прослушивает http-сервер Flask, здесь.

Шаг 14: Использование другого оборудования

Если вы хотите использовать другое оборудование, например, другой тип SBC (одноплатный компьютер), у вас должны возникнуть небольшие проблемы с запуском Python и Flask на других платах, таких как Beagle Bone, PCDuino и т. Д. Вам придется изменить код, чтобы он соответствовал GPIO макет и использовать возможности сервопривода новой платы.

Чтобы использовать драйвер двигателя другого типа, вам просто нужно изменить функции go_forward, go_backward, go_left, go_right и halt, чтобы они делали то, что требуется сменному драйверу двигателя, чтобы заставить двигатель выполнять эту конкретную функцию.

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