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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Вы можете посмотреть следующее видео или прочитать письменный урок ниже.

Обзор

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Я также сделал возможным управление с помощью смартфона через Bluetooth-соединение. Я сделал собственное Android-приложение, через которое мы можем управлять роботом на колесах Меканум для движения в любом направлении. Также, используя ползунок в приложении, мы можем управлять скоростью движения.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

«Мозгом» этой робот-платформы является плата Arduino Mega, которая управляет каждым колесом индивидуально. Каждое колесо закреплено на шаговом двигателе NEMA 17, и зная тот факт, что шаговые двигатели могут быть точно управляемы, я добавил еще одну крутую функцию в приложении, через которую мы можем запрограммировать робота для автоматического движения. Используя кнопку Save (Сохранить), мы можем сохранять каждую позицию или шаг, а затем робот может автоматически выполнять и повторять эти шаги. С той же кнопкой мы можем поставить автоматическую операцию на паузу, а также сбросить или удалить все шаги, чтобы мы могли сохранить новые.

3D-модель робота на колесах Меканум

Для начала я спроектировал этого робота на колесах Меканум с помощью 3D-моделирования программного обеспечения. Базовая платформа этого робота — это простая коробка, которую я сделаю из МДФ-плит толщиной 8 мм.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Четыре шаговых двигателя закреплены на этой платформе, а колеса Меканум закреплены на валах моторов.

Вы можете найти и скачать эту 3D-модель, а также изучить её в вашем браузере на Thangs.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Скачать сборку 3D-модели с Thangs.

STL файлы для 3D печати:

Как работают колеса Меканум

Колесо Меканум — это колесо с роликами, прикрепленными к его окружности. Эти ролики позиционированы диагонально или под углом 45 градусов к оси вращения колеса. Это заставляет колесо оказывать силу в диагональном направлении при движении вперед или назад.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

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

Изготовление робота на колесах Меканум

Тем не менее, сейчас дайте я покажу вам, как я построил эту робот-платформу. Как я упоминал, для изготовления основы платформы я использую МДФ-плиты толщиной 8 мм. Используя циркулярную пилу, сначала я вырезал все детали в соответствии с размерами 3D-модели.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Далее, используя сверло 3 мм и фрезу Форстнера 25 мм, я сделал отверстия на боковых панелях для крепления шаговых двигателей. Как только я получил детали готовыми, я продолжил их сборку. Я использовал клей для дерева и некоторые винты для их крепления. Самое важное здесь — иметь отверстия для моторов точно сделанными, чтобы все колеса имели равномерный контакт с поверхностью позже.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Конечно, вы также могли бы напечатать эту базовую платформу на 3D-принтере вместо изготовления из МДФ, поэтому я включу 3D-файл её в статье на сайте. Наконец, я распылил базу и её крышку белым цветом.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Далее — колеса Меканум. Как я сказал ранее, эти колеса могут быть немного дорогими для покупки, поэтому я решил спроектировать и напечатать их на 3D-принтере. Колеса сделаны из двух частей, внешней и внутренней стороны, которые закрепляются вместе с некоторыми болтами M4 и гайками. У них по 10 роликов каждое, и валовая муфта, специально спроектированная для шагового двигателя NEMA 17.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство
Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Я напечатал на 3D-принтере все детали для колес Меканум, используя свой 3D-принтер Creality CR-10.

Вот ссылка на этот 3D-принтер, если вы хотите посмотреть.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Я начал сборку колеса Меканум, закрепив две стороны и валовую муфту с помощью четырех болтов M4 и гаек. Длина болтов должна быть 45 мм.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Я повторил этот процесс для всех 10 роликов. На самом деле это легко и даже весело собирать эти колеса. Что важно здесь — ролики должны иметь возможность свободно двигаться.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Хорошо, так что когда колеса готовы, теперь мы можем перейти к сборке всего робота. Сначала нам нужно закрепить шаговые двигатели к базовой платформе. Для их крепления на месте я использовал болты M3 длиной 12 мм.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

На задней стороне базы я сделал отверстие 20 мм для крепления выключателя питания позже, а также отверстие 5 мм для крепления светодиода.

Схема подключения

Теперь мы можем перейти к электронике. Вот полная схема этого проекта.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Так что мы будем управлять четырьмя шаговыми двигателями NEMA 17, используя четыре драйвера шаговых двигателей DRV8825, или также мы могли бы использовать драйверы шаговых двигателей A4988. Для питания шаговых и всего робота мы будем использовать блок питания 12В, и в моем случае я буду использовать 3S Li-Po батарею, которая обеспечивает около 12В. Для радиообмена мы используем модуль NRF24L01, а для Bluetooth-соединения — модуль HC-05 Bluetooth. Я также включил простой делитель напряжения, который будет использоваться для мониторинга напряжения батареи, и соединение светодиода для индикации, когда напряжение батареи упадет ниже 11В.

Я также включил выделенный стабилизатор напряжения 5В, который может обеспечивать около 3А тока. Это опционально, но я планирую в будущем видео объединить этот проект с моим проектом Arduino манипулятора, и для этой цели мне понадобится 5В для управления его сервоприводами.

Компоненты, необходимые для этого проекта, можно найти по ссылкам ниже:

  • Шаговый двигатель – NEMA 17………………
  • Драйвер шагового двигателя DRV8825…………………
  • Трансиверный модуль NRF24L01…….…
  • Bluetooth модуль HC-05 …………….…
  • Li-Po батарея …………………………….……
  • Плата Arduino Mega ………………….…

Проектирование печатной платы

Тем не менее, чтобы сохранить электронные компоненты организованными и избавиться от путаницы с проводками, я спроектировал собственную печатную плату с помощью бесплатного онлайн-инструмента для проектирования схем EasyEDA. Эта печатная плата на самом деле будет действовать как Arduino MEGA shield, потому что мы сможем напрямую подключить её сверху на плату Arduino Mega. Я использовал как верхний, так и нижний слои для прокладки соединений. Для тех выводов Arduino, которые я не использовал, я включил соединения пиновых заголовков, так что они доступны в случае, если мы захотим использовать их для чего-то в будущем. Я также включил соединения 12В, 5В и GND, а также выводы для выбора разрешения шага драйверов.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Вот ссылка на файлы проекта этого дизайна печатной платы. Так что, когда я закончил дизайн, я сгенерировал файл Gerber, необходимый для производства печатной платы.

Файл Gerber:

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Здесь мы можем просто перетащить файл Gerber, и после загрузки мы можем просмотреть нашу печатную плату в просмотрщике Gerber. Если всё в порядке, то мы можем продолжить и выбрать свойства, которые мы хотим для нашей печатной платы. На этот раз я выбрал цвет печатной платы синим, чтобы он соответствовал цвету платы Arduino. И это всё, теперь мы можем просто заказать нашу печатную плату по разумной цене. Обратите внимание, что если это ваш первый заказ у JLCPCB, вы можете получить до 10 печатных плат всего за $2.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Через несколько дней печатные платы пришли. Качество печатных плат отлично, и всё в точности соответствует дизайну.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Сборка печатной платы

Хорошо, сейчас мы можем перейти к сборке печатной платы. Я начал с пайки меньших компонентов сначала, резисторов и конденсаторов. Затем я вставил и припаял male пиновые заголовки к печатной плате, которые будут использоваться для подключения её к плате Arduino.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

И это всё, печатная плата теперь готова, и мы можем перейти к установке драйверов и подключению моторов к ней. Сначала я установил перемычки для выбора разрешения шага. Я выбрал 1/16 шага, соединив выводы MS3 драйверов с 5В.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Затем поверх них я разместил драйверы DRV8825, а также подключил модуль NRF24L01 и модуль HC-05 Bluetooth. Теперь мы можем просто присоединить печатную плату к плате Arduino.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Далее я подключил батарею к соответствующему клеммнику и поместил их в базовую платформу.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Код Arduino для робота на колесах Меканум

Что осталось для этого видео — это взглянуть на код Arduino. На самом деле, есть два отдельных кода Arduino. Один для управления роботом с использованием модулей NRF24L01, а другой для управления роботом с использованием смартфона.

Код Arduino для управления роботом с использованием модулей NRF24L01:

/* === Arduino Mecanum Wheels Robot === Radio control with NRF24L01 by Dejan, www.HowToMechatronics.com Libraries: RF24, https://github.com/tmrh20/RF24/ AccelStepper by Mike McCauley: https://www.airspayce.com/mikem/arduino/AccelStepper/index.html */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <AccelStepper.h> RF24 radio(48, 49); // nRF24L01 (CE, CSN) const byte address[6] = "00001"; unsigned long lastReceiveTime = 0; unsigned long currentTime = 0; // Define the stepper motors and the pins the will use AccelStepper LeftBackWheel(1, 42, 43); // (Type:driver, STEP, DIR) - Stepper1 AccelStepper LeftFrontWheel(1, 40, 41); // Stepper2 AccelStepper RightBackWheel(1, 44, 45); // Stepper3 AccelStepper RightFrontWheel(1, 46, 47); // Stepper4 int wheelSpeed = 1500; // Max size of this struct is 32 bytes - NRF24L01 buffer limit struct Data_Package { byte j1PotX; byte j1PotY; byte j1Button; byte j2PotX; byte j2PotY; byte j2Button; byte pot1; byte pot2; byte tSwitch1; byte tSwitch2; byte button1; byte button2; byte button3; byte button4; }; Data_Package data; //Create a variable with the above structure void setup() { // Set initial seed values for the steppers LeftFrontWheel.setMaxSpeed(3000); LeftBackWheel.setMaxSpeed(3000); RightFrontWheel.setMaxSpeed(3000); RightBackWheel.setMaxSpeed(3000); radio.begin(); radio.openReadingPipe(0, address); radio.setAutoAck(false); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_LOW); radio.startListening(); // Set the module as receiver Serial.begin(115200); } void loop() { // Check whether we keep receving data, or we have a connection between the two modules currentTime = millis(); if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function } // Check whether there is data to be received if (radio.available()) { radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure lastReceiveTime = millis(); // At this moment we have received the data } // Set speed - left potentiometer wheelSpeed = map(data.pot1, 0, 255, 100, 3000); if (data.j1PotX > 150) { moveSidewaysLeft(); } else if (data.j1PotX < 100) { moveSidewaysRight(); } else if (data.j1PotY > 160) { moveForward(); } else if (data.j1PotY < 100) { moveBackward(); } else if (data.j2PotX < 100 & data.j2PotY > 160) { moveRightForward(); } else if (data.j2PotX > 160 & data.j2PotY > 160) { moveLeftForward(); } else if (data.j2PotX < 100 & data.j2PotY < 100) { moveRightBackward(); } else if (data.j2PotX > 160 & data.j2PotY < 100) { moveLeftBackward(); } else if (data.j2PotX < 100) { rotateRight(); } else if (data.j2PotX > 150) { rotateLeft(); } else { stopMoving(); } // Execute the steps LeftFrontWheel.runSpeed(); LeftBackWheel.runSpeed(); RightFrontWheel.runSpeed(); RightBackWheel.runSpeed(); // Monitor the battery voltage int sensorValue = analogRead(A0); float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i // If voltage is below 11V turn on the LED if (voltage < 11) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } } void moveForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveSidewaysRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveSidewaysLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void rotateLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void rotateRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveRightForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(wheelSpeed); } void moveRightBackward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftForward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(-wheelSpeed); } void stopMoving() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(0); } void resetData() { // Reset the values when there is no radio connection - Set initial default values data.j1PotX = 127; data.j1PotY = 127; data.j2PotX = 127; data.j2PotY = 127; data.j1Button = 1; data.j2Button = 1; data.pot1 = 1; data.pot2 = 1; data.tSwitch1 = 1; data.tSwitch2 = 1; data.button1 = 1; data.button2 = 1; data.button3 = 1; data.button4 = 1; }Code language: Arduino (arduino)

Описание: Так, здесь мы используем библиотеку RF24 для радиообмена и библиотеку AccelStepper для управления шаговыми двигателями. Сначала нам нужно определить выводы, к которым все они подключены, определить некоторые переменные, необходимые для программы ниже, и в разделе setup установить максимальную скорость шаговых и начать радиообмен.

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

Так что в зависимости от полученных данных, например, если левый джойстик сдвинут вперед, его значение будет больше 160, и в таком случае будет вызвана пользовательская функция moveForward(). Если мы взглянем на эту функцию, мы увидим, что все, что она делает, — это устанавливает скорость моторов в положительную. Для движения назад скорость устанавливается в отрицательную. Так что для движения во всех остальных направлениях нам просто нужно установить вращение колес соответствующим образом, как объяснено в начале.

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

Код Arduino для управления роботом с использованием смартфона:

/* === Arduino Mecanum Wheels Robot === Smartphone control via Bluetooth by Dejan, www.HowToMechatronics.com Libraries: RF24, https://github.com/tmrh20/RF24/ AccelStepper by Mike McCauley: https://www.airspayce.com/mikem/arduino/AccelStepper/index.html */ #include <SoftwareSerial.h> #include <AccelStepper.h> SoftwareSerial Bluetooth(A8, 38); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX) // Define the stepper motors and the pins the will use AccelStepper LeftBackWheel(1, 42, 43); // (Type:driver, STEP, DIR) - Stepper1 AccelStepper LeftFrontWheel(1, 40, 41); // Stepper2 AccelStepper RightBackWheel(1, 44, 45); // Stepper3 AccelStepper RightFrontWheel(1, 46, 47); // Stepper4 #define led 14 int wheelSpeed = 1500; int dataIn, m; int lbw[50], lfw[50], rbw[50], rfw[50]; // for storing positions/steps int index = 0; void setup() { // Set initial seed values for the steppers LeftFrontWheel.setMaxSpeed(3000); LeftBackWheel.setMaxSpeed(3000); RightFrontWheel.setMaxSpeed(3000); RightBackWheel.setMaxSpeed(3000); Serial.begin(38400); Bluetooth.begin(38400); // Default baud rate of the Bluetooth module Bluetooth.setTimeout(1); delay(20); pinMode(led, OUTPUT); } void loop() { // Check for incoming data if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); // Read the data if (dataIn == 0) { m = 0; } if (dataIn == 1) { m = 1; } if (dataIn == 2) { m = 2; } if (dataIn == 3) { m = 3; } if (dataIn == 4) { m = 4; } if (dataIn == 5) { m = 5; } if (dataIn == 6) { m = 6; } if (dataIn == 7) { m = 7; } if (dataIn == 8) { m = 8; } if (dataIn == 9) { m = 9; } if (dataIn == 10) { m = 10; } if (dataIn == 11) { m = 11; } if (dataIn == 12) { m = 12; } if (dataIn == 14) { m = 14; } // Set speed if (dataIn >= 16) { wheelSpeed = dataIn * 10; Serial.println(wheelSpeed); } } if (m == 4) { moveSidewaysLeft(); } if (m == 5) { moveSidewaysRight(); } if (m == 2) { moveForward(); } if (m == 7) { moveBackward(); } if (m == 3) { moveRightForward(); } if (m == 1) { moveLeftForward(); } if (m == 8) { moveRightBackward(); } if (m == 6) { moveLeftBackward(); } if (m == 9) { rotateLeft(); } if (m == 10) { rotateRight(); } if (m == 0) { stopMoving(); } //Serial.println(dataIn); // If button "SAVE" is pressed if (m == 12) { if (index == 0) { LeftBackWheel.setCurrentPosition(0); LeftFrontWheel.setCurrentPosition(0); RightBackWheel.setCurrentPosition(0); RightFrontWheel.setCurrentPosition(0); } lbw[index] = LeftBackWheel.currentPosition(); // save position into the array lfw[index] = LeftFrontWheel.currentPosition(); rbw[index] = RightBackWheel.currentPosition(); rfw[index] = RightFrontWheel.currentPosition(); index++; // Increase the array index m = 0; } if (m == 14) { runSteps(); if (dataIn != 14) { stopMoving(); memset(lbw, 0, sizeof(lbw)); // Clear the array data to 0 memset(lfw, 0, sizeof(lfw)); memset(rbw, 0, sizeof(rbw)); memset(rfw, 0, sizeof(rfw)); index = 0; // Index to 0 } } LeftFrontWheel.runSpeed(); LeftBackWheel.runSpeed(); RightFrontWheel.runSpeed(); RightBackWheel.runSpeed(); // Monitor the battery voltage int sensorValue = analogRead(A0); float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i //Serial.println(voltage); // If voltage is below 11V turn on the LED if (voltage < 11) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } } void runSteps() { for (int i = index - 1; i >= 0; i--) { // Run through all steps(index) LeftFrontWheel.moveTo(lfw[i]); LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.moveTo(lbw[i]); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.moveTo(rfw[i]); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.moveTo(rbw[i]); RightBackWheel.setSpeed(wheelSpeed); while (LeftBackWheel.currentPosition() != lbw[i] & LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) { LeftFrontWheel.runSpeedToPosition(); LeftBackWheel.runSpeedToPosition(); RightFrontWheel.runSpeedToPosition(); RightBackWheel.runSpeedToPosition(); if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.read(); if ( dataIn == 15) { // If button "PAUSE" is pressed while (dataIn != 14) { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); if ( dataIn == 13) { stopMoving(); break; } } } } if (dataIn >= 16) { wheelSpeed = dataIn * 10; dataIn = 14; } if ( dataIn == 13) { break; } } } // Go back through steps for (int i = 1; i <= index - 1; i++) { // Run through all steps(index) LeftFrontWheel.moveTo(lfw[i]); LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.moveTo(lbw[i]); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.moveTo(rfw[i]); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.moveTo(rbw[i]); RightBackWheel.setSpeed(wheelSpeed); while (LeftBackWheel.currentPosition() != lbw[i]& LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) { LeftFrontWheel.runSpeedToPosition(); LeftBackWheel.runSpeedToPosition(); RightFrontWheel.runSpeedToPosition(); RightBackWheel.runSpeedToPosition(); //Serial.print(" current: "); //Serial.println(LeftBackWheel.currentPosition()); if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.read(); if ( dataIn == 15) { // If button "PAUSE" is pressed while (dataIn != 14) { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); if ( dataIn == 13) { stopMoving(); break; } } } } if (dataIn >= 16) { wheelSpeed = dataIn * 10; dataIn = 14; } if ( dataIn == 13) { //Serial.println("DEKI"); break; } } } } } void moveForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveSidewaysRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveSidewaysLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void rotateLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void rotateRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveRightForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(wheelSpeed); } void moveRightBackward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftForward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(-wheelSpeed); } void stopMoving() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(0); }Code language: Arduino (arduino)

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

Если мы посмотрим на Android-приложение, мы увидим, что оно просто отправляет числа от 0 до 15 через Bluetooth при нажатии кнопок.

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

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

Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство

Здесь вы можете скачать это приложение, а также редактируемый файл проекта:

Для программирования автоматического движения робота с этим приложением, когда мы нажимаем кнопку «SAVE», мы просто сохраняем текущие позиции шаговых двигателей в массивы. Затем, когда мы нажимаем кнопку «RUN», мы вызываем пользовательскую функцию runSteps(), которая выполняет или проходит через все сохраненные шаги, используя некоторые циклы for и while.

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


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

  1. Создание Bluetooth-робота на Raspberry Pi с аудио-обратной связью
  2. Робот-ускользатор на сервоприводе: сборка на Arduino и HC-SR04
  3. Автономный линий-следующий робот на Arduino UNO
  4. Голосовой робот на Arduino Nano: Управление речью через Bluetooth
  5. PiBot: Робот-пианист на Arduino для точного исполнения музыки
  6. LittleArm 2C: 3D-печатаемый робот-манипулятор на Arduino для STEM-обучения
  7. Автономный домашний помощник-робот: полный список деталей и руководство по настройке (ROS, Alexa, MoveIt)
  8. Управление манипулятором LittleArm через Android-приложение по Bluetooth
  9. Набор для создания робота с умной внутренней навигацией на базе Arduino
  10. WiDC: Wi‑Fi FPV-робот — дистанционное управление с видео в реальном времени