Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Робототехника

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.06.2015, 21:24   #1
Goblin
Junior Member
 
Регистрация: 05.06.2015
Сообщений: 27
Вес репутации: 0
Goblin is an unknown quantity at this point
Smile AirBot Zefir

Всем привет!

Я новичёк в робототехнике, но у меня есть желание, сделать воздушного робота на основе роутера TL-WR703N и прошивки CyberWtr.

За основу взять летательный аппарат Зефир:
https://youtu.be/1DIjHMABM7g

Процесс сборки:
https://youtu.be/K4EO5_E8euQ

Компоненты электроники (то что есть в наличии):
1. KV2200 двигатель + XXD 30A ESC
2. Ardunio NANO CH340
3. Серво SG90 - 2 шт.
4. Usb Hub.
5. Роутер WT3020
6. Webcam Logitech QuickCam E3500

Щас пытаюсь разобраться с управлением сервомоторов.
Скетч:
Код:
#include <CyberLib.h> 
#include <Servo.h> 

Servo leftservo; 
Servo rightservo; 

long previousMillis;
uint8_t LedStep = 0; // Счетчик
int i; 
boolean light_stat;
uint8_t inByte; 


#define init {D4_Out; D5_Out; D6_Out; D7_Out; D8_Out; D11_Out; D12_Out;}  

void setup()   
{  
  leftservo.attach(9); // Подключение сервоприводов к порту 
  rightservo.attach(10); // Подключение сервоприводов к порту 
  init;  // Инициализация портов 
  D11_Low; // Динамик  OFF
  randomSeed(A6_Read); //Получить случайное значение   
  horn(); //звуковое оповещение готовности робота  
  UART_Init(57600);// Инициализация порта для связи с роутером   
   
  leftservo.write(90);  // Повернуть левый серво на 0 градусов
  rightservo.write(90);  // Повернуть правый серво на 0 градусов

}   

void loop()   
{  


  if (UART_ReadByte(inByte)) //Если что то пришло 
  { 
  
  

    switch (inByte)  // Смотрим какая команда пришла 
    {   
        case 'x': // Газ
          gas(); 
        break;  
         
        case 'W': // Движение вниз 
	
          bottom();   
        break;   
         
        case 'D': // Поворотjт влево 
          robot_rotation_left();  
        break; 

        case 'A': // Поворот вправо 
          robot_rotation_right();  
        break;  
         
        case 'S': // Движение назад 
         top();  
        break;  
         
        case 'U': // Камера поднимается вверх
           
        break;  
         
        case 'J': // Камера опускается вниз 
         
        break;  
         
        case 'H': // Камера поворачивается  вправо
        
        break;  
         
        case 'K': // Камера поворачивается влево      
        
        break;  
         
         case 'B': //  Бластер 
         D12_High; 
        break; 
        
        case 'C': // Клаксон 
         horn(); 
        break; 
         
        case 'V': // Включить/Выключить фары 
        if(light_stat)
        {
         D8_Low;
         light_stat=false;
        } else 
              {
               D8_High;
               light_stat=true;
              }
        break; 
    }  
         
  }  

} 

void horn()
{
  for(uint8_t i=0; i<12; i++) beep(70, random(100, 2000));  //звуковое оповещение 
}

void bottom() 
{ 
  leftservo.write(45);  // Повернуть левый серво влево на 45 градусов
  rightservo.write(45);  // Повернуть правый серво влево на 45 градусов
   delay(150);
    leftservo.write(90);  // Повернуть левый серво влево на 45 градусов
  rightservo.write(90);  // Повернуть правый серво влево на 45 градусов
} 

void gas() 
{ 
  leftservo.write(45);  // Повернуть левый серво влево на 45 градусов
  rightservo.write(45);  // Повернуть правый серво влево на 45 градусов
   
} 

void top() 
{ 
 leftservo.write(135);  // Повернуть левый серво влево на 45 градусов
  rightservo.write(135);  // Повернуть правый серво влево на 45 градусов 
    delay(150);
    leftservo.write(90);  // Повернуть левый серво влево на 45 градусов
  rightservo.write(90);  // Повернуть правый серво влево на 45 градусов
} 

void robot_rotation_left() 
{ 
  leftservo.write(45);  // Повернуть левый серво влево на 45 градусов
  rightservo.write(135);  // Повернуть правый серво влево на 45 градусов
   delay(150);
    leftservo.write(90);  // Повернуть левый серво влево на 45 градусов
  rightservo.write(90);  // Повернуть правый серво влево на 45 градусов 
} 

void robot_rotation_right() 
{ 
  leftservo.write(135);  // Повернуть левый серво влево на 45 градусов
  rightservo.write(45);  // Повернуть правый серво влево на 45 градусов
    delay(150);
    leftservo.write(90);  // Повернуть левый серво влево на 45 градусов
  rightservo.write(90);  // Повернуть правый серво влево на 45 градусов
}
На очереди запуск KV2200 двигатель + XXD 30A ESC
http://www.poprobot.ru/home/zapuskbe...rnogodvigatela

Если со всем этим разберусь, то сборка Зефирки и монтажа электроники много времени не займет.

Последний раз редактировалось Goblin; 06.06.2015 в 07:20.
Goblin вне форума   Ответить с цитированием
Старый 05.06.2015, 21:34   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: AirBot Zefir

Радиус действия WiFi слабоват для такого аппарата
Еще будет задержка при передачи команд, видео будет смазанным, так как динамика картинки достаточно высокая
Admin вне форума   Ответить с цитированием
Старый 05.06.2015, 21:42   #3
Goblin
Junior Member
 
Регистрация: 05.06.2015
Сообщений: 27
Вес репутации: 0
Goblin is an unknown quantity at this point
По умолчанию Re: AirBot Zefir

Направленная антена решает эту проблему дальности полета. К примеру с такой антеной http://russian.signalantennas.com/se...00v-89803.html можно увеличить дальность до нескольких км. А вот задержка команд это печально... Можно с этим что-то придумать? Задержка видео не настолько критична.
Goblin вне форума   Ответить с цитированием
Старый 05.06.2015, 22:40   #4
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: AirBot Zefir

Можно попробовать слать команды по telnet или netcat
задержки будут минимальными
Admin вне форума   Ответить с цитированием
Старый 06.06.2015, 05:58   #5
Goblin
Junior Member
 
Регистрация: 05.06.2015
Сообщений: 27
Вес репутации: 0
Goblin is an unknown quantity at this point
По умолчанию Re: AirBot Zefir

Цитата:
Сообщение от Admin Посмотреть сообщение
Можно попробовать слать команды по telnet или netcat
задержки будут минимальными
Спасибо! Покаместь разберусь со стандартными средствами.
Goblin вне форума   Ответить с цитированием
Старый 06.06.2015, 07:23   #6
Goblin
Junior Member
 
Регистрация: 05.06.2015
Сообщений: 27
Вес репутации: 0
Goblin is an unknown quantity at this point
По умолчанию Re: AirBot Zefir

Админ подскажи пож-та, в моем скетче не правильно работают сервы, при подачи команды они почему то крутятся только в 1-ну сторону до 90 градусов.
А вот в этом примере все норм работает:
Код:
/*
Arduino Servo
*/
#include "Servo.h"
Servo servoMain; // Объект Servo
 Servo servoMain1; // Объект Servo
void setup()
{
   servoMain.attach(10); // Servo присоединен к 10 выводу
   servoMain1.attach(9); // Servo присоединен к 10 выводу
}
 
void loop()
{
   servoMain.write(90);  // Центровать серво
    servoMain1.write(90);  // Центровать серво
   delay(150);          // Пауза 0,15 сек.
   servoMain.write(45);  // Повернуть серво влево на 45 градусов
    servoMain1.write(135);  // Повернуть серво вправо на 45 градусов
   delay(150);          // Пауза 0,15 сек.
   servoMain.write(135);  // Повернуть серво вправо на 45 градусов
    servoMain1.write(45);  // Повернуть серво влево на 45 градусов
   delay(150);          //Пауза 0,15 сек.
   servoMain.write(90);  // Центровать серво
   servoMain1.write(90);  //Центровать серво
   delay(150);          // Пауза 0,15 сек.
  
  
}
Или лучше по вашему примеру сделать? http://cyber-place.ru/showthread.php?t=472

Последний раз редактировалось Goblin; 06.06.2015 в 07:55.
Goblin вне форума   Ответить с цитированием
Старый 06.06.2015, 11:01   #7
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: AirBot Zefir

Не понимаю, зачем поварачивать сервы через каждые 150мс
Они не успеют повернуться как придет следующая команда

Весь этот код можно смело упростить на две строчки, которые я привел ниже, от delay лучше отказаться
так как они будут торможить систему оправлением
PHP код:
void loop()
{
   
servoMain.write(90);  // Центровать серво
    
servoMain1.write(90);  // Центровать серво
   
delay(150);          // Пауза 0,15 сек.
   
servoMain.write(45);  // Повернуть серво влево на 45 градусов
    
servoMain1.write(135);  // Повернуть серво вправо на 45 градусов
   
delay(150);          // Пауза 0,15 сек.
   
servoMain.write(135);  // Повернуть серво вправо на 45 градусов
    
servoMain1.write(45);  // Повернуть серво влево на 45 градусов
   
delay(150);          //Пауза 0,15 сек.
   
servoMain.write(90);  // Центровать серво
   
servoMain1.write(90);  //Центровать серво
   
delay(150);          // Пауза 0,15 сек.

PHP код:
void loop()
{
   
servoMain.write(90);  // Центровать серво
   
servoMain1.write(90);  //Центровать серво 

Admin вне форума   Ответить с цитированием
Старый 06.06.2015, 17:25   #8
Goblin
Junior Member
 
Регистрация: 05.06.2015
Сообщений: 27
Вес репутации: 0
Goblin is an unknown quantity at this point
По умолчанию Re: AirBot Zefir

Цитата:
Сообщение от Admin Посмотреть сообщение
Не понимаю, зачем поварачивать сервы через каждые 150мс
Они не успеют повернуться как придет следующая команда

Весь этот код можно смело упростить на две строчки, которые я привел ниже, от delay лучше отказаться
так как они будут торможить систему оправлением
Я имел в виду этот код
PHP код:
#include <CyberLib.h> 
#include <Servo.h> 

Servo leftservo
Servo rightservo

long previousMillis;
uint8_t LedStep 0// Счетчик
int i
boolean light_stat;
uint8_t inByte


#define init {D4_Out; D5_Out; D6_Out; D7_Out; D8_Out; D11_Out; D12_Out;}  

void setup()   
{  
  
leftservo.attach(9); // Подключение сервоприводов к порту 
  
rightservo.attach(10); // Подключение сервоприводов к порту 
  
init;  // Инициализация портов 
  
D11_Low// Динамик  OFF
  
randomSeed(A6_Read); //Получить случайное значение   
  
horn(); //звуковое оповещение готовности робота  
  
UART_Init(57600);// Инициализация порта для связи с роутером   
   
  
leftservo.write(90);  // Повернуть левый серво на 0 градусов
  
rightservo.write(90);  // Повернуть правый серво на 0 градусов

}   

void loop()   
{  


  if (
UART_ReadByte(inByte)) //Если что то пришло 
  

  
  

    switch (
inByte)  // Смотрим какая команда пришла 
    
{   
        case 
'x'// Газ
          
gas(); 
        break;  
         
        case 
'W'// Движение вниз 
    
          
bottom();   
        break;   
         
        case 
'D'// Поворотjт влево 
          
robot_rotation_left();  
        break; 

        case 
'A'// Поворот вправо 
          
robot_rotation_right();  
        break;  
         
        case 
'S'// Движение назад 
         
top();  
        break;  
         
        case 
'U'// Камера поднимается вверх
           
        
break;  
         
        case 
'J'// Камера опускается вниз 
         
        
break;  
         
        case 
'H'// Камера поворачивается  вправо
        
        
break;  
         
        case 
'K'// Камера поворачивается влево      
        
        
break;  
         
         case 
'B'//  Бластер 
         
D12_High
        break; 
        
        case 
'C'// Клаксон 
         
horn(); 
        break; 
         
        case 
'V'// Включить/Выключить фары 
        
if(light_stat)
        {
         
D8_Low;
         
light_stat=false;
        } else 
              {
               
D8_High;
               
light_stat=true;
              }
        break; 
    }  
         
  }  



void horn()
{
  for(
uint8_t i=0i<12i++) beep(70random(1002000));  //звуковое оповещение 
}

void bottom() 

  
leftservo.write(45);  // Повернуть левый серво влево на 45 градусов
  
rightservo.write(45);  // Повернуть правый серво влево на 45 градусов
   
delay(150);
    
leftservo.write(90);  // Повернуть левый серво влево на 45 градусов
  
rightservo.write(90);  // Повернуть правый серво влево на 45 градусов


void gas() 

  
leftservo.write(45);  // Повернуть левый серво влево на 45 градусов
  
rightservo.write(45);  // Повернуть правый серво влево на 45 градусов
   


void top() 

 
leftservo.write(135);  // Повернуть левый серво влево на 45 градусов
  
rightservo.write(135);  // Повернуть правый серво влево на 45 градусов 
    
delay(150);
    
leftservo.write(90);  // Повернуть левый серво влево на 45 градусов
  
rightservo.write(90);  // Повернуть правый серво влево на 45 градусов


void robot_rotation_left() 

  
leftservo.write(45);  // Повернуть левый серво влево на 45 градусов
  
rightservo.write(135);  // Повернуть правый серво влево на 45 градусов
   
delay(150);
    
leftservo.write(90);  // Повернуть левый серво влево на 45 градусов
  
rightservo.write(90);  // Повернуть правый серво влево на 45 градусов 


void robot_rotation_right() 

  
leftservo.write(135);  // Повернуть левый серво влево на 45 градусов
  
rightservo.write(45);  // Повернуть правый серво влево на 45 градусов
    
delay(150);
    
leftservo.write(90);  // Повернуть левый серво влево на 45 градусов
  
rightservo.write(90);  // Повернуть правый серво влево на 45 градусов

А то, что сверху привел как пример проверки сервомоторов.
Щас попробую 2-ой вариант управления сервами.
Goblin вне форума   Ответить с цитированием
Старый 06.06.2015, 17:31   #9
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: AirBot Zefir

Ну так для чего опять теже не нужные две строчки?
Цитата:
leftservo.write(135); // Повернуть левый серво влево на 45 градусов
rightservo.write(45); // Повернуть правый серво влево на 45 градусов
delay(150);
leftservo.write(90); // Повернуть левый серво влево на 45 градусов
rightservo.write(90); // Повернуть правый серво влево на 45 градусов
Admin вне форума   Ответить с цитированием
Старый 07.06.2015, 12:50   #10
Goblin
Junior Member
 
Регистрация: 05.06.2015
Сообщений: 27
Вес репутации: 0
Goblin is an unknown quantity at this point
По умолчанию Re: AirBot Zefir

Цитата:
Сообщение от Admin Посмотреть сообщение
Ну так для чего опять теже не нужные две строчки?
PHP код:
leftservo.write(90); // Повернуть левый серво влево на 45 градусов 
rightservo.write(90); // Повернуть правый серво влево на 45 градусов 
90 градусов как бы начальное положение коромысел, мне нужно к примеру при нажатии на кнопку "A" или "D" смещение коромысел на + или - 45 градусов, одного сервомотора в одну сторону и другого в другую (а они почему то крутятся синхронно, хотя параметры для них заданы разные), а также быстрое возвращение коромысел на начальные 90 градусов, вот для того те 2 ненужные строчки. Пробовал их в loop() добавить, но тоже медленно возвращается на место коромысла. Да и вообще на любые нажатия на клавиатуру, то есть любую клавишу, они начинают крутится и происходит звуковой сигнал. Только что проверил на родном коде тоже самое:
PHP код:
#include <CyberLib.h> 
#include <Servo.h> 

Servo myservo1
Servo myservo2

long previousMillishttp://cyber-place.ru/attachment.php?attachmentid=600&d=1389429469
uint8_t LedStep 0// Счетчик
int i
boolean light_stat;
uint8_t inByte
uint8_t speed=255//максимальная скорость по умолчанию

#define init {D4_Out; D5_Out; D6_Out; D7_Out; D8_Out; D11_Out; D12_Out;}  

void setup()   
{  
  
myservo1.attach(9); // Подключение сервоприводов к порту 
  
myservo2.attach(10); // Подключение сервоприводов к порту 
  
init;  // Инициализация портов 
  
D11_Low// Динамик  OFF
  
randomSeed(A6_Read); //Получить случайное значение   
  
horn(); //звуковое оповещение готовности робота  
  
UART_Init(57600);// Инициализация порта для связи с роутером   
  
wdt_enable (WDTO_500MS);  
}   

void loop()   
{  
    
unsigned long currentMillis millis();
      if (
LedStep == && currentMillis previousMillis 500){ // Задержка 0,5 сек.  
      
previousMillis currentMillis;
      
LedStep 1
    } 

    if (
LedStep == && currentMillis previousMillis 500){ // Задержка 0,5 сек. 
      
previousMillis currentMillis
      
LedStep 2;
    } 

    if (
LedStep == && currentMillis previousMillis 500){ // Задержка 0,5 сек. 
      
LedStep 0
    } 
   
  if (
UART_ReadByte(inByte)) //Если что то пришло 
  

    switch (
inByte)  // Смотрим какая команда пришла 
    
{   
        case 
'x'// Остановка робота 
          
robot_stop(); 
        break;  
         
        case 
'W'// Движение вперед 
          
robot_go();   
        break;   
         
        case 
'D'// Поворотjт влево 
          
robot_rotation_left();  
        break; 

        case 
'A'// Поворот вправо 
          
robot_rotation_right();  
        break;  
         
        case 
'S'// Движение назад 
          
robot_back();  
        break;  
         
        case 
'U'// Камера поднимается вверх
          
myservo1.write(-= 20);   
        break;  
         
        case 
'J'// Камера опускается вниз 
          
myservo1.write(+= 20); 
        break;  
         
        case 
'H'// Камера поворачивается  вправо
         
myservo2.write(+= 20);  
        break;  
         
        case 
'K'// Камера поворачивается влево      
         
myservo2.write(-= 20); 
        break;  
         
         case 
'B'//  Бластер 
         
D12_High
        break; 
        
        case 
'C'// Клаксон 
         
horn(); 
        break; 
         
        case 
'V'// Включить/Выключить фары 
        
if(light_stat)
        {
         
D8_Low;
         
light_stat=false;
        } else 
              {
               
D8_High;
               
light_stat=true;
              }
        break; 
    }  
     if(
inByte>47 && inByte<58speed=(inByte-47)*25+5;  //принимаем команду и преобразуем в скорость         
  
}  
 
wdt_reset(); 


void horn()
{
  for(
uint8_t i=0i<12i++) beep(70random(1002000));  //звуковое оповещение 
}

void robot_go() 

  
D4_Low
  
analogWrite(5speed);  
  
analogWrite(6speed); 
  
D7_Low


void robot_back() 

   
D4_High;  
   
analogWrite(5255-speed);  
   
analogWrite(6255-speed); 
   
D7_High


void robot_stop() 

  
D4_Low;  
  
analogWrite(50);  
  
analogWrite(60); 
  
D7_Low;   


void robot_rotation_left() 

  
D4_Low
  
analogWrite(5speed);  
  
analogWrite(6255-speed);  
  
D7_High


void robot_rotation_right() 

  
D4_High;  
  
analogWrite(5255-speed);  
  
analogWrite(6speed);  
  
D7_Low


Последний раз редактировалось Goblin; 07.06.2015 в 13:04.
Goblin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 10:48. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика