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

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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.06.2015, 00:07   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9825
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=10, max_pos=170; //минимальное и максимаьное положение сервы
int i=130, i2=90;  //начальное положение сервы
  
boolean light_stat; //состояние фар
uint8_t inByte, packid;  
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(i > min_pos) myservo1.write(i -= step_servo);    
        break;
        
        case 
'J': // Серва опускается  
          
if(i < max_pos) myservo1.write(i += step_servo);  
        break;  
          
        case 
'K': // Серва поворачивается вправо      
         
if(i2 > min_pos) myservo2.write(i2 -= step_servo);  
        break;     
          
        case 
'H': // Серва поворачивается влево  
         
if(i2 < max_pos) myservo2.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<58) speed=(inByte-47)*17+85; //скорость вращения колес
     
  
} else packet_id(inByte);  
 }    
// wdt_reset();  
}  

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

void robot_go()  
{  
  
D4_Low;  
  
analogWrite(5, speed);   
  
analogWrite(6, speed);  
  
D7_Low;  
}  

void robot_back()  
{  
   
D4_High;   
   
analogWrite(5, 255-speed);   
   
analogWrite(6, 255-speed);  
   
D7_High;  
}  

void robot_stop()  
{  
  
D4_Low;   
  
analogWrite(5, 0);   
  
analogWrite(6, 0);  
  
D7_Low;   
  
D10_Low; 
}  

void robot_rotation_left()  
{  
  
D4_Low;  
  
analogWrite(5, speed);   
  
analogWrite(6, 255-speed);   
  
D7_High;  
}  

void robot_rotation_right()  
{  
  
D4_High;   
  
analogWrite(5, 255-speed);   
  
analogWrite(6, speed);   
  
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 inbyte0, uint16_t inbyte1)  
{ 
  
char bytetochar[5];
  
uint8_t buf_answer[]="{\"dat1\":\"0000\",\"dat2\":\"0000\"}"; 
  
  
itoa(inbyte0+10000, bytetochar, 10);  
  
buf_answer[9]= bytetochar[1]; buf_answer[10]= bytetochar[2]; buf_answer[11]= bytetochar[3]; buf_answer[12]= bytetochar[4]; 

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

  
UART_SendArray(buf_answer, sizeof(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 inByte, packid;
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.begin( 57600 );
  
pinMode(serialReceive,OUTPUT);
  
pinMode(moveLed,OUTPUT);
  
pinMode( MOTOR_A_DIR, OUTPUT );
  
pinMode( MOTOR_A_PWM, OUTPUT );
  
digitalWrite( MOTOR_A_DIR, LOW );
  
digitalWrite( MOTOR_A_PWM, LOW );
  
pinMode( MOTOR_B_DIR, OUTPUT );
  
pinMode( MOTOR_B_PWM, OUTPUT );
  
digitalWrite( MOTOR_B_DIR, LOW );
  
digitalWrite( MOTOR_B_PWM, LOW );
}
 
void loop()
{
   
float p = vcc.Read_Perc(VccMin, VccMax);
     
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(SKR, i, 10);
    } 
   }
  }
   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(SKR, i, 50);
        }
        for(
int i=5000;i>100;i--){ 
        
tone(SKR, i, 10);
        }
        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() 
{
        
digitalWrite( MOTOR_A_DIR, LOW );
        
digitalWrite( MOTOR_A_PWM, LOW );
        
digitalWrite( MOTOR_B_DIR, LOW );
        
digitalWrite( MOTOR_B_PWM, LOW );
        
delay( DIR_DELAY );
}


void robot_go(){
        
digitalWrite( MOTOR_A_DIR, LOW ); // direction = forward
        
digitalWrite( MOTOR_A_PWM, HIGH );
        
digitalWrite( MOTOR_B_DIR, LOW ); // direction = forward
        
digitalWrite( MOTOR_B_PWM, HIGH ); // PWM speed = slow
        
delay(moveDelay);
}
void robot_back(){
        
digitalWrite( MOTOR_A_DIR, HIGH ); // direction = forward
        
digitalWrite( MOTOR_A_PWM, LOW );
        
digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward
        
digitalWrite( MOTOR_B_PWM, LOW ); // PWM speed = slow
        
delay(moveDelay);
}
void robot_left(){
        
digitalWrite( MOTOR_A_DIR, HIGH ); // direction = forward
        
digitalWrite( MOTOR_A_PWM, LOW );
        
digitalWrite( MOTOR_B_DIR, LOW ); // direction = forward
        
digitalWrite( MOTOR_B_PWM, HIGH ); // PWM speed = fast
        
delay(moveDelayturn);
}
void robot_right(){
        
digitalWrite( MOTOR_A_DIR, LOW ); // direction = forward
        
digitalWrite( MOTOR_A_PWM, HIGH );
        
digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward
        
digitalWrite( MOTOR_B_PWM, LOW ); // PWM speed = slow
        
delay(moveDelayturn); 
}

void sendAnalog(){
  
float v = vcc.Read_Volts();       
  
float p = vcc.Read_Perc(VccMin, VccMax);
  
//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 вне форума   Ответить с цитированием
 


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

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

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

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


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


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