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

Робот на колесах Arduino Mecanum

<основной класс="главный сайт" id="главный">

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

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

Обзор

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

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

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

3D-модель робота Mecanum Wheels

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

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

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

Загрузите 3D-модель сборки с Thangs.

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

Как работают колеса Mecanum

Колесо Mecanum представляет собой колесо с роликами, прикрепленными к его окружности. Эти ролики расположены по диагонали или под углом 45 градусов к оси вращения колеса. Это заставляет колесо прилагать усилие в диагональном направлении при движении вперед или назад.

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

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

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

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

Создание робота Mecanum Wheels

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

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

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

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

Я напечатал все детали колес Mecanum на 3D-принтере Creality CR-10.

Вот ссылка на этот 3D-принтер на случай, если вы захотите его проверить.

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

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

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

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

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

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

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

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

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

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

Схема цепи

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

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

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

Вы можете получить компоненты, необходимые для этого проекта, по ссылкам ниже:

Дизайн печатной платы

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

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

Гербер-файл:

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

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

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

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

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

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

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

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

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

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

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

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

Код робота Mecanum Wheels для 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: http://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 для управления шаговыми двигателями. Сначала нам нужно определить выводы, к которым все они подключены, определить некоторые переменные, необходимые для программы ниже, и в разделе настройки установить максимальную скорость степперов и начать радиосвязь.

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

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

Для выполнения этих команд в секции цикла нам нужно вызвать функции runSpeed() для всех степперов. В секции цикла мы также считываем аналоговый вход с делителя напряжения, поступающего от батареи, и в соответствии с этим значением мы можем узнать, когда напряжение батареи упадет ниже 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: http://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)

Description: The other code for controlling the robot using the Android application, is very similar and works the same way. Here instead of the radio module we need to define the Bluetooth module and initialize its communication in the setup section. So again, first we read the incoming data from the smartphone or the Android app, and according to it, tell the robot in which direction to move.

If we take a look at the Android app we can see that it simply sends numbers from 0 to 15 through the Bluetooth when the buttons are pressed.

The app is made using the MIT App Inventor online application and you can find more details about it in my particular tutorial for it.

Here you can download this app as well as the editable project file:

For programming the automatic robot movement with this app, when we press the “SAVE” button we simply store the current positions of the stepper motors into arrays. Then when we press the “RUN” button, we call the runSteps() custom function which executes or runs through all stored steps using some for and while loops.

I hope you enjoyed this tutorial and learned something new. Feel free to ask any question in the comments section below and check my Arduino Projects Collection.


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

  1. Робот Raspberry Pi, управляемый через Bluetooth
  2. Робот с сервомотором избегает препятствий
  3. Робот-последователь линии
  4. Робот, управляемый речью
  5. Робот-пианино, управляемый Arduino:PiBot
  6. Littlearm 2C:создание напечатанной на 3D-принтере руки робота Arduino
  7. Автономный домашний робот-помощник
  8. Управление манипулятором Arduino с помощью приложения для Android
  9. Робот для супер-крутой навигации внутри помещений
  10. WiDC:управляемый Wi-Fi робот FPV