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

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, 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 вне форума   Ответить с цитированием
Старый 28.01.2015, 13:23   #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: Рандомные UART команды при загрузке роутера

Система в UART посылает отладочную информацию(лог), после загрузки модуль "Free UART" отключает логирование от UART
Проблему можно решить если перед командой отправлять преамбулу из 3-х букв, но это уже будет реализовано в CyberBot3
Admin вне форума   Ответить с цитированием
Старый 28.01.2015, 13:29   #3
Under
Member
 
Регистрация: 28.01.2015
Сообщений: 34
Вес репутации: 0
Under is an unknown quantity at this point
По умолчанию Re: Рандомные UART команды при загрузке роутера

Цитата:
Сообщение от Admin Посмотреть сообщение
Система в UART посылает отладочную информацию(лог), после загрузки модуль "Free UART" отключает логирование от UART
Мне думается это все-таки ser2net виновник - я с этой проблемой мучаюсь уже месяц, а на CyberWrt перешел лишь вчера, до этого стояла OpenWrt от роутера Gl.Inet со встроенным модулем ser2net.
Ну хорошо, допустим это Free_UART - можно как-то отключить посылки отладочной информации? Т.е. запретить роутеру спамить что-либо в UART, а только загружать модуль и исполнять конкретные команды.
Догадываюсь, что самое простое - это убрать модуль юарта из автозагрузки и запускать каждый раз вручную, случись что с роутером, но это крайний и слишком топорный вариант (да и при запуске ручном он снова будет спамить скорее всего). Хотелось бы решить по интеллигентному
Цитата:
Проблему можно решить если перед командой отправлять преамбулу из 3-х букв, но это уже будет реализовано в CyberBot3
ага, это обнадеживает надеюсь, что эту надстройку можно будет без пробем перенести на CyberBot1.
с нетерепением ждем, спасибо!

Последний раз редактировалось Under; 28.01.2015 в 14:00.
Under вне форума   Ответить с цитированием
Старый 29.01.2015, 05:07   #4
Under
Member
 
Регистрация: 28.01.2015
Сообщений: 34
Вес репутации: 0
Under is an unknown quantity at this point
По умолчанию Re: Рандомные UART команды при загрузке роутера

Цитата:
Сообщение от mebitek Посмотреть сообщение
В процессе работы уарт почти ничего не сыпет в консоль, только при загрузке.
Поставьте в сетапе (ардуины) задержку 65 сек. (пока роутер грузится)
[/PHP]
не сыпет в процессе работы это понятно - робот стоит на месте, никаких лишних телодвижений.
а вот насчет задержки не понял (извините, я не особо программист и только месяц, как начал осваивать ардуино). у меня уже есть делэй на 15с. перед слушателем Serial, т.е. роутер успевает послать все "дебажные" команды до того, как ардуино начнет их интерпретировать.
но по Вашему скетчу мне не понятно, как ардуино будет фильтровать дебажные команды, пока роутер грузится (учитывая, что ардуино уже включена и работает, а роутер перезагружается по надобности).
Under вне форума   Ответить с цитированием
Старый 29.01.2015, 08:10   #5
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию Re: Рандомные UART команды при загрузке роутера

Цитата:
у меня уже есть делэй на 15с
Роутер сыплет примерно минуту.


Цитата:
учитывая, что ардуино уже включена и работает, а роутер перезагружается по надобности
Ардуина отреагирует только если придут символы "Y+=Z" (такой фразы роутер не шлёт - "я гарантирую это") + нужный нам символ.

Последний раз редактировалось stD; 29.01.2015 в 08:12.
stD вне форума   Ответить с цитированием
Старый 29.01.2015, 08:38   #6
Under
Member
 
Регистрация: 28.01.2015
Сообщений: 34
Вес репутации: 0
Under is an unknown quantity at this point
По умолчанию Re: Рандомные UART команды при загрузке роутера

Цитата:
Роутер сыплет примерно минуту.
охотно верю, но в моем случае 15с. вполне достаточно (тайминг подбирал путем проб и ошибок), вот 10с уже мало.
Цитата:
Ардуина отреагирует только если придут символы "Y+=Z"
а, кажется начинаю понимать. попробую доработать скетч. спасибо Вам.
Under вне форума   Ответить с цитированием
Старый 29.01.2015, 09:45   #7
Stiger
Junior Member
 
Регистрация: 16.07.2014
Адрес: Сланцы. Лен. область.
Возраст: 49
Сообщений: 14
Вес репутации: 0
Stiger is an unknown quantity at this point
По умолчанию Re: Рандомные UART команды при загрузке роутера

Тоже мучался с этой проблемой.
Решил её уходом от прямого последовательного порта на подключение по USB. Там никакого мусора нет.
Но вариант с "Ардуина отреагирует только если придут символы "Y+=Z" (такой фразы роутер не шлёт - "я гарантирую это") + нужный нам символ. " - тоже должен работать.
Stiger вне форума   Ответить с цитированием
Старый 29.01.2015, 13:17   #8
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию Re: Рандомные UART команды при загрузке роутера

Цитата:
тоже должен работать
Работает на нескольких роутерах, в течении нескольких лет. Ошибок нет.

Цитата:
охотно верю, но в моем случае 15с
Записал лог загрузки:
http://www.youtube.com/watch?v=ZzdMj...ature=youtu.be
stD вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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