Пятница, 03 августа 2018 16:42

Робот Arduino с возможностью сканирования используя Unity 3D.

Оцените материал
(2 голосов)

В этом проекте мы соберём робота на Arduino, работающий с MCU ESP-8266 Node, который обменивается данными с мобильным телефоном (и может передвигаться внутри помещения). На телефоне работает приложение, созданное на движке видеоигр Unity 3D, которое выполняет 3 вещи:

  • Первая функция позволяет Вам управлять роботом с помощью передачи видеопотока на компьютер. Вы можете использовать клавиши со стрелками, чтобы управлять роботом в любом направлении, видеопоток позволяет Вам продолжать движение, даже когда робот скрыт из виду.
  • Вторая функция позволяет роботу отслеживать все, что вы ставите перед ним. Вы можете щелкнуть по экрану, чтобы инициализировать трекер, а затем робот будет следить за этим объектом.
  • Третья функция позволяет Вам управлять роботом с помощью компьютера используя клавиши со стрелками. Приложение использует SDK дополненной реальности, чтобы найти стены и потолок, которые он отправляет обратно на ваш ноутбук, давая вам цифровое представление о окружающей среде среде.

Шаг 1: Что потребуется.

1. ESP-8266 Node MCU - AliExpress

2. Драйвер двигателя L298N: AliExpress

3. Набор проводов для подключения AliExpress

4. Автомобильная полно приводное шасси AliExpress

Приложение на Unity - https://github.com/MatthewHallberg/AR_Robot или Зеркало - https://github.com/robotoss/AR_Robot

 

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

Сборка робота

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

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

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

У меня есть вторая батарея под моим роботом. Я приклеил горячим клеем usb power bank на нижнею сторону в дополнение к 9-вольтовой батарее для того, чтобы подключить MCU Node отдельно для более продолжительного времени автономной работы во время разработки, но вы можете просто использовать 9-вольтовую батарею, если хотите.

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

 

Шаг 3: Схема подключения.

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

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

Мощность на входе моста до 12В он имеет встроенный регулятор напряжения, который выводит 5В, идеальное напряжения для питания нашего Arduino.

Подключите все согласно приведенной выше схеме.

Убедитесь, что двигатели направлены в одном направлении.

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

 

Шаг 4: Загрузка кода Arduino.

Загрузка кода

#include  
#include 
#include 

int incomingByte = 0;  

int speed = 1023;//0 to 1023

int enA = 16;//d0
int in1 = 5;//d1
int in2 = 4;//d2

int enB = 14;//d5
int in3 = 0;//d3
int in4 = 2;//d4

//wifi stuff
const char* ssid     = "***********************"; // wifi network name
const char* password = "*****************"; // wifi network password

WiFiUDP Udp;
unsigned int localUdpPort = 1998;
char incomingPacket[255];
     
void setup(){
Serial.begin(115200);
delay(10);
Serial.println("Motor test!");

// We start by connecting to a WiFi network
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
}
Serial.println("WiFi connected"); 
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("Starting UDP");
Udp.begin(localUdpPort);  

pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
}
void right()
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);

  analogWrite(enA, speed);

  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);

  analogWrite(enB, speed);
}

void left()
{

  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);

  analogWrite(enA, speed);

  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);

  analogWrite(enB, speed);
}

void forward()
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);

  analogWrite(enA, speed);

  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);

  analogWrite(enB, speed);
}

void backward()
{

  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);

  analogWrite(enA, speed);

  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);

  analogWrite(enB, speed);
}

void stop()
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

void ListenPacketRoutine(){
  //listen for packets
  int packetSize = Udp.parsePacket();
  if (packetSize){
    int len = Udp.read(incomingPacket, 255);
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
    if (incomingPacket[0] == 'f'){
        forward();
    } else if (incomingPacket[0] == 'b'){
        backward();
    } else if (incomingPacket[0] == 'l'){
        left();
    } else if (incomingPacket[0] == 'r'){
        right();
    } else if (incomingPacket[0] == 's'){
        stop();
    }
  }
}

void ListenKeyboardRoutine(){

 if (Serial.available() > 0) {
    incomingByte = Serial.read();
    }
  
 switch(incomingByte)
  {
     case 's': 
      { stop();
       Serial.println("Stop\n"); 
       incomingByte='*';}
      
     break;
     
     case 'f':
     {  forward(); 
       
       Serial.println("Forward\n");
       incomingByte='*';}
     break;
    
      case 'b':  
    {   backward();
       
       Serial.println("Backward\n");
       incomingByte='*';}
     break;
     
     case 'r':
     {  
       right(); 
       Serial.println("Rotate Right\n");
       incomingByte='*';}
     break;

       case 'l':
      { 
       left();    
       Serial.println("Rotate Left\n");
       incomingByte='*';}
     break;       
  }
}

void loop()
{
    ListenPacketRoutine();
    ListenKeyboardRoutine();
}

Отредактируйте код, чтобы использовать имя и пароль вашей Wi-Fi сети. Мы делаем это, чтобы ваш Node MCU мог подключаться к вашей сети WIFI и отправлять пакеты между телефоном и компьютером.

 

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

connect

Все связь здесь выполнена через WIFI, поэтому убедитесь, что ваш телефон и компьютер подключены к одной локальной сети WIFI.

С помощью USB порта подключите 115200 BAUD к компьютеру, откройте последовательный монитор в программе Arduino IDE до 115200 BAUD.

Нажмите «Сброс» на NODE MCU и дождитесь, когда плата подключится к вашей сети. Он отобразит свой IP-адрес.

Скопируйте это адрес в свой буфер обмена, потому что он нам потребуется в нашем приложении Unity.

Пойдите в мой Github скачайте проект, и откройте его в Unity:

https://github.com/MatthewHallberg/AR_Robot или Зеркало - https://github.com/robotoss/AR_Robot

 

Шаг 6: Сцена «Камера».

Сцена Unity 3D камера

Сначала откройте сцену «Камера». Если Вы посмотрите на сценарий сервера ARCamera,  то поймёте что принцип работы в том что берется видео-канал от Vuforia и передает его на компьютер через TCP.

Сцена «контроллера» - это то, что получает видеопоток, а также позволяет использовать клавиши со стрелками для управления роботом. Прежде чем Вы сможете использовать это, убедитесь, что ваш телефон и компьютер подключены к одной и той же сети WIFI. Перейдите в игровой объект videoClient и разместите там IP-адрес вашего телефона. Теперь перейдите на объект игры и введите IP-адрес Node MCU в сценарий отправки сообщения.

Инструкция для запуска сцены не простая, для начала нужно запустить сцену «камеры» на вашем телефоне (мы перейдем к этому позже), а затем, когда она уже запущена, нажмите кнопку воспроизведения на сцене контроллера в редакторе и Вы должны получить контроль над управлением робота. Качество картинки является сверхнизким для производительности, но вы можете изменить его в сценарии сервера сцены «камеры», если хотите.

 

Шаг 6: Сцена «Сопровождение».

Сцена Unity 3D слежение

Следующая сцена – «Сопровождение». Эта сцена использует заданные пользователем объекты Vuforia, поэтому Вы можете создать отслеживаемый объект во время использования, если у него есть достаточное количество точек. В настройках робота следуйте за менеджером, не забудьте указать IP-адрес вашего Node MCU в сценарии отправки сообщения.

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

 

Шаг 6: Сцена «Сканирования».

Сцена Unity 3D Сканирования

Последняя сцена использует ARkit от Apple, потому что я хотел, чтобы робот обнаруживал вертикальные и горизонтальные плоскости (которые Vuforia еще не определяет), поэтому преокт будет работать только на IOS.

Если мы откроем сцену “Сканирования», обязательно измените  IP-адрес своих устройств в сценарий SendMessageBehavior.cs. Этот скрипт отправляет имя, положение, поворот и масштаб сгенерированных плоскостей обратно на ваш компьютер, когда ARkit создает их. Это получает от сцены MapController, где все поверхности будут отображаться на вашем компьютере. Здесь обязательно измените IP-адрес вашего Node MCU в сценарий отправки данных, чтобы вы могли управлять им с помощью клавиш со стрелками.

 

Шаг 7: Установка приложения на телефон.

Установка приложения

Сначала перейдите в file -> build settings -> player settings -> и введите любые данные в bundle identifier. Кроме того, убедитесь, что есть данные в поле для описания использования камеры.

Если вы создаете Android-приложение, перейдите к настройкам и переключите свою платформу на Android, снимите Android TV в настройках сборки. Нажмите на - build and run с подключенным телефоном.

Если вы компилируете для  iPhone или iPad, обязательно загрузите Xcode из магазина приложений. Также зарегистрируйте бесплатную учетную запись разработчика Apple с сайта www.apple.developer.com. Перейдите в файл и нажмите build. Откройте файл, который был создан из Xcode и подключите ваш телефон. Выберите команду разработчиков и нажмите кнопку запуска.

 

Источник

Author

Bender

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

Комментарии (0)

There are no comments posted here yet

Оставьте свой комментарий

  1. Posting comment as a guest. Sign up or login to your account.
Вложения (0 / 3)
Share Your Location

О нас

Основой деятельностью портала является показ и объяснение что представляет собой выражени "Робот", "Робототехника", "Законы робототехники", "Мехатроника", "Искусственный интеллект(ИИ)". 

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