Çizgi izleyen robot sadece sola dönüyor

  • Konuyu başlatan BABER
  • Başlangıç Tarihi
  • Mesaj 7
  • Görüntüleme 4.225

BABER

Hectopat
Katılım
9 Nisan 2020
Mesajlar
542
Makaleler
1
Çözümler
3
Yer
Ankara
Daha fazla  
Cinsiyet
Erkek
Bu kodu çizgi izleyen robotumda kullanıyorum ancak sadece sürekli sola dönüyor. Motorları, motor test kodu ile denedim sorun yok olması gerektiği gibi dönüyorlar. Diyagramdaki bağlantılar ile birebir aynı bağlı. Sıkıntı ne olabilir?

Kod:
#include <QTRSensors.h>


#define NUM_SENSORS   8    
#define TIMEOUT       2500
#define EMITTER_PIN   QTR_NO_EMITTER_PIN 


QTRSensorsRC qtrrc((unsigned char[]) {2, 4, 5, 6, 7, 8, 9,10},NUM_SENSORS, TIMEOUT, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS]; // array with individual sensor reading values
unsigned int line_position=0;

int pwm_a = 3;
int pwm_b = 11;
int dir_a = 12; 
int dir_b = 13; 


int calSpeed = 85; 


float error=0;
float PV =0 ; 
float kp = 1; 
int m1Speed=0;
int m2Speed=0;


void setup()
{

  pinMode(pwm_a, OUTPUT);
  pinMode(pwm_b, OUTPUT);
  pinMode(dir_a, OUTPUT);
  pinMode(dir_b, OUTPUT);


  analogWrite(pwm_a, 0);
  analogWrite(pwm_b, 0);
   


  delay(2000);


  for (int i = 0; i <= 100; i++)  // begin calibration cycle to last about 2.5 seconds (100*25ms/call)
  {
   


    if (i==0 || i==60) 
    {
       digitalWrite(dir_a, LOW);
       analogWrite(pwm_a, calSpeed);
       digitalWrite(dir_b, HIGH);
       analogWrite(pwm_b, calSpeed);  
    }
   
    else if (i==20 || i==100)
    {
       digitalWrite(dir_a, HIGH);
       analogWrite(pwm_a, calSpeed);
       digitalWrite(dir_b, LOW);
       analogWrite(pwm_b, calSpeed);  
    }
   
    qtrrc.calibrate();
   
  }

 
  line_position = qtrrc.readLine(sensorValues);

  while (sensorValues[6] < 200)
  {
    line_position = qtrrc.readLine(sensorValues);
  }
 

  while (line_position > 4350)
  {
    line_position = qtrrc.readLine(sensorValues);
  }


  analogWrite(pwm_b, 0);
  analogWrite(pwm_a, 0);


  delay(1000);

}



void loop() // main loop
{


  unsigned int line_position = qtrrc.readLine(sensorValues);
 
 
  follow_line(line_position);

}








void follow_line(int line_position)
{



  switch(line_position)
  {
     
    // Line has moved off the left edge of sensor
    // This will make it turn fast to the left
    case 7000:
           digitalWrite(dir_a, HIGH);
           analogWrite(pwm_a, 200);
           digitalWrite(dir_b, LOW);
           analogWrite(pwm_b, 200);
    break;



    case 0:    
           digitalWrite(dir_a, LOW);
           analogWrite(pwm_a, 200);
           digitalWrite(dir_b, HIGH);
           analogWrite(pwm_b, 200);
    break;



    default:    
      error = (float)line_position - 3500;

 

      PV = kp * error;


      if (PV > 55)
      {
        PV = 55;
      }

      if (PV < -55)
      {
        PV = -55;
      }
     


      m1Speed = 200 - PV;
      m2Speed = 200 + PV;
   

      digitalWrite(dir_a, LOW);
      analogWrite(pwm_a, m1Speed);
      digitalWrite(dir_b, LOW);
      analogWrite(pwm_b, m2Speed);
      break;
  }

}
 
Hocam basit bir sorum var, motorlardan sağ olanı çalışıyor mu
 
Kodda bir sorun olduğunu düşünmüyorum. Sensörde hata olabilir. Bir de çizgiye doğru koyuyor musun?
Evet düzgün koyuyorum, düz a3 kağıdı üzerine standart elektrik bandı ile yapılmış piste koyuyorum kendisi kalibrasyon için 90° sağa, 90° sola sonra tek yöne dönüyor. Sensör düzgün okuyor test ettim yeniden.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…