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

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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.01.2015, 13:08   #1
Under
Member
 
Регистрация: 28.01.2015
Сообщений: 34
Вес репутации: 0
Under is an unknown quantity at this point
По умолчанию Рандомные UART команды при загрузке роутера

Доброго времени суток.
Вводные: ардуино уно (робот, 2 колеса, камера) + роутер с CyberWrt (запитаны от разных источников питания)
Проблема:
1. при одновременном включении роутера и ардуины секунд через 5-7 робот начинает неистово и рандомно крутить колесами, потом зависает в режиме "езда назад" и так и едет, пока не скажешь ему "СТОП!"
2. ардуина включена, но сделан ребут роутера - аналогичная ситуация.
По всей видимости во время загрузки роутер что-то шлет через Ser2Net и робот успешно выполняет эти рандомные команды. Это очень мешает, когда робот дома, а тебе нужно ребутнуть роутер - он какое то время бьется о стены, пока я не зайду и не тыкну СТОП в интерфейсе CyberWrt.
Проблему №1 решил добавлением delay (15000) перед слушателем порта, т.е. роутер успевает загрузиться раньше, чем ардуино будет слушать команды, которые валятся в UART.
Подскажите, пожалуйста, как можно побороть проблему №2? Возможно есть смысл заставлять вместе с ребутом роутера одновременно ребутить и ардуину, но вот как это сделать имея на руках лишь вэб-интерфейс CyberWrt?
Причем этой проблемы не было на китайском скетче (который они положили в комплект к детялям робота), но после доработки и оптимизации скетча под себя - началось.
Привожу скетчи, первый мой, воторой исходный от китайцев (там много лишнего - сервы, фары и т.п.):
PHP код:
int EN2 14;
int EN3 15;
int EN4 16;
int EN5 17;
int EA 3;
int EB 5;
int add;

void setup()
{
  
pinMode(EN2,OUTPUT);
  
pinMode(EN3,OUTPUT);
  
pinMode(EN4,OUTPUT);
  
pinMode(EN5,OUTPUT);
  
delay(15000);
Serial.begin(9600);
  
add=0;
}

void loop()
{
  if(
Serial.available())
 {
    
add Serial.read();
  switch(
add)
  {
   case 
'W':
    
forward();
    
add=0;  
    break;   
   case 
'S':
    
backward();
    
add=0;
    break;     
   case 
'D':
    
right();
    
add=0;
    break;
   case 
'A':
    
left();
    
add=0;
    break; 
   case 
'x':
    
stand();
    
add=0;
    break;  
  }
 }
}
 
 
void stand(void)
        {
          
analogWrite(EA,0); //STOP_RW
          
analogWrite(EB,0); //STOP_LW
          
digitalWrite(EN2,LOW);
          
digitalWrite(EN3,LOW);
          
digitalWrite(EN4,LOW);
          
digitalWrite(EN5,LOW);
        }
void forward(void)
        {
          
analogWrite(EA,160);//FORWARD_RW
          
analogWrite(EB,200);//FORWARD_LW 
          
digitalWrite(EN2,LOW);
          
digitalWrite(EN3,HIGH);
          
digitalWrite(EN4,LOW);
          
digitalWrite(EN5,HIGH);
        }
void backward(void)
        {
          
analogWrite(EA,160);//BACKWARD_RW
          
analogWrite(EB,200);//BACKWARD_LW
          
digitalWrite(EN2,HIGH);
          
digitalWrite(EN3,LOW);
          
digitalWrite(EN4,HIGH);
          
digitalWrite(EN5,LOW);  
        }
void right(void)
        {
          
analogWrite(EA,120);//RIGHT_RW
          
analogWrite(EB,120);//RIGHT_LW
          
digitalWrite(EN2,HIGH);
          
digitalWrite(EN3,LOW);
          
digitalWrite(EN4,LOW);
          
digitalWrite(EN5,HIGH);
        }
void left(void)
        {
          
analogWrite(EA,100);//LEFT_RW
          
analogWrite(EB,140);//LEFT_LW
          
digitalWrite(EN2,LOW);
          
digitalWrite(EN3,HIGH);
          
digitalWrite(EN4,HIGH);
          
digitalWrite(EN5,LOW);
        } 
Китайский:
PHP код:
#include <Servo.h>    //舵机控制库
#include <DistanceSRF04.h>
DistanceSRF04 Dist;
int distance;
int EN2 14;  
int EN3 15;
int EN4 16;
int EN5 17;
int LED1 6
int LED2 7
int EA 3;
int EB 5;
int val,kkl,lkf;
int lx=90;
//2路舵机
Servo servoX//云台X轴舵机 左右
Servo servoY//云台Y轴舵机 上下
int mkk;
///////////////////////////////////////
void ting(void)
        {
          
analogWrite(EA,0);
          
analogWrite(EB,0); 
          
digitalWrite(EN2,LOW);   
          
digitalWrite(EN3,LOW);
          
digitalWrite(EN4,LOW);   
          
digitalWrite(EN5,LOW);       
        }
        
void qian(void)
        { 
          
analogWrite(EA,254);//调节参数可调速度(0-255)
          
analogWrite(EB,255);//调节参数可调速度(0-255)      
          
digitalWrite(EN2,LOW);
          
digitalWrite(EN3,HIGH);
          
digitalWrite(EN4,LOW);
          
digitalWrite(EN5,HIGH);
        }
void hou(void)
        {        
          
analogWrite(EA,255);//调节参数可调速度(0-255)
          
analogWrite(EB,255); //调节参数可调速度(0-255) 
          
digitalWrite(EN2,HIGH);
          
digitalWrite(EN3,LOW);
          
digitalWrite(EN4,HIGH);
          
digitalWrite(EN5,LOW);            
        }
void zuo(void)
        {        
          
analogWrite(EA,180);//调节参数可调速度(0-255)
          
analogWrite(EB,180); //调节参数可调速度(0-255)
          
digitalWrite(EN2,LOW);
          
digitalWrite(EN3,HIGH);
          
digitalWrite(EN4,HIGH);
          
digitalWrite(EN5,LOW);     
        }        
void you(void)
        {        
          
analogWrite(EA,180);//调节参数可调速度(0-255)
          
analogWrite(EB,180); //调节参数可调速度(0-255)
          
digitalWrite(EN2,HIGH);
          
digitalWrite(EN3,LOW);
          
digitalWrite(EN4,LOW);
          
digitalWrite(EN5,HIGH);
          
        }  
//舵机左转
void servo_left()
{
  
int servotemp=servoX.read();//获取舵机目前的角度值
  
servotemp-=2;//舵机运动1度
  
if(servotemp<170&&servotemp>10//我定义的舵机旋转角度为10度到170度
  
servoX.write(servotemp);
  else if (
servotemp<=10)  servoX.write(10);
  else 
servoX.write(170);
}


//舵机右转
void servo_right()
{
  
int servotemp=servoX.read();//获取舵机目前的角度值
  
servotemp+=2;//舵机运动1度
  
if(servotemp<170&&servotemp>10)//我定义的舵机旋转角度为10度到170度
  
servoX.write(servotemp);
  else if (
servotemp<=10)  servoX.write(10);
  else 
servoX.write(170);
}


//舵机上转
void servo_up()
{
  
int servotemp1=servoY.read();//获取舵机目前的角度值
  
servotemp1+=2;//舵机运动1度
  
if(servotemp1<170&&servotemp1>10)//我定义的舵机旋转角度为10度到170度
  
servoY.write(servotemp1);
  else if (
servotemp1<=10)  servoY.write(10);
  else 
servoY.write(170);
}


//舵机下转
void servo_down()
{
  
int servotemp1=servoY.read();//获取舵机目前的角度值
  
servotemp1-=2;//舵机运动1度
  
if(servotemp1<170&&servotemp1>10)//我定义的舵机旋转角度为10度到170度
  
servoY.write(servotemp1);
  else if (
servotemp1<=10)  servoY.write(10);
  else 
servoY.write(170);
}
void setup()
{
  
Dist.begin(9,8);
  
servoX.attach(10);//水平舵机接10脚
  
servoY.attach(11);//上下舵机接11脚
  
servoX.write(90);//输出舵机初始位置为90度
  
servoY.write(90);//输出舵机初始位置为90度
  
pinMode(EN2,OUTPUT);
  
pinMode(EN3,OUTPUT);
  
pinMode(EN4,OUTPUT);
  
pinMode(EN5,OUTPUT);
  
pinMode(LED1,OUTPUT);
  
pinMode(LED2,OUTPUT);
   for(
kkl=0;kkl<50;kkl++)
  {
    
digitalWrite(LED1,HIGH);
    
digitalWrite(LED2,HIGH);
    
delay(500);//延时500M秒,
    
digitalWrite(LED1,LOW);
    
digitalWrite(LED2,LOW);
    
delay(500);
  }
Serial.begin(9600);//设置波特率为9600bps
  
lkf=0;
}


void loop()

  
distance Dist.getDistanceCentimeter();
  if(
distance<=distance>1)
  {
    
hou();
    
delay(100);
    
ting();
    
distance=0;
  } 
  if(
Serial.available())
  {
    
lkf Serial.read();
  switch(
lkf)
  {
  case 
'a':
     
qian();
     
servoX.write(90);
     
lkf=0;  
     break;   
   case 
'b':
     
hou();
     
lkf=0;
     break;     
   case 
'c':
     
zuo();
     
lkf=0;
     break;
   case 
'd':
    
you();
    
lkf=0;
     break; 
   case 
'e':
    
ting();
    
lkf=0;
     break;  
   case 
'j'
     
servo_left();
     
lkf=0;
     break;
   case 
'l'
     
servo_right();
     
lkf=0;
     break;
   case 
'k'
    
servo_up();
    
lkf=0;
    break;
   case 
'i':
     
servo_down();
     
lkf=0;
     break;
  case 
'n':
     
digitalWrite(LED1,HIGH);
     
digitalWrite(LED2,HIGH);
     
lkf=0;
     break;
  case 
'm':
    
digitalWrite(LED1,LOW);
    
digitalWrite(LED2,LOW);
    
lkf=0;
    break;
    }
  }
 } 
Under вне форума   Ответить с цитированием
 


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

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

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

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


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


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