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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.06.2015, 00:07   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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
По умолчанию Модуль "CyberBot-3"

Начиналось с тем:
Как собрать робота
WiFI робот
WiFi робот CyberBot-2

Основные комплектующие к роботу:
Платформа робота
Arduino Nano
Плата контролера робота
Драйвер двигателей
WiFi роутер Nexx wt3020
Инструкция по сборке робота

Рекомендуемая камера Logitech C270



Исправлены все баги и ошибки предыдущих версий. Для уменьшения времени отклика, переработана система управления
Теперь также корректно работает с Arduino Mini подключенным к порту UART роутера
В настройках можно выбирать нужный tty порт
Каждые 5 сек. слева и справа в верхней части экрана, обновляются индикаторы показаний, для примера я их получаю с портов А6 и А7 ардуины. Порты в скетче можно заменить на другие, или вместо показаний портов можно отправлять любые другие данные полученные с любых датчиков и с максимальным значением не более 9999
эти данные можно умножать на любой Ваш коэффициент, который прописывается в настройках в веб интерфейсе

Для работы модуля, в CyberWrt нужно установить модуль "Драйвер Видео" и модуль "Драйвер FTDI"
После установки модуля драйвер FTDI нужно подключить ардуину к USB порту и перезапустить роутер. Поле того как роутер загрузился, настройте драйвер на скорость 57600 и сохраните настройки. В модуле "CyberBot-3" в настройках нужно указать порт к которому подключена Arduino
В модуле драйвера видео выбрать максимальное разрешение и нажать кнопку старт. Если камеры нет то можно драйвер не устанавливать и управлять без камеры

Подключение
Сервва 1 подключается к D12(разъем на плате контроллера)
Сервва 2 подключается к D13(разъем на плате контроллера)
Фары подключаются к D9(к разъему BT на плате контроллера)
Бластер подключаются к D10(к разъему BT на плате контроллера)
Все остальные подключения по старой схеме
Продолжение следует...
PHP код:
#include <CyberLib.h>
#include <Servo.h>

Servo myservo1;  
Servo myservo2
#define step_servo 10 //минимальный угол поворота ссервы за один клик
uint8_t min_pos=10max_pos=170//минимальное и максимаьное положение сервы
int i=130i2=90;  //начальное положение сервы
  
boolean light_stat//состояние фар
uint8_t inBytepackid;  
uint8_t speed=255//максимальная скорость моторов по умолчанию 

#define init {D4_Out; D5_Out; D6_Out; D7_Out; D9_Out; D10_Out; D11_Out;}   //используемые порты

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

void loop()    
{   
 if (
UART_ReadByte(inByte)) 
 { 
 if ( 
packid == 16 // контрольная сумма команды cm=
  
{  
    
packid=0;
    switch (
inByte)  // Смотрим какая команда пришла  
    
{    
        case 
'x'// Остановка робота  
          
robot_stop();  
        break;   
          
        case 
'W'// Движение вперед  
          
robot_go();    
        break;    
          
        case 
'D'// Поворот вправо  
          
robot_rotation_left();   
        break;  

        case 
'A'// Поворот влево   
          
robot_rotation_right();   
        break;   
          
        case 
'S'// Движение назад  
          
robot_back();   
        break;   
        
        case 
'U'// Серва поднимается  
          
if(min_posmyservo1.write(-= step_servo);    
        break;
        
        case 
'J'// Серва опускается  
          
if(max_posmyservo1.write(+= step_servo);  
        break;  
          
        case 
'K'// Серва поворачивается вправо      
         
if(i2 min_posmyservo2.write(i2 -= step_servo);  
        break;     
          
        case 
'H'// Серва поворачивается влево  
         
if(i2 max_posmyservo2.write(i2 += step_servo);   
        break;   
  
        case 
'B'//  Бластер  
          
D10_High;  
        break;  
         
        case 
'C'// Клаксон  
         
horn();  
        break;  
        
        case 
']'// запрос состояния аналоговых датчиков  
            
byte2char(A6_Read,A7_Read);
        break;         
          
        case 
'V'// Включить/Выключить фары  
        
if(light_stat
        { 
         
D9_Low
         
light_stat=false
        } else  
              { 
               
D9_High
               
light_stat=true
              } 
        break;  
    } 
    if(
inByte>47 && inByte<58speed=(inByte-47)*17+85//скорость вращения колес
     
  
} else packet_id(inByte);  
 }    
// 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;   
  
D10_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;  
}  

void packet_id(uint8_t inbyte)  //проверяем идентификатор пакета "cm="
{     
    switch (
inbyte)  
    {
       case 
'c':   
          
packid=2;  
        break;
        
       case 
'm':   
          
packid*=2;  
          
//packid=packid<<1;
        
break; 
        
       case 
'=':   
           
packid*=4
           
//packid=packid<<2;
        
break;   
        
        default:
           
packid=0;  
    }
}  

void byte2char(uint16_t inbyte0uint16_t inbyte1)  

  
char bytetochar[5];
  
uint8_t buf_answer[]="{\"dat1\":\"0000\",\"dat2\":\"0000\"}"
  
  
itoa(inbyte0+10000bytetochar10);  
  
buf_answer[9]= bytetochar[1]; buf_answer[10]= bytetochar[2]; buf_answer[11]= bytetochar[3]; buf_answer[12]= bytetochar[4]; 

  
itoa(inbyte1+10000bytetochar10); 
  
buf_answer[23]= bytetochar[1]; buf_answer[24]= bytetochar[2]; buf_answer[25]= bytetochar[3]; buf_answer[26]= bytetochar[4];

  
UART_SendArray(buf_answersizeof(buf_answer)-1); 


Выкладываю еще один код для ардуино, без использования библиотеки CyberLib
За код спасибо elik745i
Подробности здесь
PHP код:
/*
This sketch is for arduino nano/mini pro, 
to be used for building 2 motor wheeled robots,
equipped with 2 servo actuators for camera control, 
buzzer and lights. 
For more details please visit this article:
http://cyber-place.ru/showthread.php?t=1896&page=14
and for detailed instructions on how to build and circuit diagram:
http://www.voltrans.az/?p=1340

Updated: 
12Sep2015 - added voltage reading, start bug fixed (use library Arduino_Vcc-master)
3Sep2015 - added CyberBot3 support.
Author: Elik745i
Site: www.voltrans.az for cyber-place.ru
*/
#include <Servo.h>  // Подключаем библиотеку сервоприводов 
#include <Vcc.h> 
// // Подключаем H-Bridge HG7881
#define HG7881_A_IA 8  // D10 --> Motor A Input A --> MOTOR A +
#define HG7881_A_IB 9  // D9 --> Motor A Input B --> MOTOR A -
#define HG7881_B_IA 10 // D11 --> Motor B Input A --> MOTOR B +
#define HG7881_B_IB 11 // D12 --> Motor B Input B --> MOTOR B -
 
// functional connections
#define MOTOR_A_PWM HG7881_A_IB // Motor A PWM Speed
#define MOTOR_A_DIR HG7881_A_IA // Motor A Direction
#define MOTOR_B_PWM HG7881_B_IA // Motor B PWM Speed
#define MOTOR_B_DIR HG7881_B_IB // Motor B Direction
 
#define DIR_DELAY 100 // brief delay for abrupt motor changes

#define tiltServopin 6 //tilt servo attached to pin 7
#define panServopin 7 //pan servo attached to pin 8
#define serialReceive 13 //Serial Receive Message indicator LED
#define moveLed 4 //LED indicating tank movement
#define light 5 //
#define moveDelay 100
#define moveDelayturn 100

Servo tiltServo;  
Servo panServo
int val1 90;
const 
int servoAngle 20;
const 
int minAngle 0;
const 
int maxAngle 180;
int lightState=0;
int i;
const 
float VccMin   3.2;           // Minimum expected Vcc level, in Volts. 
const float VccMax   4.2;           // Maximum expected Vcc level, in Volts. 
const float VccCorrection 1.0/1.0;  // Measured Vcc by multimeter divided by reported Vcc  
Vcc vcc(VccCorrection); 
uint8_t inBytepackid;
const 
int SKR=12;   //speaker pin

unsigned long previousMillis 0;        // will store last time LED was updated
// constants won't change :
const long interval 5000;           // interval at which to alarm battery level (milliseconds)

void setup()
{
  
Serial.begin57600 );
  
pinMode(serialReceive,OUTPUT);
  
pinMode(moveLed,OUTPUT);
  
pinModeMOTOR_A_DIROUTPUT );
  
pinModeMOTOR_A_PWMOUTPUT );
  
digitalWriteMOTOR_A_DIRLOW );
  
digitalWriteMOTOR_A_PWMLOW );
  
pinModeMOTOR_B_DIROUTPUT );
  
pinModeMOTOR_B_PWMOUTPUT );
  
digitalWriteMOTOR_B_DIRLOW );
  
digitalWriteMOTOR_B_PWMLOW );
}
 
void loop()
{
   
float p vcc.Read_Perc(VccMinVccMax);
     
unsigned long currentMillis millis();
  if(
currentMillis previousMillis >= interval) {
    
// save the last time you blinked the LED 
    
previousMillis currentMillis
   if(
p<5){
   for(
i=1000;i>50;i--){
   
tone(SKRi10);
    } 
   }
  }
   if (
Serial.available()) //Еесли что то пришло  
        
{  
    
digitalWrite(serialReceive,HIGH);
    
//tone(SKR, 1440, 200);
    
inByte Serial.read();
     if ( 
packid == 16 )  
  {
    
//Serial.println(inByte);  //for debug, feedback will not work!
    
packid=0;
   switch (
inByte)  // Смотрим какая команда пришла  
    
{  
     case 
'x'// Остоновка робота 
        
robot_stop();
        break;  
         
      case 
'W'// Движение вперед 
        
robot_go();         
        break;     
      case 
'D'// Поворот вправо
        
robot_right();
        break; 

      case 
'A'//  Повопорт влево
       
robot_left();
        break;  
         
      case 
'S'// Движение назад
        
robot_back();
        break;  
       
       case 
'J'// Серво поднимается
                       
if(val1<maxAngle){
                         
tiltServo.attach(tiltServopin);               // attaches the servo on pin 2
                         
for(int i=0;i<servoAngle;i++){                          
                         
tiltServo.write(val1+i);           // sets the servo position according to the scaled value                           
                         
delay(servoAngle);                          
                         }                          
                         
val1=val1+servoAngle;                          
                         
tiltServo.detach();                // detaches the servo on pin 2                          
                         
}             
                         break;                       
       case 
'U'// Серво опускается                         
                         
if(val1>minAngle){
                         
tiltServo.attach(tiltServopin);               // attaches the servo on pin 2
                         
for(int i=0;i<servoAngle;i++){
                         
tiltServo.write(val1-i);           // sets the servo position according to the scaled value 
                         
delay(servoAngle);
                         }
                         
val1=val1-servoAngle;
                         
tiltServo.detach();                // detaches the servo on pin 2
                         
}      
        break; 
               
        case 
'K'// Серво поворачивается влево
                         
panServo.attach(panServopin);               // attaches the servo on pin 2
                         
panServo.write(180);           // sets the servo position according to the scaled value 
                         
delay(200);
                         
panServo.detach();                // detaches the servo on pin 2
       
        
break;   
          
        case 
'H'// Серво поворачивается вправо 
                         
panServo.attach(panServopin);               // attaches the servo on pin 2
                         
panServo.write(0);           // sets the servo position according to the scaled value 
                         
delay(200);
                         
panServo.detach();                // detaches the servo on pin 2
        
break;    
          
         case 
'B'//  Бластер  
         
        
break;  
         
        case 
'C'// Клаксон 
        
for(i=100;i<5000;i++){ 
        
tone(SKRi50);
        }
        for(
int i=5000;i>100;i--){ 
        
tone(SKRi10);
        }
        break;  

           
       case 
']'// запрос состояния аналоговых датчиков  
         
sendAnalog();
         
        break; 

        case 
'V'// Включить/Выключить фары 
       
if (lightState==0){
       
digitalWrite(light,HIGH);
      
lightState=1;
       }else{
      
digitalWrite(light,LOW);
      
lightState=0;
       } 
        break;  
          
    }
  }else 
packet_id(inByte);
digitalWrite(serialReceive,LOW);    
  }
}

void robot_stop() 
{
        
digitalWriteMOTOR_A_DIRLOW );
        
digitalWriteMOTOR_A_PWMLOW );
        
digitalWriteMOTOR_B_DIRLOW );
        
digitalWriteMOTOR_B_PWMLOW );
        
delayDIR_DELAY );
}


void robot_go(){
        
digitalWriteMOTOR_A_DIRLOW ); // direction = forward
        
digitalWriteMOTOR_A_PWMHIGH );
        
digitalWriteMOTOR_B_DIRLOW ); // direction = forward
        
digitalWriteMOTOR_B_PWMHIGH ); // PWM speed = slow
        
delay(moveDelay);
}
void robot_back(){
        
digitalWriteMOTOR_A_DIRHIGH ); // direction = forward
        
digitalWriteMOTOR_A_PWMLOW );
        
digitalWriteMOTOR_B_DIRHIGH ); // direction = forward
        
digitalWriteMOTOR_B_PWMLOW ); // PWM speed = slow
        
delay(moveDelay);
}
void robot_left(){
        
digitalWriteMOTOR_A_DIRHIGH ); // direction = forward
        
digitalWriteMOTOR_A_PWMLOW );
        
digitalWriteMOTOR_B_DIRLOW ); // direction = forward
        
digitalWriteMOTOR_B_PWMHIGH ); // PWM speed = fast
        
delay(moveDelayturn);
}
void robot_right(){
        
digitalWriteMOTOR_A_DIRLOW ); // direction = forward
        
digitalWriteMOTOR_A_PWMHIGH );
        
digitalWriteMOTOR_B_DIRHIGH ); // direction = forward
        
digitalWriteMOTOR_B_PWMLOW ); // PWM speed = slow
        
delay(moveDelayturn); 
}

void sendAnalog(){
  
float v vcc.Read_Volts();       
  
float p vcc.Read_Perc(VccMinVccMax);
  
//int k = analogRead(A0);
  //int f = analogRead(A1);
  
Serial.write("{\"dat1\":\"");
  
Serial.print(v);
  
//Serial.print(" V");
  
Serial.write("\",\"dat2\":\"");
  
Serial.print(p);
  
//Serial.print(" %");
  
Serial.write("\"}");  
}

void packet_id(uint8_t inbyte)  //проверяем идентификатор пакета "cm=" 
{      
    switch (
inbyte)   
    { 
       case 
'c':    
          
packid=2;   
        break; 
         
       case 
'm':    
          
packid*=2;   
          
//packid=packid<<1; 
        
break;  
         
       case 
'=':    
           
packid*=4;  
           
//packid=packid<<2; 
        
break;    
         
        default: 
           
packid=0;   
    } 

Admin вне форума   Ответить с цитированием
Старый 11.06.2015, 09:18   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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: Модуль "CyberBot-3"

Я протестировал все функции, багов пока не обнаружил
Жду результаты Ваших тестов
Admin вне форума   Ответить с цитированием
Старый 11.06.2015, 13:31   #3
Wagan
Senior Member
 
Регистрация: 02.06.2015
Адрес: Москва
Сообщений: 168
Вес репутации: 0
Wagan is an unknown quantity at this point
Отправить сообщение для Wagan с помощью Skype™
По умолчанию Re: Модуль "CyberBot-3"

Прошу прощения за вопрос новичка, по всей видимости, это модуль для работы с какой-то конкретной робототехнической платформой? Можете указать ссылку на технические требования к платформе или список покупных, чтобы легче сориентироваться?
Wagan вне форума   Ответить с цитированием
Старый 11.06.2015, 13:41   #4
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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: Модуль "CyberBot-3"

Отписал в шапке темы
Admin вне форума   Ответить с цитированием
Старый 11.06.2015, 13:44   #5
Wagan
Senior Member
 
Регистрация: 02.06.2015
Адрес: Москва
Сообщений: 168
Вес репутации: 0
Wagan is an unknown quantity at this point
Отправить сообщение для Wagan с помощью Skype™
По умолчанию Re: Модуль "CyberBot-3"

Спасибо, это понятно по сайту спонсора. Я имел в виду, есть ли полный список необходимого оборудования для закупки (датчики, конкретные версии Ардуино и т.п.)?
Wagan вне форума   Ответить с цитированием
Старый 11.06.2015, 14:07   #6
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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: Модуль "CyberBot-3"

Я дал ссылку на основные компоненты, которых достаточно что бы собрать WiFi робота, а все остальное уже на Ваше усмотрение
Admin вне форума   Ответить с цитированием
Старый 11.06.2015, 14:30   #7
Wagan
Senior Member
 
Регистрация: 02.06.2015
Адрес: Москва
Сообщений: 168
Вес репутации: 0
Wagan is an unknown quantity at this point
Отправить сообщение для Wagan с помощью Skype™
По умолчанию Re: Модуль "CyberBot-3"

Спасибо, в обновленной шапке уже более подробно
Wagan вне форума   Ответить с цитированием
Старый 11.06.2015, 20:47   #8
Alex19279
Senior Member
 
Регистрация: 20.09.2014
Сообщений: 145
Вес репутации: 0
Alex19279 will become famous soon enough
По умолчанию Re: Модуль "CyberBot-3"

Цитата:
Сообщение от Admin Посмотреть сообщение
Я протестировал все функции, багов пока не обнаружил
Жду результаты Ваших тестов
Моя тестовая платформа - роутер 3020+CyberWRT+CyberBOT 3. В USB порт включена только камера, подключившись на веб морду CyberBOT 3 вижу картинку с камеры, ардуинка не подключена.
Пару вопросов:
1. Без подключенной ардуины на экран данные с переменных kDat1,
kDat2 не выводятся? Я не вижу ничего, хотя бы мерцающего ноля.
2. Есть желание выводить на экран больше данных, редактировать файл www/cgi-bin/modules/CyberBot3/index.cgi и www/modules/CyberBot3/set.ini?
Alex19279 вне форума   Ответить с цитированием
Старый 11.06.2015, 21:12   #9
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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: Модуль "CyberBot-3"

1-если ничего не пришло, то и выводить ничего не будет
2-скетч тоже нужно править
Admin вне форума   Ответить с цитированием
Старый 17.06.2015, 21:10   #10
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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: Модуль "CyberBot-3"

В скетче для ардуино исправлен баг работы с сервами, перекочевавший со старой версии
Теперь для серв можно в скетче установить минимальное/максимальное и начальное положение
Admin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 5 (пользователей: 0 , гостей: 5)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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


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


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