Робот и ардуино

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Всем привет. У меня собран робот на основе таких компонентов.

  1. Arduino uno v3
  2. Motor Shield (F815A) основанный на контроллере L298
  3. Servo Shield
  4. Платформа на подобие turtle (Китай)

Помогите поправить код, а то серва двигает из стороны в сторону как бешеная. И чем можно улучшить сцепление колесиков с полом? Код брал по этой ссылке и немного изменил под себя

http://habrahabr.ru/post/142156/


#include <Servo.h> 
 
  const int motor1APin = 2;   // H-bridge leg 1 
  const int motor2APin = 3; // H-bridge leg 2 
  const int motor3APin = 4;   // H-bridge leg 1 
  const int motor4APin = 5; // H-bridge leg 2 
  const int enablePin = 12;   // H-bridge enable pin
 
  const int Trig = A0; //Ultrasonic
  const int Echo = A1;
  
  Servo myservo;



  void setup()
  {
    // set all the other pins you're using as outputs:
    pinMode( enablePin, OUTPUT);
    pinMode( motor1APin, OUTPUT);
    pinMode( motor2APin, OUTPUT);
    pinMode( motor3APin, OUTPUT);
    pinMode( motor4APin, OUTPUT);
    pinMode(Trig, OUTPUT);
    pinMode(Echo, INPUT);
  
    // set enablePin high so that motor can turn on:
    digitalWrite(enablePin, HIGH);
    
    myservo.attach(12);
    
  }
  
  unsigned int time_us=0;
  unsigned int distance_sm=0;
  unsigned int circle=0;
  unsigned int dist_f=0;
  unsigned int dist_l=0;
  unsigned int dist_r=0;
  unsigned int dist_45=0;
  unsigned int dist_135=0;
  unsigned int t=15;

  void loop() 
  {
   if (circle==0)
   {
    myservo.write(0);  //initial parameters
    dist_r=sonar();
    motion('w',0,45,t);
    dist_45=sonar();
    motion('w',45,90,t);
    dist_f=sonar();
    motion('w',90,135,t);
    dist_135=sonar();
    motion('w',135,180,t);
    dist_l=sonar();
   }
   circle++; 
   
   if(dist_f>=25)
   {
    a:
    motion('f',180,135,t);
    dist_135=sonar();
    front_motion(t);
    motion('f',135,90,t);  
    dist_f=sonar();
    front_motion(t);
    motion('f',90,45,t);
    dist_45=sonar();
    front_motion(t);
    motion('f',45,0,t);
    dist_r=sonar();
    front_motion(t);
    motion('f',0,45,t);
    dist_45=sonar();
    front_motion(t);
    motion('f',45,90,t);
    dist_f=sonar();
    front_motion(t);
    motion('f',90,135,t);
    dist_135=sonar();
    front_motion(t);
    motion('f',135,180,t);
    dist_l=sonar();
    front_motion(t);
    if (dist_f>=25)
    goto a;
    }
    
   else
  {
   if(dist_f<5)
   {
    motion_back(t);
    dist_f=sonar();
   } 

   if(dist_l>=dist_r || dist_135>dist_r)
   {
    motion('l',180,90,t);
    dist_f=sonar();
   }
   if(dist_l<dist_r)
   {
    motion('r',180,90,t);
    dist_f=sonar();
   }
  } 
   
 }
    
    
  int sonar()
  {
    digitalWrite(Trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(Trig, LOW);
    time_us=pulseIn(Echo, HIGH);
    distance_sm=time_us/58;
    return distance_sm;
  }  
     
    
  void back ()
  {
    digitalWrite(motor1APin, HIGH);
    digitalWrite(motor2APin, LOW);
    digitalWrite(motor3APin, HIGH);
    digitalWrite(motor4APin, LOW);
  }
  
   void forward ()
  {
    digitalWrite(motor1APin, LOW);
    digitalWrite(motor2APin, HIGH);
    digitalWrite(motor3APin, LOW);
    digitalWrite(motor4APin, HIGH);
  }
  
   void right ()
  {
    digitalWrite(motor1APin, LOW);
    digitalWrite(motor2APin, HIGH);
    digitalWrite(motor3APin, HIGH);
    digitalWrite(motor4APin, LOW);
  }
  
   void left ()
  {
    digitalWrite(motor1APin, HIGH);
    digitalWrite(motor2APin, LOW);
    digitalWrite(motor3APin, LOW);
    digitalWrite(motor4APin, HIGH);
  }
  
  void wait()
 {
  digitalWrite(motor1APin, LOW); 
  digitalWrite(motor2APin, LOW); 
  digitalWrite(motor3APin, LOW); 
  digitalWrite(motor4APin, LOW); 
 }
 
 void motion (char dimention, int prev_angle, int next_angle, int time)
 {
   int a;
   if(next_angle>=prev_angle)
   a=15;
   else
   a=-15; 
   
   if (dimention=='f')
    { 
     int i=prev_angle;
     while( i!=next_angle)
     { 
      i+=a;
      myservo.write(i);
      forward();
      delay(time);
     }
    }
    if (dimention=='l')
    { 
     int i=prev_angle;
     while( i!=next_angle)
     { 
      i+=a;
      myservo.write(i);
      left();
      delay(time);
     }
    }
    if (dimention=='r')
    { 
     int i=prev_angle;
     while( i!=next_angle )
     { 
      i+=a;
      myservo.write(i);
      right();
      delay(time);
     }
    }
    if (dimention=='b')
    { 
     int i=prev_angle;
     while( i!=next_angle )
     { 
      i+=a;
      myservo.write(i);
      back();
      delay(time);
     }
    }
    if (dimention=='w')
    {
     int i=prev_angle; 
     while( i!=next_angle )
     { 
       i+=a;
       myservo.write(i);
       wait();
       delay(time);
      }
    }
 
 }
 
void front_motion( int time )
{
  if(dist_45<=9)
  {
   left();
   delay(3*time);
  }
  if(dist_135<=9)
  {
    right();
    delay(3*time);
  } 
}

void motion_back( int time )
{
  motion('b',180,90,2*time);
   /*if(dist_l>=dist_r)
   {
     do
      {
       left();
       delay(time);
       dist_f=sonar();
       }while(dist_f<=20);
     } 
     
    if(dist_l<dist_r)
    {
     do
      {
       right();
       delay(time);
       dist_f=sonar();
      }while(dist_f<=20); 
    } */ 
   } 

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

Мне не совсем понятно, как работает этот кусок кода

001 <span style="color:rgb(20,20,20);font-family:Georgia, 'Times New Roman', Times, serif;font-size:15px;line-height:20px;background-color:rgb(252,252,255);">Всем привет. У меня собран робот на основе таких компонентов.
002  
003 1. Arduino uno v3</span>
004 <span style="color:rgb(20,20,20);font-family:Georgia, 'Times New Roman', Times, serif;font-size:15px;line-height:20px;background-color:rgb(252,252,255);">2. Motor Shield (F815A) основанный на контроллере L298</span>
005 <span style="color:rgb(20,20,20);font-family:Georgia, 'Times New Roman', Times, serif;font-size:15px;line-height:20px;background-color:rgb(252,252,255);">3. Servo Shield</span>
006 <span style="color:rgb(20,20,20);font-family:Georgia, 'Times New Roman', Times, serif;font-size:15px;line-height:20px;background-color:rgb(252,252,255);">4. Платформа на подобие turtle (Китай)
007  
008 Помогите поправить код, а то серва  двигает из стороны  в сторону  как бешеная. И чем можно улучшить сцепление колесиков с полом?
009 Код брал по этой ссылке и немного изменил под себя  </span><a class="externalLink"href="http://habrahabr.ru/post/142156/" style="color:rgb(23,96,147);padding:0px 3px;margin:0px -3px;font-family:Georgia, 'Times New Roman', Times, serif;font-size:15px;line-height:20px;background-color:rgb(252,252,255);" rel="nofollow">http://habrahabr.ru/post/142156/
010 </a>

 

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Этот  код просто  неправильно  сюда  вставился. А как отредактировать сообщение  не  нашел (((( 

leshak
Offline
Зарегистрирован: 29.09.2011

mkvmaks пишет:

Этот  код просто  неправильно  сюда  вставился. А как отредактировать сообщение  не  нашел (((( 

Рекомендую активней пользоваться кнопкой "Предпросмотр". Особено при заведении новой темы. Так как редактирование первого сообщения - не доступно даже автору.

А раз переспросили - можно было и отдельно описание вставить еще раз. Следующим сообщением.

leshak
Offline
Зарегистрирован: 29.09.2011

Кстати еще рекомендую, если вы действительно хотите каких-то внятных ответов, как-то более формально-строже описать что означает "а то серва двигает из стороны в сторону как бешеная". Вам то, глядя на нее очевидно что происходит, а другим?

Что означает "бешенная серва"?  Слишком большая амплитуда, слишком быстро двигается, двигается когда не требуется..... и еще пяток поведений попадающие под "бешенная серва" можно придумать.

Вообщем привыкайте мыслить  формально-однозначно.  Тогда и на форуме легче будет и .... код будет более безошибочным. Контроллер он, в отличае от людей, догадки о том "что вы хотели" - строить не умеет. Так что "бешенная серва" это скорее всего результат не доконца продуманости "что нужно" в голове.

По коду: трудно-читаемый. Попробуйте переписать его так что-бы:

1.ВООБЩЕ небыло никаких goto
2. Было поменьше идентичных кусков кода. Поменьше копипаста. Вот скажем функция motion() - громаданя. При этом фактически содержит пять одинаковых кусков
3. Там где возможно - лучше используйте switch case вместо грозди if-вов.

Тогда и другим будет легче понять что ваш код делает, и поправить его после обнаружения причины - легче будет, да возможно станет настолько простым что причина будет видна невооруженным глазом и сами ее увидите.