Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Робот Arduino с контроллером PS2 (джойстик PlayStation 2)

Компоненты и расходные материалы

Arduino UNO
× 1
Драйверы двигателя SparkFun Dual H-Bridge L298
× 1
Комплект роботизированного резервуара своими руками
× 1
беспроводной контроллер Sony PS2
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

В этом уроке я покажу вам, как использовать беспроводной джойстик PlayStation 2 (PS2) для управления роботизированным танком. В основе этого проекта была использована плата Arduino Uno. Он получает команды от беспроводного контроллера и устанавливает скорость двигателей. Также можно использовать другие платы для разработки (NodeMCU, Firebeetle и т. Д.), И принципы, представленные в этом руководстве, могут быть применены к другим моделям роботов и гаджетов.

Ранее я проектировал роботизированный танк, управляемый Blynk. Он подключается к сети Wi-Fi и получает команды от сервера Blynk. Смартфон с приложением Blynk использовался в качестве пульта дистанционного управления, и использовались различные методы ввода:кнопки, ползунки и даже акселерометр смартфона. Вы можете узнать больше об этом проекте здесь:https://www.hackster.io/igorF2/wi-fi-controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

Я также провел несколько экспериментов с голосовыми командами. Это может быть полезно, если вы хотите дистанционно управлять роботом, не используя руки, или если вы хотите сделать его доступным для кого-то с ограниченными движениями. Например, можно подумать о роботизированном кресле-коляске с голосовым управлением. Использовался роботизированный набор DIY, а также некоторые из моих любимых инструментов:Adafruit.io, IFTTT и Arduino IDE. Полные инструкции здесь:

https://www.hackster.io/igorF2/wi-fi-voice-controlled-robot-using-google-assistant-79802c

Вы можете использовать различные комплекты или даже проектировать собственных роботов из простых материалов без необходимости использования сложных инструментов, таких как 3D-принтеры и станки для лазерной резки. Вы можете найти пример в одном из моих предыдущих руководств:

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09

Шаг 1. Инструменты и материалы

В этом проекте использовались следующие инструменты:

  • Припой и проволока (ссылка / ссылка). Электродвигатели постоянного тока уже пришли с припаянными к клеммам проводами ... Но со временем он сломается, и вам, возможно, придется его перепаять. Так что подумайте о том, чтобы иметь хороший припой и провод.
  • Пенопласт EVA (или другой непроводящий материал). Шасси робота, которое я использовал в этом проекте, изготовлено из алюминия, и печатные платы установлены на этих металлических деталях. Я использовал слой пенопласта между досками и металлической пластиной, чтобы избежать возможных коротких замыканий.
  • Двусторонний скотч . Он использовался для приклеивания листов пенопласта к печатным платам и для установки модуля H-Bridge.
  • Ножницы , для вырезания прямоугольников из пенопласта.

В своем проекте я использовал следующие аппаратные части:

  • Плата для разработчиков на базе Arduino Uno (ссылка / ссылка / ссылка / ссылка). Он используется как главный контроллер робота. Его действительно легко использовать и программировать с помощью Arduino IDE, он отлично подходит для новичков в электронике и программировании.
  • Двухканальный модуль H-моста L298N (ссылка / ссылка / ссылка / ссылка). Этот модуль позволяет сигналам 3,3 В от Wemos (или Arduino) усиливаться до 12 В, необходимых для двигателей.
  • Самодельный бак-шасси робота (ссылка на сайт). В этом замечательном комплекте есть все необходимое для сборки танка:два двигателя постоянного тока, шестерни, гусеницы, болты, гайки и т. Д. В нем уже есть инструменты, необходимые для сборки шасси, что отлично подходит для новичков!
  • Беспроводной пульт дистанционного управления PS2 (ссылка на сайт). Этот контроллер видеоигры может отправлять команды по беспроводной сети на приемник, который может быть сопряжен с микроконтроллером с помощью последовательной связи.
  • Аккумуляторы 18650 3,7 В (3 шт.) (ссылка / ссылка). Раньше я питал всю схему. В этом танке используются двигатели на 12 В. Для их питания я использовал три батареи 3,7 В.
  • Держатель батареи 3S 18650 (ссылка / ссылка / ссылка). Он вмещает три батареи 18650 в серии и может быть легко прикреплен к задней части бака.
  • зарядное устройство 18650 (ссылка / ссылка). В конечном итоге ваши батареи разрядятся. Когда это произойдет, вам на помощь придет зарядное устройство.
  • Джемперы (ссылка / ссылка). Я использовал 6 перемычек папа-мама для сигналов между h-мостом и Wemos, и 2 перемычки папа-папа для 5V и Gnd. Вам может потребоваться больше, если вы планируете добавить несколько датчиков.
  • USB-кабель типа B . Это понадобится вам для загрузки вашего кода. Большинство плат уже имеют собственный кабель.

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

Шаг 2. Сборка робота

Первой частью этого проекта была сборка конструкции робота.

В предыдущих проектах я разрабатывал структуру своего собственного робота, используя легкодоступные материалы (без использования сложных инструментов, 3D-принтеров или станков для лазерной резки). Вы можете найти этот проект по ссылке ниже:

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09

Позже решил дать шанс на приобретение роботизированного набора в интернет-магазине. Вы можете найти ссылку на шасси робота по следующей ссылке:http://bit.ly/2ycI8fP. Если вы ищете комплект, думаю, это хороший вариант! Я использовал его в двух других уроках, как вы можете видеть по ссылкам ниже:

https://www.hackster.io/igorF2/wi-fi-controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

https://www.hackster.io/igorF2/wi-fi-voice-controlled-robot-using-google-assistant-79802c

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

Еще одним положительным моментом является то, что в комплект входят все инструменты, необходимые для установки робота (пара шестигранных ключей и отвертка). Я считаю, что это делает набор отличным вариантом для начинающих, у которых мало инструментов!

Из минусов выделю отсутствие документации. Монтажник робота

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

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

Шаг 3. Подключение схемы

На задней части робота был установлен блок питания из трех аккумуляторов 18650. Он обеспечивает роботу 11,1 В (3 x 3,7 В). Этого достаточно для питания двигателей на 12 В постоянного тока.

Двухканальный H-мост L298N использовался для управления двигателями. Он принимает сигналы 5 В от платы Arduino и обеспечивает более высокое напряжение для двигателей. Это также позволяет двигателям работать в обоих направлениях в зависимости от комбинации этих входных сигналов.

Каждое устройство было подключено по схеме.

Далее следует список контактов, которые вам необходимо подключить:

Входы / выходы Arduino Uno:

  • Цифровой контакт 3 => Контакт H-Bridge ENA
  • Цифровой вывод 5 => Вывод H-Bridge IN1
  • Цифровой контакт 4 => контакт H-Bridge IN2
  • Цифровой контакт 8 => контакт H-Bridge IN3
  • Цифровой контакт 7 => контакт H-Bridge IN4
  • Цифровой контакт 6 => контакт H-Bridge ENB
  • вывод 5V => вывод H-Bridge 5V
  • Вывод заземления => Вывод заземления H-моста
  • Цифровой вывод 10 => Контакт 6 приемника PS2
  • Цифровой вывод 11 => Контакт 2 приемника PS2
  • Цифровой контакт 12 => Контакт 1 приемника PS2
  • Цифровой вывод 13 => Контакт 7 приемника PS2
  • Контакт 3,3 В => Контакт 5 приемника PS2
  • Контакт Gnd => Контакт 4 приемника PS2

Входы / выходы H-моста:

  • Контакт ENA => Цифровой контакт 3 Arduino
  • вывод IN1 => цифровой вывод 5 Arduino
  • Вывод IN2 => Цифровой вывод 4 Arduino
  • Вывод IN3 => Цифровой вывод 8 Arduino
  • Вывод IN4 => Цифровой вывод 7 Arduino
  • Контакт ENB => Цифровой контакт 6 Arduino
  • вывод 5V => вывод Arduino 5V
  • Контакт Gnd => Контакт Arduino Gnd
  • Gnd pin => Минусовой провод аккумуляторной батареи
  • Вывод 12 В => Положительный провод аккумуляторной батареи
  • OUT1 => Минусовой провод правого двигателя
  • OUT2 => Плюсовой провод правого двигателя
  • OUT3 => Плюсовой провод левого двигателя
  • OUT4 => Минусовой провод левого двигателя

Ресивер PS2:

  • Контакт 1 (данные) => Цифровой контакт 12 Arduino
  • Контакт 2 (команда) => Цифровой контакт 11 Arduino
  • Контакт 4 (заземление) => Контакт Arduino Gnd
  • Контакт 5 (питание) => Контакт Arduino 3,3 В
  • Контакт 6 (внимание) => Цифровой контакт 10 Arduino
  • Вывод 7 (часы) => Цифровой вывод 13 Arduino

Шаг 4:Установите Arduino IDE

В этом проекте я использовал Arduino IDE для программирования платы Arduino.

1. Загрузите и установите последнюю версию Arduino IDE

Вы можете найти последнюю версию для Windows, Linux или MAC OSX на веб-сайте Arduino:https://www.arduino.cc/en/main/software

Загрузите его бесплатно, установите на свой компьютер и запустите.

2. Добавление библиотек

В этом проекте я использую библиотеку Arduino PS2X.

Загрузите библиотеку по адресу https://github.com/madsci1016/Arduino-PS2X. Разархивируйте файл и скопируйте папки в папки с библиотеками / инструментами Arduino IDE.

............

Теперь, когда ваша среда разработки готова, перейдем к следующему шагу!

Шаг 5. Описание библиотеки беспроводного контроллера PS2

Беспроводной контроллер PS2 - отличный инструмент для ваших проектов в области робототехники. У него невероятное количество кнопок:20 цифровых кнопок и 2 аналоговых джойстика. Таким образом, вы получаете безграничные возможности управлять своим роботом.

Я использовал библиотеку PS2X Билла Портера (https://github.com/madsci1016/Arduino-PS2X) для подключения контроллера к плате Arduino Uno.

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

  PS2X ps2x;  

После определения объекта его необходимо связать с выводами ввода-вывода Arduino с помощью следующей функции:

  error =ps2x.config_gamepad (часы, команда, внимание, данные, давление?, грохот?);  

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

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

  ps2x.Button (кнопка);  

В какой кнопке это имя кнопки, которую нужно прочитать. Каждая кнопка отображается следующим образом:

Кнопки со стрелками .

  • PSB_PAD_UP =кнопка вверх на крестовине;
  • PSB_PAD_DOWN =кнопка вниз на крестовине;
  • PSB_PAD_LEFT =левая кнопка крестовины
  • PSB_PAD_RIGHT =правая кнопка крестовины

Кнопки действий:

  • PSB_GREEN или PSB_TRIANGLE =кнопка зеленого треугольника
  • PSB_RED или PSB_CIRCLE =кнопка с красным кружком
  • PSB_BLUE или PSB_CROSS =синяя кнопка x
  • PSB_PINK или PSB_SQUARE =​​розовая квадратная кнопка

Триггеры:

  • PSB_L1 =левая кнопка триггера 1
  • PSB_R1 =правая кнопка запуска 1
  • PSB_L2 =левая кнопка запуска 2
  • PSB_R2 =правая кнопка запуска 2

Палки:

  • PSB_L3 =кнопка левого джойстика (да, вы можете нажимать джойстик как кнопку пуша)
  • PSB_R3 =кнопка правого джойстика

Меню:

  • PSB_SELECT =кнопка выбора
  • PSB_START =кнопка запуска

Чтобы прочитать аналоговое значение (с преобразованием в целое число от 0 до 255) стиков, используйте следующий метод:

  ps2x.Analog (stick_axis);  

В котором stick_axis обозначает палку и направление чтения следующим образом:

  • PSS_LY =положение левого джойстика по оси Y
  • PSS_LX =x-позиция левого джойстика
  • PSS_RY =Y-позиция правого джойстика
  • PSS_RX =x-позиция правого джойстика

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

Шаг 6. Набросок №1 - Кнопки Dpad

В старых видеоиграх, таких как SEGA Master System, Mega Drive и Nintendo SNES, не было кнопок, чувствительных к усилию. Кнопки направления были только кнопками включения / выключения. В этом первом примере я хотел имитировать элементы управления, которые использовались бы в старых видеоиграх для этих консолей.

Для этого первого скетча я использовал кнопки Dpad в качестве входов для робота. Каждая кнопка использовалась роботом для выполнения одного из основных движений:движение вперед, поворот вправо, поворот влево или движение назад.

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

Если вы соединили все по моей схеме, у вас будут следующие выходы:

  • PSB_PAD_UP =двигаться вперед
  • PSB_PAD_DOWN =вернуться назад
  • PSB_PAD_LEFT =поверните налево
  • PSB_PAD_RIGHT =поверните направо

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

Код Arduino:

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

Для загрузки кода выберите плату «Arduino / Genuino Uno», выберите правильный COM-порт, подключите плату к USB-порту компьютера и загрузите код.
После завершения загрузки отсоедините USB-кабель и вставьте батареи. Код начнет работать, и плата Arduino автоматически подключит джойстик PS2. Откройте монитор последовательного порта при первом использовании и проверьте состояние соединения. Если не удается подключиться к джойстику, вам следует сделать следующее:

  • Сбросьте плату Arduino Uno. Попробуйте несколько раз (у меня обычно работает после третьего сброса);
  • Убедитесь, что джойстик включен (и с заряженными батареями). На приемнике есть несколько светодиодов, которые укажут, был ли джойстик сопряжен. Также проверьте, мигают ли контакты RX и TX Arduino при получении новых команд (и обновлении статуса последовательного порта);
  • Проверьте соединения ... Возможно, что-то не в порядке с перемычками между компонентами.

Объяснение кода:

В этом проекте мне нужно было использовать только библиотеку PS2X_lib.h. I добавлен в начале кода.

  #include   

Определите контакты Arduino, подключенные к h-мосту. Если вы используете те же подключения, что и я, у вас будет следующая конфигурация. Если вы решите использовать разные контакты, обновите эту часть кода.

  // Они используются для установки направления драйвера моста. #define ENA 3 // ENA #define MOTORA_1 4 // IN3 #define MOTORA_2 5 // IN4 #define MOTORB_1 8 // IN1 #define MOTORB_2 7 // IN2 #define ENB 6 // ENB  

Некоторые глобальные переменные были объявлены до установки ( p2sx , ошибка , тип и вибрировать ). Первый - это экземпляр класса PS2X. Статус ошибки во время подключения будет сохранен в error целое число. Тип и вибрировать будет указывать тип контроллера (контроллер DualShock или GuitarHero) и должен ли он вибрировать при заданной команде.

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

  // Настраиваем выходные контакты pinMode (ENA, OUTPUT); pinMode (MOTORA_1, ВЫХОД); pinMode (MOTORA_2, ВЫХОД); pinMode (ENB, ВЫХОД); pinMode (MOTORB_1, ВЫХОД); pinMode (MOTORB_2, ВЫХОД); // Отключить оба двигателя digitalWrite (ENA, 0); digitalWrite (ENB, 0);  

Затем я начал связь через последовательный порт (полезно для отладки кода). Выберите подходящую скорость передачи и установите ту же скорость на последовательном мониторе.

  // Запускаем последовательную связь Serial.begin (57600);  

Наконец, настройте объект ps2x с контактами Arduino, которые были подключены к приемнику джойстика (часы, команда, внимание и данные соответственно). Он может вернуть ошибку (отображаемую на последовательном мониторе). Также будет отображаться тип контроллера (хотя вы, вероятно, уже знаете, какой тип контроллера сейчас у вас в руках:D).

  error =ps2x.config_gamepad (13,11,10,12, истина, истина); // настройка контактов и настроек:GamePad (часы, команда, внимание, данные, давления ?, Rumble?) проверить на наличие ошибок // Проверить на наличие ошибок if (error ==0) {Serial.println ("Контроллер найден, настроен успешно" ); } else if (error ==1) Serial.println («Контроллер не найден, проверьте проводку или сбросьте Arduino»); else if (error ==2) Serial.println («Контроллер найден, но не принимает команды»); else if (error ==3) Serial.println («Контроллер отказывается войти в режим давления, может не поддерживать его.»); // Проверяем тип контроллера type =ps2x.readType (); переключатель (тип) {case 0:Serial.println ("Неизвестный тип контроллера"); ломать; случай 1:Serial.println («Найден контроллер DualShock»); ломать; случай 2:Serial.println («Найден контроллер GuitarHero»); ломать; }  

Во время основного цикла Arduino будет читать каждую кнопку D-pad (UP, DOWN, LEFT и RIGTH) и устанавливать различные значения для выходных контактов, чтобы перемещать колеса. После небольшой задержки запускается новый цикл.

В следующем разделе показано, как переместить робота вперед, если была нажата кнопка ВВЕРХ. Контакты MOTORA_1 и MOTORA_2 определяют направление вращения двигателя A. ENA определяет, разрешено движение или нет (двигатель ВКЛ / ВЫКЛ). Обратите внимание, что это «аналоговый» выход (фактически, ШИМ). Его значение должно быть в диапазоне от 0 до 1023. Это будет модулировать ШИМ и изменить среднее напряжение на выходе h-brigde (от 0 до 12 В). Если среднее напряжение слишком низкое, двигатель вообще не сможет двигаться.

  // ДВИЖЕНИЕ ВПЕРЕД if (ps2x.Button (PSB_PAD_UP)) {digitalWrite (MOTORA_1, LOW); digitalWrite (MOTORA_2, HIGH); digitalWrite (MOTORB_1, HIGH); digitalWrite (MOTORB_2, LOW); analogWrite (ENB, 1023); analogWrite (ENA, 1023); Serial.println («Двигаться вперед»); }  

* Я использовал выходы PWM для контактов ENA и ENB. Таким образом, 1023 будет представлять импульс с наибольшей длиной (вывод всегда включен), а 0 - отсутствие импульсов (вывод всегда выключен). Если здесь используется другое (меньшее) значение, ожидается, что двигатели будут работать медленнее, поскольку среднее напряжение на их клеммах будет меньше.

Шаг 7. Набросок № 2 - Аналоговый джойстик и цифровые кнопки (L2 и R2)

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

В этом втором примере я хотел использовать аналоговый переключатель для управления танком и пару кнопок для управления дроссельной заслонкой и тормозом / реверсом. Такая конфигурация очень популярна во многих гоночных играх, например, в Mario Kart. Нажмите кнопку R2 для ускорения танка, L2 для заднего хода и установите направление движения на основе положения x левого джойстика.

Роботизированный комплект, который я использовал, не обладает большой инерцией (если напряжение на двигателях установлено на 0 В, они некоторое время не будут двигаться). Таким образом, не нужно было определять команду для торможения робота.

Большая часть кода уже была объяснена на предыдущем шаге. Одно отличие состоит в том, что я определил две переменные, в которых хранится скорость каждого двигателя (от 0 до 1023).

  int motor_right_speed =0; 
int motor_left_speed =0;

В основном цикле Arduino считывает x-позицию левого джойстика. Он получит значение от 0 до 255 и отобразит его между -1023 и 1023.

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

  int nJoyL =ps2x.Analog (PSS_LX); // читать левый джойстик nJoyL =map (nJoyL, 0, 255, 1023, -1023); motor_right_speed =1023; motor_left_speed =1023; если (nJoyL <0) {motor_right_speed =motor_right_speed + nJoyL; } если (nJoyL> 0) {motor_left_speed =motor_left_speed - nJoyL; }  

Если нажать кнопку R2, танк двинется вперед. Таким образом, Arduino устанавливает соответствующие значения для выводов двигателя. ENA и ENB создают «аналоговые» выходы для каждого двигателя со значением, пропорциональным желаемой скорости для каждого двигателя (на основе положения x левого джойстика).

L2 сделает что-то подобное, но изменит направление вращения двигателя на противоположное.

  if (ps2x.Button (PSB_R2)) {digitalWrite (MOTORA_1, LOW); digitalWrite (MOTORA_2, HIGH); digitalWrite (MOTORB_1, HIGH); digitalWrite (MOTORB_2, LOW); analogWrite (ENA, motor_right_speed); analogWrite (ENB, motor_left_speed); } если (ps2x.Button (PSB_L2)) {digitalWrite (MOTORA_1, HIGH); digitalWrite (MOTORA_2, LOW); digitalWrite (MOTORB_1, LOW); digitalWrite (MOTORB_2, HIGH); analogWrite (ENA, motor_right_speed); analogWrite (ENB, motor_left_speed); } если (! ps2x.Button (PSB_L2) ​​&&! ps2x.Button (PSB_R2)) {analogWrite (ENA, 0); analogWrite (ENB, 0); }  

Если ни одна из кнопок не была нажата, двигатели будут отключены.

Шаг 8:эскиз №3 - левый и правый аналоговые джойстики (дифференциальный привод)

Это мой любимый способ управления танком (хотя и не оптимальный по ресурсам)! Это заставляет меня чувствовать, что я обеими руками управляю настоящей большой машиной!

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

Код почти такой же, как описано ранее. Но на этот раз я хотел прочитать y-позицию обоих стиков:

  int nJoyL =ps2x.Analog (PSS_LY); // читать левый джойстик int nJoyR =ps2x.Analog (PSS_RY); // чтение правого джойстика nJoyL =map (nJoyL, 0, 255, 1023, -1023); nJoyR =карта (nJoyR, 0, 255, -1023, 1023);  

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

Я использовал фиксированное значение для включения (1023), но я бы использовал значение переменной, основанное на фактическом значении аналогового джойстика. Я определил зону нечувствительности (+ -50), в которой микроконтроллер отключит двигатели.

  // Выполняем движения на основе обоих аналоговых джойстиков if (nJoyR> 50) {digitalWrite (MOTORA_1, HIGH); digitalWrite (MOTORA_2, LOW); analogWrite (ENA, 1023); } если (nJoyR <-50) {digitalWrite (MOTORA_1, LOW); digitalWrite (MOTORA_2, HIGH); analogWrite (ENA, 1023); } если (abs (nJoyR) <50) {analogWrite (ENA, 0); }  

Шаг 9:эскиз №4 - только левый аналоговый джойстик

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

Скорость каждого трека определяется в зависимости от положений x и y джойстика. Таким образом, можно применять разные скорости на каждом треке и перемещать робота с разными скоростями / направлениями. Используемый здесь код был получен из следующего руководства. Проверьте это!

https://www.impulseadventure.com/elec/robot-differential-steering.html

Шаг 10:Заключительные замечания

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

Если вы все еще не следуете моим руководствам, взгляните на эти другие руководства по робототехнике! Надеюсь, они вам нравятся!

https://www.hackster.io/igorF2/joy-robot-robo-da-alegria-bba54f

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09

https://www.hackster.io/igorF2/nunchuk-controlled-robotic-arm-with-arduino-b1c0fa

https://www.hackster.io/igorF2/wi-fi-browser-controlled-robotic-arm-89b63d

Пожалуйста, подумайте о поддержке моих будущих проектов небольшим пожертвованием в биткойнах! :D

Адрес депозита BTC:1FiWFYSjRaL7sLdr5wr6h86QkMA6pQxkXJ

Код

  • Набросок №1
  • Набросок №2
  • Набросок №3
  • Набросок №4
Эскиз №1 Arduino
 // Танк PS2 от Игоря Фонсека @ 2019 // Управляет роботизированным танком с помощью джойстика PS2, используя кнопки D-pad // на основе примера с использованием библиотеки PS2X от Билла Портера 2011 // Весь текст выше должен быть включен при любом распространении. // включают библиотеки # include  // Они используются для установки направления драйвера моста. #define ENA 3 // ENA # define MOTORA_1 4 // IN3 #define MOTORA_2 5 // IN4 #define MOTORB_1 8 // IN1 # define MOTORB_2 7 // IN2 # define ENB 6 // ENBPS2X ps2x; // создать класс контроллера PS2 // прямо сейчас библиотека НЕ ​​поддерживает контроллеры с возможностью «горячего» подключения, это означает, // что вы всегда должны либо перезапускать Arduino после подключения контроллера, // либо снова вызывать config_gamepad (контакты) после подключения контроллера. int error =0; byte type =0; byte vibrate =0; void setup () {// Настроить выходные контакты pinMode (ENA, OUTPUT); pinMode (MOTORA_1, ВЫХОД); pinMode (MOTORA_2, ВЫХОД); pinMode (ENB, ВЫХОД); pinMode (MOTORB_1, ВЫХОД); pinMode (MOTORB_2, ВЫХОД); // Отключить оба двигателя digitalWrite (ENA, 0); digitalWrite (ENB, 0); // Запуск последовательной связи Serial.begin (57600); error =ps2x.config_gamepad (13,11,10,12, правда, правда); // настройка контактов и настроек:GamePad (часы, команда, внимание, данные, давления ?, Rumble?) проверить на наличие ошибок // Проверить на наличие ошибок if (error ==0) {Serial.println ("Контроллер найден, настроен успешно" ); } else if (error ==1) Serial.println («Контроллер не найден, проверьте проводку или сбросьте Arduino»); else if (error ==2) Serial.println («Контроллер найден, но не принимает команды»); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); ломать; case 1:Serial.println("DualShock Controller Found"); ломать; case 2:Serial.println("GuitarHero Controller Found"); ломать; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller // Perform movements based on D-pad buttons // MOVE FORWARD if(ps2x.Button(PSB_PAD_UP)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Move forward"); } // TURN RIGHT if(ps2x.Button(PSB_PAD_RIGHT)){ digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println («Поверните направо»); } // TURN LEFT if(ps2x.Button(PSB_PAD_LEFT)){ digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println («Поверните налево»); } // MOVE BACK if(ps2x.Button(PSB_PAD_DOWN)){ digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Move back"); } if (!ps2x.Button(PSB_PAD_DOWN) &&!ps2x.Button(PSB_PAD_UP) &&!ps2x.Button(PSB_PAD_RIGHT) &&!ps2x.Button(PSB_PAD_LEFT)) { analogWrite(ENB, 0); analogWrite(ENA, 0); } задержка (50); }} 
Sketch #2Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using D-pad buttons// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include // These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBint motor_right_speed =0;int motor_left_speed =0;PS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); ломать; case 1:Serial.println("DualShock Controller Found"); ломать; case 2:Serial.println("GuitarHero Controller Found"); ломать; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyL =ps2x.Analog(PSS_LX); // read left stick nJoyL =map(nJoyL, 0, 255, 1023, -1023); int motor_right_speed =1023; int motor_left_speed =1023; if (nJoyL <0) { motor_right_speed =motor_right_speed + nJoyL; } if (nJoyL> 0) { motor_left_speed =motor_left_speed - nJoyL; } if(ps2x.Button(PSB_R2)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(ps2x.Button(PSB_L2)) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(!ps2x.Button(PSB_L2) &&!ps2x.Button(PSB_R2)) { analogWrite(ENA, 0); analogWrite(ENB, 0); } задержка (50); }} 
Sketch #3Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using D-pad buttons// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include // These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBPS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); ломать; case 1:Serial.println("DualShock Controller Found"); ломать; case 2:Serial.println("GuitarHero Controller Found"); ломать; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyL =ps2x.Analog(PSS_LY); // read left stick int nJoyR =ps2x.Analog(PSS_RY); // read right stick nJoyL =map(nJoyL, 0, 255, 1023, -1023); nJoyR =map(nJoyR, 0, 255, -1023, 1023); // Perform movements based on both analog sticks if(nJoyR>50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); analogWrite(ENA, 1023); } if(nJoyR<-50) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); analogWrite(ENA, 1023); } if (abs(nJoyR)<50) { analogWrite(ENA, 0); } if(nJoyL>50) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); } if(nJoyL<-50) { digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); } if (abs(nJoyL)<50) { analogWrite(ENB, 0); } задержка (50); }} 
Sketch #4Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using left analog stick// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include  //for v1.6// These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBint motor_right_speed =0;int motor_left_speed =0;PS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); ломать; case 1:Serial.println("DualShock Controller Found"); ломать; case 2:Serial.println("GuitarHero Controller Found"); ломать; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyX =ps2x.Analog(PSS_LX); // read x-joystick int nJoyY =ps2x.Analog(PSS_LY); // read y-joystick nJoyX =map(nJoyX, 0, 255, -1023, 1023); nJoyY =map(nJoyY, 0, 255, 1023, -1023); // OUTPUTS int nMotMixL; // Motor (left) mixed output int nMotMixR; // Motor (right) mixed output // CONFIG // - fPivYLimt :The threshold at which the pivot action starts // This threshold is measured in units on the Y-axis // away from the X-axis (Y=0). A greater value will assign // more of the joystick's range to pivot actions. // Allowable range:(0..+127) float fPivYLimit =1023.0; // TEMP VARIABLES float nMotPremixL; // Motor (left) premixed output float nMotPremixR; // Motor (right) premixed output int nPivSpeed; // Pivot Speed float fPivScale; // Balance scale between drive and pivot // Calculate Drive Turn output due to Joystick X input if (nJoyY>=0) { // Forward nMotPremixL =(nJoyX>=0)? 1023.0 :(1023.0 + nJoyX); nMotPremixR =(nJoyX>=0)? (1023.0 - nJoyX) :1023.0; } else { // Reverse nMotPremixL =(nJoyX>=0)? (1023.0 - nJoyX) :1023.0; nMotPremixR =(nJoyX>=0)? 1023.0 :(1023.0 + nJoyX); } // Scale Drive output due to Joystick Y input (throttle) nMotPremixL =nMotPremixL * nJoyY/1023.0; nMotPremixR =nMotPremixR * nJoyY/1023.0; // Now calculate pivot amount // - Strength of pivot (nPivSpeed) based on Joystick X input // - Blending of pivot vs drive (fPivScale) based on Joystick Y input nPivSpeed =nJoyX; fPivScale =(abs(nJoyY)>fPivYLimit)? 0.0 :(1.0 - abs(nJoyY)/fPivYLimit); // Calculate final mix of Drive and Pivot nMotMixL =(1.0-fPivScale)*nMotPremixL + fPivScale*( nPivSpeed); nMotMixR =(1.0-fPivScale)*nMotPremixR + fPivScale*(-nPivSpeed); motor_left_speed =nMotMixL; motor_right_speed =nMotMixR; if (motor_right_speed> 50) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else if (motor_right_speed <-50) { digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2, HIGH); } else { digitalWrite(MOTORB_1, LOW); digitalWrite(MOTORB_2, LOW); } if (motor_left_speed> 50) { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, HIGH); } else if (motor_left_speed <-50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); } else { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, LOW); } analogWrite(ENA, abs(motor_left_speed)); analogWrite(ENB, abs(motor_right_speed)); if (abs(motor_left_speed> 50) || abs(motor_left_speed> 50)) { Serial.println("Moving!"); } задержка (50); }} 

Схема


Производственный процесс

  1. Создайте своего робота для видеостриминга, управляемого через Интернет, с помощью Arduino и Raspberry Pi
  2. Unopad - MIDI-контроллер Arduino с Ableton
  3. Робот с сервомотором избегает препятствий
  4. Управление роботом Roomba с помощью Arduino и устройства Android
  5. Роботизированная рука, управляемая нунчук (с Arduino)
  6. Arduino Nano:управление двумя шаговыми двигателями с помощью джойстика
  7. Джойстик Arduino
  8. Создание боевого бота, управляемого с помощью контроллера PS2
  9. Управление манипулятором Arduino с помощью приложения для Android
  10. Создайте робота для еды с Arduino Nano | Золотой винт