Реклама

понедельник, 12 августа 2013 г.

DIY-Bot - Робот своими руками


   Эта статья открывает цикл, который будет посвящен разработке робота в домашних условиях. По мере продвижения, я буду пополнять блог результатами своих экспериментов и практическими реализациями. Финальная цель проекта — эксперименты с системой принятия решений на основе нейронных сетей. Но до этого еще далеко. Сегодня же мы соберем основные необходимые детали. И заставим наше творение безумно метаться по комнате.

   Что же из себя будет представлять наш DIY-Bot? Рассмотрим основные архитектурные блоки.


   Основа робота — это четырехколесная платформа со всеми ведущими колесами и с «танковым» типом разворота. Для работы в закрытом в помещении такого типа движителя будет более чем достаточно. Для получения данных с датчиков и управления моторами робота используется плата Arduino. В свою очередь, Arduino соединен с компьютером либо планшетом (или просто с одноплатным компьютером типа Raspberry Pi) посредством USB. Также не исключается коммуникация с компьютером через радиоканал WiFi, Bluetooth или ZigBee.
   Как указано на диаграмме, Arduino занимается управлением робота на низком уровне (включить левый или правый мотор, принять пакет данных от сенсоров, измерить заряд батареи, передать данные основному компьютеру и т.д.). Основной «мыслительный процесс» будет проходить в основном компьютере, на основе полученных данных из Arduino. Решено было сделать так, из-за слабых вычислительных способностей Arduino. В конце концов, это просто микроконтроллер Atmel с некоторой обвязкой. К основному же компьютеру можно будет подключить камеру для распознавания образов или вообще Kinect. Arduino не справится с таким потоком данных. Я уже не говорю об алгоритмах распознавания образов.

Какими же органами осязания будет обладать наш DIY-Bot? 
    Начнем мы с ультразвукового дальномера (например HC-SR04). Дальномер позволит роботу определять расстояние до препятствия. В дальнейшем, установив дальномер на платформу, которая поворачивается при помощи сервомотора, можно будет реализовать простейший ультразвуковой радар.
Скорее всего, в дальнейшем ультразвуковой дальномер будет заменен на оптический. Что-то типа Sharp GP2Y0A700.
   Далее реализуем «вестибулярный аппарат» робота — акселерометр и гироскоп MPU-6050. Он позволит роботу определять его положение в пространстве а также вектор ускорения. Используя эти данные, робот сможет понять с какой скоростью он движется или на какой угол он повернул.
    Для оценки обстановки вокруг, добавим DIY-Bot-у инфракрасный датчик движения (PIR module). Этот датчик позволяет зафиксировать движение в радиусе до 6 метров. Хотя, я думаю, мы ему чувствительность поубавим. 
    Датчики и сенсоры типа камеры, GPS, Kinect, GSM/GPRS и прочие будем рассматривать по ходу развития проекта.

Итак, вот что мы хотим получить к концу сегодняшнего дня.
   Шасси(3) имеет два мотора - (6)-для правой пары колес(1) и (7)-для левой пары колес(2). В продаже имеются комплекты для сборки. Но их цена колеблется в районе 100$-200$. Как-то дороговато для колесиков с моторчиками... Решение нашлось в детском магазине - «SDL RACING CAR». Радиоуправляемая машина с подходящим шасси обошлась мне в 60$. Как бонус, у меня еще остался радиопередатчик с приемником на 8 команд))). 
   Управлять моторами будет плата Arduino (в моем случае — mega 2560) с шилдом для управления моторами Adafruit motor shield (5).

Начнем!
   Для начала распотрошим купленную RC машину.
 Удаляем блок управления и устанавливаем Arduino с подключенным AF Motor shield

Выглядит это примерно вот так:

  Есть один важный момент. Микросхема L293D, которая управляет двигателями, не рассчитана на высокий ток. Как следствие наблюдаем сильный нагрев L293D и падение тока на выходе. Конечно, лучше подобрать драйвер моторов, который рассчитан на ток для ваших моторов. Но... Как один из вариантов решения проблемы — подключение двух микросхем параллельно.
Негативных последствий для своей схемы я пока не выявил, но греться микросхемы стали меньше и двигатели стали попроворнее.

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

crazy_bot.ino
 #include <AFMotor.h> //Используем библиотеку от Adafruit  
 // Объявляем наши моторы. Левый и правый  
 AF_DCMotor motorL(3);  
 AF_DCMotor motorR(4);  
 long randNumb;//Случайное число, задающее действие  
 void setup() {  
  // Инициализация моторов  
  motorL.setSpeed(200);  
  motorL.run(RELEASE);  
  motorR.setSpeed(200);  
  motorR.run(RELEASE);  
 }  
 // Основной цикл. Генерируем число от 0 до 3, и в зависимости от него едем или поворачиваем  
 void loop() {  
  randNumb = random(0, 4);  
  switch (randNumb) {  
   case 0:  
    forward();  
    break;  
   case 1:  
    backward();  
    break;  
   case 2:  
    left();  
    break;  
   case 3:  
    right();  
    break;  
  }  
  rel();  
  delay(1000);    
 }  
 void backward(){  
  motorL.run(FORWARD);  
  motorR.run(BACKWARD);  
  motorL.setSpeed(200);   
  motorR.setSpeed(200);   
 // Serial.println("Forward!");  
  delay(500);   
 }  
 void left(){  
  motorL.run(BACKWARD);  
  motorR.run(BACKWARD);  
  motorL.setSpeed(255);   
  motorR.setSpeed(255);   
 // Serial.println("Left!");  
  delay(500);  
 }  
 void right(){  
  motorL.run(FORWARD);  
  motorR.run(FORWARD);  
  motorL.setSpeed(255);   
  motorR.setSpeed(255);   
 // Serial.println("Right!");  
  delay(500);  
 }  
 void forward(){  
  motorL.run(BACKWARD);  
  motorR.run(FORWARD);  
  motorL.setSpeed(200);   
  motorR.setSpeed(200);   
 // Serial.println("Forward!");  
  delay(500);   
 }  
 void rel(){  
  motorL.run(RELEASE);  
  motorR.run(RELEASE);  
 }  

Заливаем прошивку в Arduino и пробуем:

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

Комментариев нет:

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