Создание Arduino робота на колесах Меканум: 360° мобильность — DIY руководство
В этом уроке мы научимся строить Arduino робота на колесах Меканум, который способен двигаться в любом направлении. Эта уникальная подвижность робота достигается за счет использования специального типа колес, называемых колесами Меканум. Вы можете посмотреть следующее видео или прочитать письменный урок ниже. Я на самом деле спроектировал и напечатал на 3D-принтере эти колеса, потому что они могут быть немного дорогими для покупки. Они работают довольно хорошо, и я должен сказать, что управление этой робот-платформой — это такое веселье. Мы можем беспроводно управлять роботом, используя модули радио-трансиверов NRF24L01, или в моем случае я использую свой DIY RC передатчик, который я сделал в одном из предыдущих видео. Я также сделал возможным управление с помощью смартфона через Bluetooth-соединение. Я сделал собственное Android-приложение, через которое мы можем управлять роботом на колесах Меканум для движения в любом направлении. Также, используя ползунок в приложении, мы можем управлять скоростью движения. «Мозгом» этой робот-платформы является плата Arduino Mega, которая управляет каждым колесом индивидуально. Каждое колесо закреплено на шаговом двигателе NEMA 17, и зная тот факт, что шаговые двигатели могут быть точно управляемы, я добавил еще одну крутую функцию в приложении, через которую мы можем запрограммировать робота для автоматического движения. Используя кнопку Save (Сохранить), мы можем сохранять каждую позицию или шаг, а затем робот может автоматически выполнять и повторять эти шаги. С той же кнопкой мы можем поставить автоматическую операцию на паузу, а также сбросить или удалить все шаги, чтобы мы могли сохранить новые. Для начала я спроектировал этого робота на колесах Меканум с помощью 3D-моделирования программного обеспечения. Базовая платформа этого робота — это простая коробка, которую я сделаю из МДФ-плит толщиной 8 мм. Четыре шаговых двигателя закреплены на этой платформе, а колеса Меканум закреплены на валах моторов. Вы можете найти и скачать эту 3D-модель, а также изучить её в вашем браузере на Thangs. Скачать сборку 3D-модели с Thangs. STL файлы для 3D печати: Колесо Меканум — это колесо с роликами, прикрепленными к его окружности. Эти ролики позиционированы диагонально или под углом 45 градусов к оси вращения колеса. Это заставляет колесо оказывать силу в диагональном направлении при движении вперед или назад. Так что, вращая колеса в определенном порядке, мы используем эти диагональные силы, и таким образом робот может двигаться в любом направлении. Мы также должны отметить здесь, что нам нужны два типа колес Меканум, часто называемые левыми и правыми колесами Меканум. Разница между ними — это ориентация роликов, и они должны быть установлены в роботе в специфических местах. Ось вращения верхнего ролика каждого колеса должна указывать в центр робота. Вот быстрая демонстрация того, как робот движется в зависимости от направления вращения колес. Если все четыре колеса движутся вперед, результирующее движение робота будет вперед, и наоборот, если все колеса движутся назад, робот будет двигаться назад. Для движения вправо правые колеса должны вращаться внутрь робота, а левые колеса — наружу робота. Результирующая сила из-за диагонально позиционированных роликов заставит робота двигаться вправо. То же самое, но наоборот, происходит при движении влево. С этими колесами мы также можем достичь движения в диагональном направлении, вращая только два колеса. Тем не менее, сейчас дайте я покажу вам, как я построил эту робот-платформу. Как я упоминал, для изготовления основы платформы я использую МДФ-плиты толщиной 8 мм. Используя циркулярную пилу, сначала я вырезал все детали в соответствии с размерами 3D-модели. Далее, используя сверло 3 мм и фрезу Форстнера 25 мм, я сделал отверстия на боковых панелях для крепления шаговых двигателей. Как только я получил детали готовыми, я продолжил их сборку. Я использовал клей для дерева и некоторые винты для их крепления. Самое важное здесь — иметь отверстия для моторов точно сделанными, чтобы все колеса имели равномерный контакт с поверхностью позже. Конечно, вы также могли бы напечатать эту базовую платформу на 3D-принтере вместо изготовления из МДФ, поэтому я включу 3D-файл её в статье на сайте. Наконец, я распылил базу и её крышку белым цветом. Далее — колеса Меканум. Как я сказал ранее, эти колеса могут быть немного дорогими для покупки, поэтому я решил спроектировать и напечатать их на 3D-принтере. Колеса сделаны из двух частей, внешней и внутренней стороны, которые закрепляются вместе с некоторыми болтами M4 и гайками. У них по 10 роликов каждое, и валовая муфта, специально спроектированная для шагового двигателя NEMA 17. Я напечатал на 3D-принтере все детали для колес Меканум, используя свой 3D-принтер Creality CR-10. Вот ссылка на этот 3D-принтер, если вы хотите посмотреть. Итак, как только я получил 3D-печатаемые детали готовыми, я перешел к изготовлению валов для роликов. Для этой цели я использовал стальную проволоку толщиной 3 мм. Длина валов должна быть около 40 мм, поэтому, используя ротационный инструмент, я отрезал проволоку до этой длины. Я начал сборку колеса Меканум, закрепив две стороны и валовую муфту с помощью четырех болтов M4 и гаек. Длина болтов должна быть 45 мм. Для установки роликов сначала нам нужно слегка вставить вал через отверстия, расположенные на окружности внутренней стороны. Затем мы можем вставить маленькую шайбу M3, вставить ролик и протолкнуть вал полностью в слот внешней стороны колеса. Я использовал одну шайбу, потому что у меня не было достаточно места, чтобы вставить вторую шайбу с другой стороны. Я повторил этот процесс для всех 10 роликов. На самом деле это легко и даже весело собирать эти колеса. Что важно здесь — ролики должны иметь возможность свободно двигаться. В конце я использовал несколько капель цианакрилатного клея в каждом из внутренних отверстий, чтобы убедиться, что валы не ослабнут. Хорошо, так что когда колеса готовы, теперь мы можем перейти к сборке всего робота. Сначала нам нужно закрепить шаговые двигатели к базовой платформе. Для их крепления на месте я использовал болты M3 длиной 12 мм. Далее нам нужно закрепить колеса к валам моторов. Валовая муфта, которую я сделал, имеет слот для вставки гайки M3, через которую может пройти болт M3, и так мы можем закрепить колесо к валу. Далее, для крепления верхней крышки к базе, я закрепил резьбовые стержни на двух углах базы. Я сделал отверстия в тех же позициях на крышке, и так я смог легко вставить и закрепить крышку к базе. На задней стороне базы я сделал отверстие 20 мм для крепления выключателя питания позже, а также отверстие 5 мм для крепления светодиода. Теперь мы можем перейти к электронике. Вот полная схема этого проекта. Так что мы будем управлять четырьмя шаговыми двигателями NEMA 17, используя четыре драйвера шаговых двигателей DRV8825, или также мы могли бы использовать драйверы шаговых двигателей A4988. Для питания шаговых и всего робота мы будем использовать блок питания 12В, и в моем случае я буду использовать 3S Li-Po батарею, которая обеспечивает около 12В. Для радиообмена мы используем модуль NRF24L01, а для Bluetooth-соединения — модуль HC-05 Bluetooth. Я также включил простой делитель напряжения, который будет использоваться для мониторинга напряжения батареи, и соединение светодиода для индикации, когда напряжение батареи упадет ниже 11В. Я также включил выделенный стабилизатор напряжения 5В, который может обеспечивать около 3А тока. Это опционально, но я планирую в будущем видео объединить этот проект с моим проектом Arduino манипулятора, и для этой цели мне понадобится 5В для управления его сервоприводами. Компоненты, необходимые для этого проекта, можно найти по ссылкам ниже: Тем не менее, чтобы сохранить электронные компоненты организованными и избавиться от путаницы с проводками, я спроектировал собственную печатную плату с помощью бесплатного онлайн-инструмента для проектирования схем EasyEDA. Эта печатная плата на самом деле будет действовать как Arduino MEGA shield, потому что мы сможем напрямую подключить её сверху на плату Arduino Mega. Я использовал как верхний, так и нижний слои для прокладки соединений. Для тех выводов Arduino, которые я не использовал, я включил соединения пиновых заголовков, так что они доступны в случае, если мы захотим использовать их для чего-то в будущем. Я также включил соединения 12В, 5В и GND, а также выводы для выбора разрешения шага драйверов. Вот ссылка на файлы проекта этого дизайна печатной платы. Так что, когда я закончил дизайн, я сгенерировал файл Gerber, необходимый для производства печатной платы. Файл Gerber: Затем я заказал печатную плату у JLCPCB, которые также являются спонсорами этого видео. Здесь мы можем просто перетащить файл Gerber, и после загрузки мы можем просмотреть нашу печатную плату в просмотрщике Gerber. Если всё в порядке, то мы можем продолжить и выбрать свойства, которые мы хотим для нашей печатной платы. На этот раз я выбрал цвет печатной платы синим, чтобы он соответствовал цвету платы Arduino. И это всё, теперь мы можем просто заказать нашу печатную плату по разумной цене. Обратите внимание, что если это ваш первый заказ у JLCPCB, вы можете получить до 10 печатных плат всего за $2. Через несколько дней печатные платы пришли. Качество печатных плат отлично, и всё в точности соответствует дизайну. Хорошо, сейчас мы можем перейти к сборке печатной платы. Я начал с пайки меньших компонентов сначала, резисторов и конденсаторов. Затем я вставил и припаял male пиновые заголовки к печатной плате, которые будут использоваться для подключения её к плате Arduino. Далее я разместил все female пиновые заголовки на месте и припаял их тоже. Что касается соединений шаговых двигателей и выводов для выбора разрешения шага, я использовал male пиновые заголовки. Таким образом мы можем напрямую подключить моторы к печатной плате и использовать перемычки для выбора разрешения шага. Затем я припаял клеммники, подстроечный резистор и стабилизатор напряжения. И это всё, печатная плата теперь готова, и мы можем перейти к установке драйверов и подключению моторов к ней. Сначала я установил перемычки для выбора разрешения шага. Я выбрал 1/16 шага, соединив выводы MS3 драйверов с 5В. Затем поверх них я разместил драйверы DRV8825, а также подключил модуль NRF24L01 и модуль HC-05 Bluetooth. Теперь мы можем просто присоединить печатную плату к плате Arduino. Далее я подключил батарею к соответствующему клеммнику и поместил их в базовую платформу. Здесь я вставил выключатель питания на место и подключил его к другому клеммнику. Прямо над выключателем питания я также вставил индикаторный светодиод батареи. Что осталось сейчас — это подключить моторы к печатной плате. Мы должны отметить здесь, что при подключении противоположных моторов мы должны подключить их разъемы тоже противоположно. Это нужно позже при программировании робота, так что, например, команда forward (вперед) двигала бы оба мотора в одном направлении, хотя они на самом деле перевернуты, и один бы делал вращение по часовой стрелке, а другой против часовой стрелки. В конце я могу просто вставить крышку сверху, и так мы закончили с этим проектом робота на колесах Меканум. Что осталось для этого видео — это взглянуть на код Arduino. На самом деле, есть два отдельных кода Arduino. Один для управления роботом с использованием модулей NRF24L01, а другой для управления роботом с использованием смартфона. Код Arduino для управления роботом с использованием модулей NRF24L01: Описание: Так, здесь мы используем библиотеку RF24 для радиообмена и библиотеку AccelStepper для управления шаговыми двигателями. Сначала нам нужно определить выводы, к которым все они подключены, определить некоторые переменные, необходимые для программы ниже, и в разделе setup установить максимальную скорость шаговых и начать радиообмен. В разделе loop мы начинаем с чтения данных, поступающих от RC передатчика. Код RC передатчика, а также больше деталей о том, как работает этот обмен, можно найти в моем конкретном уроке для него. Так что в зависимости от полученных данных, например, если левый джойстик сдвинут вперед, его значение будет больше 160, и в таком случае будет вызвана пользовательская функция moveForward(). Если мы взглянем на эту функцию, мы увидим, что все, что она делает, — это устанавливает скорость моторов в положительную. Для движения назад скорость устанавливается в отрицательную. Так что для движения во всех остальных направлениях нам просто нужно установить вращение колес соответствующим образом, как объяснено в начале. Для выполнения этих команд в разделе loop нам нужно вызвать функции runSpeed() для всех шаговых. В разделе loop мы также считываем аналоговый вход от делителя напряжения, идущего от батареи, и в соответствии с этим значением мы можем знать, когда напряжение батареи упадет ниже 11В, чтобы мы могли включить индикаторный светодиод. Код Arduino для управления роботом с использованием смартфона: Описание: Другой код для управления роботом с использованием Android-приложения очень похож и работает так же. Здесь вместо радио-модуля нам нужно определить Bluetooth-модуль и инициализировать его обмен в разделе setup. Так что снова мы сначала считываем входящие данные от смартфона или Android-приложения и в соответствии с ними говорим роботу, в каком направлении двигаться. Если мы посмотрим на Android-приложение, мы увидим, что оно просто отправляет числа от 0 до 15 через Bluetooth при нажатии кнопок. Приложение создано с помощью онлайн-приложения MIT App Inventor, и вы можете найти больше деталей об этом в моем конкретном уроке для него. Здесь вы можете скачать это приложение, а также редактируемый файл проекта: Для программирования автоматического движения робота с этим приложением, когда мы нажимаем кнопку «SAVE», мы просто сохраняем текущие позиции шаговых двигателей в массивы. Затем, когда мы нажимаем кнопку «RUN», мы вызываем пользовательскую функцию runSteps(), которая выполняет или проходит через все сохраненные шаги, используя некоторые циклы for и while. Надеюсь, вам понравился этот урок, и вы узнали что-то новое. Не стесняйтесь задавать любые вопросы в разделе комментариев ниже и проверяйте мою коллекцию проектов Arduino.Обзор


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


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


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















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

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




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








Код Arduino для робота на колесах Меканум
/* === 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)/* === 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)

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