Arduino QTR-8A ile analog çizgi izleyen + PİD

Başlatan umt, 13 Ekim 2015, 16:21:17

umt

Arkadaşlar müh. öğrencisiyim . Robotlar tutkum ve çizgi izleyen yapmaya karar vermiştim aylar önce . Kodlar konusunda baya ilerlediğimi düşünüyorum ama etrafımda yardım alabileceğim birileri de çok yok . Bi noktadan sonra   çok kötü tıkandım . 1-2 ay ara verdim kodları tamamladıkdan sonra . herşey çalışıyor gibi görünüyor . arudino üzerinden yaptığım için sadece 6 tane analog girişi kullanabiliyorum 8 sensör üzerinden . 8 sensörü de kullanabilirmiyim önce onu sorucam ve kod ları burda paylaşmak istemiyorum . bazı arkadaşlar kendini geliştirmeden direk sahip olmak isteyebilir buda onların hiç bi gelişimine katgıda bulunmaz . zannediyorum çok küçük bir kaç hata var kodlarım da . kodlarım küçümsenicek cinsden değil onu belirtmek isterim . Bu işde profesyonelleşmiş daha doğrusu çok uğraşmış birileri lazım :) sadece küçük hatayı bulucak . robot çalışıyor . Belki pid de bi sıkıntı vardır bilemiyorum . robot maliyetinden sakınmadım . roboturka dan aldım hepsini . toplam 350 tl ye geldi . motorlar falan herşey çok sağlam . mesela başlangıcı yazıyorum . Eğer anlayan varsa ve bana ulaşırsa inanılmaz sevinirim . Benimde yardımlarım dokunabilir belki . Mail yoluyla veya başka iletişim yollarıyla ulaşabilrsiniz . Sadece bi mail veya buraya yardım için yazın yeterli . Kodlar şunlar ;
const int PWMA = 5, PWMB = 6, AIN1 = 3, AIN2 = 11, BIN1 = 10, BIN2 = 9, button = 2;
//SENSOR
long sensor[6], sensorMax[6], sensorMin[6], sensorNormalize[6];
int black_up = 3, white_down = 3, sensor_sayac = 0, line_counter = 0;
int maxSpeed = 255, sagHiz = 0, solHiz = 0;
boolean base_black_backup = false, base_black = false;
Diyerek devam ediyor :) İletişim pls ..

LukeSkywalker

Bunlar sır degil. Pololunun sitesinde kabak gibi açıkta zaten.

umt

Alıntı yapılan: LukeSkywalker - 13 Ekim 2015, 19:24:13
Bunlar sır değil. Pololunun sitesinde kabak gibi açıkta zaten.
Yanlış anlattım kendimi sanırım . Polulunun sitesinde bana yardım edebilecek bi konu yokki . komple kodlarım tamam sadece bi arkadaşdan kodlarım hakkında bi yorum isticem . çalışır vaziyetteyden deneme aşamasında bi sıkıntı yaşıyorum . pid oranlarıyla alakalı sanırım . buraya da kodlarımın bir bölümünü yansıttım küçücük bir bölümünü . Çizgi izleyen kodları arıyan yüzlerce insan var ki basit şekilde de oluşturmadım . Onları yapabilmek için çok uğraştım hepsi bu . İlgin için teşşekkürler bu arada saolasın .

Firzen

Kararsız...

exjra

... ... kullanarak çözebilirsiniz 8 sensör probleminizi ☺

certy

Kodlarınız basit değil diye istemediğiniz amatör kişiler belki sizden daha profesyoneldir. O nedenle ayrım yapmadan kodu burada paylaşmanız daha iyi olur.
TA1USS

mufitsozen

Alıntı yapılan: umt - 13 Ekim 2015, 16:21:17
....
boolean base_black_backup = false, base_black = false;
Diyerek devam ediyor :) İletişim pls ..

source code s'il vous plait.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

umt

Alıntı yapılan: certy - 13 Ekim 2015, 20:17:36
Kodlarınız basit değil diye istemediğiniz amatör kişiler belki sizden daha profesyoneldir. O nedenle ayrım yapmadan kodu burada paylaşmanız daha iyi olur.
basit değil kodlarım derken hani kendimi büyük gördüğümden değil yanlış anlamayın :) paylaşabilirsin burda 1 kişi bile dese hemen yazıcaktım ki bende amatörüm . Benim gibi bir ilgilenen arkadaş da yardım ederse olur tabiki yeterki tartışalım konuyu :)  Tmm o zaman kodlarım şunlar ;



const int PWMA = 5, PWMB = 6, AIN1 = 3, AIN2 = 11, BIN1 = 10, BIN2 = 9, button = 2;
//SENSOR
long sensor[6], sensorMax[6], sensorMin[6], sensorNormalize[6];
int black_up = 3, white_down = 3, sensor_sayac = 0, line_counter = 0;
int maxSpeed = 255, sagHiz = 0, solHiz = 0;
boolean base_black_backup = false, base_black = false;

float KP = 0, KD = 0, KI = 0, P = 0, I = 0, D = 0, PID = 0, avg = 0, sum = 0;
float reference_point = 2500, siyah_line_pos = 0, beyaz_line_pos = 0, last_error = 0;

void motorDIR(boolean AI1, boolean BI1);
void Read_Sensor();
void Calibrate();
void PID_Loop();
int Normalize();


void setup(){
  Serial.begin(9600);
 
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(A3, INPUT);
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
 
  pinMode(button, INPUT_PULLUP);
 
  pinMode(PWMA, OUTPUT);
  pinMode(PWMB, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
 
  digitalWrite(AIN1, HIGH);
  digitalWrite(AIN2, LOW);
  digitalWrite(BIN1, HIGH);
  digitalWrite(BIN2, LOW);
}
void loop(){
  if(digitalRead(button) == 0){
    while(digitalRead(button) == 0);
    Calibrate();
    delay(2000);
    PID_Loop();
  }
}

void PID_Loop(){
  while(1){
    int i=0;
  avg=0;
  sum=0;

  Read_Sensor();
  Normalize();
    if((sensor_sayac == 5) || (sensor_sayac == 0))
    {
      if((sensor_sayac == 5) && (base_black == false))
      {
        line_counter++;
        while(sensor_sayac == 5){Read_Sensor(); Normalize();}
      }
 
      if((sensor_sayac == 0) && (base_black == true))
      {
        line_counter++;
        while(sensor_sayac == 0){Read_Sensor(); Normalize();}
      } 
   
      if(sensor_sayac == 5)
      {
        if(siyah_line_pos < 1500)
        {
          motorDIR(0,1);
          analogWrite(PWMA, 100);
          analogWrite(PWMB, 100);
       
          while(sensor_sayac == 5)
          {
            Read_Sensor();
            Normalize();
          }
        }
        else if(siyah_line_pos > 3500)
        {
          motorDIR(1,0);
          analogWrite(PWMA, 100);
          analogWrite(PWMB, 100);
       
          while(sensor_sayac == 5)
          {
            Read_Sensor();
            Normalize();
          }
        }
        else
        {
          analogWrite(PWMA, 100);
          analogWrite(PWMB, 100);
          while(sensor_sayac == 8){Read_Sensor();Normalize();}
        }
      }
   
      if(sensor_sayac == 0)
      {
        if(beyaz_line_pos < 1500)
        {
          motorDIR(0,1);
          analogWrite(PWMA, 100);
          analogWrite(PWMB, 100);
       
          while(sensor_sayac == 0)
          {
            Read_Sensor();
            Normalize();
          }
        }
        else if(beyaz_line_pos > 3500)
        {
          motorDIR(1,0);
          analogWrite(PWMA, 100);
          analogWrite(PWMB, 100);
       
          while(sensor_sayac == 0)
          {
            Read_Sensor();
            Normalize();
          }
        }
        else
        {
          analogWrite(PWMA, 100);
          analogWrite(PWMB, 100);
          while(sensor_sayac == 0){Read_Sensor();Normalize();}
        }
      }
    }
 
  for( i = 0; i <= 5; i++)
    {
      if( sensorNormalize > 50)
      {
        avg = avg + ((float)i * (float)sensorNormalize * 1000);
       
        sum = sum + (float)sensorNormalize;
      }
    }
   
    if( sum == 0)
    {
      sum = 1;
    }
 
    beyaz_line_pos = avg / sum;
   
    avg = 0;
    sum = 0;
   
    for( i = 0; i <= 5; i++)
    {
      sensorNormalize = 1023 - sensorNormalize;
     
      if( sensorNormalize > 50)
      {
        avg = avg + ((float)i * (float)sensorNormalize * 1000);
       
        sum = sum + (float)sensorNormalize;
      }
    }
   
    if( sum == 0)
    {
      sum = 1;
    }
 
    siyah_line_pos = avg / sum;
 
  if((sensor_sayac > black_up) && (sensor_sayac != 5))
  { 
    motorDIR(0,0);
   
    P = (reference_point-siyah_line_pos)*KP;
 
    I = (I+(reference_point-siyah_line_pos))*KI;
                               
 
    D = ((reference_point-siyah_line_pos)-last_error)*KD;
   
    last_error = reference_point-siyah_line_pos;
 
    PID = P + I + D;
   
    if(PID>0){

      sagHiz = maxSpeed - (int)PID;
      solHiz = maxSpeed;
   
      if(sagHiz < 0)
      {
        sagHiz = 0;
      }
    }
 
    if(PID == 0)
    {
      solHiz = maxSpeed;
      sagHiz = maxSpeed;
    }
 
    if(PID<0){
     
      sagHiz = maxSpeed;
      solHiz = maxSpeed + (int)PID;

   
      if(solHiz < 0)
      {
        solHiz = 0;
      }
    }
    analogWrite(PWMA, solHiz);
    analogWrite(PWMB, sagHiz);
  }
 
  if((sensor_sayac < white_down) && (sensor_sayac != 0))
  {   
    motorDIR(0,0);
   
    P = (reference_point-beyaz_line_pos)*KP;
 
    I = (I+(reference_point-beyaz_line_pos))*KI;
                               
 
    D = ((reference_point-beyaz_line_pos)-last_error)*KD;
   
    last_error = reference_point-beyaz_line_pos;
 
    PID = P + I + D;
    if(PID>0){
     
      sagHiz = maxSpeed - (int)PID;
      solHiz = maxSpeed;
     
   
      if(sagHiz < 0)
      {
        sagHiz = 0;
      }
    }
 
    if(PID == 0)
    {
      solHiz = maxSpeed;
      sagHiz = maxSpeed;
    }
 
    if(PID<0){
     
      sagHiz = maxSpeed;
      solHiz = maxSpeed + (int)PID;
     
         
      if(solHiz < 0)
      {
        solHiz = 0;
      }
    }
    analogWrite(PWMA, solHiz);
    analogWrite(PWMB, sagHiz);
  }
 
  if((sensor_sayac == 4) || (sensor_sayac == 2))
  {
    if((sensor_sayac == 4) && (base_black_backup == false))
    {
      if(beyaz_line_pos > reference_point)
      {
        motorDIR(1,1);
        analogWrite(PWMA, 300);
        analogWrite(PWMB, 300);
        delay(200);
        motorDIR(1,0);
        analogWrite(PWMA, 200);
        analogWrite(PWMB, 200);
        while(sensorNormalize[5] < 256)
        {
          Read_Sensor();
          Normalize();
        }
      }
     
      if(beyaz_line_pos < reference_point)
      {
        motorDIR(1,1);
        analogWrite(PWMA, 300);
        analogWrite(PWMB, 300);
        delay(200);
        motorDIR(0,1);
        analogWrite(PWMA, 200);
        analogWrite(PWMB, 200);
        while(sensorNormalize[0] < 256)
        {
          Read_Sensor();
          Normalize();
        }
      }
    }
   
    if((sensor_sayac == 2) && (base_black_backup == true))
    {
      if(siyah_line_pos > reference_point)
      {
        motorDIR(1,1);
        analogWrite(PWMA, 300);
        analogWrite(PWMB, 300);
        delay(200);
        motorDIR(1,0);
        analogWrite(PWMA, 200);
        analogWrite(PWMB, 200);
        while(sensorNormalize[5] > 768)
        {
          Read_Sensor();
          Normalize();
        }
      }
     
      if(siyah_line_pos < reference_point)
      {
        motorDIR(1,1);
        analogWrite(PWMA, 300);
        analogWrite(PWMB, 300);
        delay(200);
        motorDIR(0,1);
        analogWrite(PWMA, 200);
        analogWrite(PWMB, 200);
        while(sensorNormalize[0] > 768)
        {
          Read_Sensor();
          Normalize();
        }
        }
      }
    }
  }
}

void Read_Sensor(){
  for(int i = 0; i <= 5; i++){
    sensor = analogRead(i);
  }
}

void Calibrate(){
  int counter = 0;
 
  for(counter = 0; counter <= 5; counter++){
    sensor[counter] = 0;
    sensorMax[counter] = 0;
    sensorMin[counter] = 0;
    sensorNormalize[counter] = 0;
  }
 
  while(digitalRead(button) != 0)
  {
    Read_Sensor();
    for(counter = 0; counter <= 5; counter++){
      if(sensor[counter] > sensorMax[counter]){
        sensorMax[counter] = sensor[counter];
      }
      if((sensor[counter] < sensorMin[counter]) || (sensorMin[counter] == 0)){
        sensorMin[counter] = sensor[counter];
      }
    }
  }
 
  while(digitalRead(button) == 0);
 
  for(counter = 0; counter <= 5; counter++){
    Serial.print(counter);
    Serial.print("-");
    Serial.print(sensorMin[counter]);
    Serial.print(" - ");
    Serial.println(sensorMax[counter]);
  }
}

int Normalize()
{
  sensor_sayac = 0;
 
  for(int i=0;i<=5;i++){   
    if(sensor<sensorMin){sensorNormalize=0;}
    else if(sensor>sensorMax){sensorNormalize=1023;}
    else{
    sensorNormalize=((sensor-sensorMin)*1023/(sensorMax-sensorMin));} //
    if(sensorNormalize > 400)
    {     
      sensor_sayac++;
    }
  }
 
  if((sensor_sayac > black_up) && (sensor_sayac != 8))
  {
    base_black_backup = base_black;
    base_black = true;
  }
 
  if((sensor_sayac < white_down) && (sensor_sayac != 0))
  { 
    base_black_backup = base_black;
    base_black = false;
  }
  return sensor_sayac;
}

void motorDIR(boolean AI1, boolean BI1){
  if(AI1 == 1){
    digitalWrite(AIN1, 1);
    digitalWrite(AIN2, 0);
  }
  if(AI1 == 0){
    digitalWrite(AIN1, 0);
    digitalWrite(AIN2, 1);
  }
  if(BI1 == 0){
    digitalWrite(BIN1, 1);
    digitalWrite(BIN2, 0);
  }
  if(BI1 == 0){
    digitalWrite(BIN1, 0);
    digitalWrite(BIN2, 1);
  }
}

94onur94

Komutları sen paylaşmazsan kimsede sana yardım etmek için bir şeyler paylaşmaz. Ayrıca kodları görmeden nasıl yardım edelim madem o kadar profesyonel kod yazıyorsun ne diye kodlarda sorun çıkıyor ve müh öğrencisisin arduino ile uğraşmanda ayrı bir PROFESYONELlik :D

umt

Alıntı yapılan: 94onur94 - 13 Ekim 2015, 20:34:27
Komutları sen paylaşmazsan kimsede sana yardım etmek için bir şeyler paylaşmaz. Ayrıca kodları görmeden nasıl yardım edelim madem o kadar profesyonel kod yazıyorsun ne diye kodlarda sorun çıkıyor ve müh öğrencisisin arduino ile uğraşmanda ayrı bir PROFESYONELlik :D
Profesyonel dediysem yeni başlamadım onu kastediyorum . Çok amatörsün dese biri doğrudur derim . Kendimi yorumlayacak kadar bi bilgim yoktur henüz eminim . Arduino dan başka uğraşlarımın olmadığını da nerden çıkardın :) Eğer arduino çöp hiç bişey öğrenme diyosan şuan çöpe atmaya razıyım ?

umt

Nerden ne kaparsam iyi olur benim için mantığıyla hareket ediyorum . Bu pid ile çizgi izleyeni de bitirmeden bırakmak istemiyorum . İlginiz için teşekkürler sandığımdan daha çok ilgilenenler oluyor .

exjra

Tebrikler. Analog multiplexer ile çözebilirsiniz sorununuzu.

Firzen

@umt öncelikle hatanın nerede olduğunu tam biliyor musun? ve Evet 8 sensör kullanabilirsin bunun için çok kanallı ADC Muliplexer var onu denemelisin. Anladığım kadarıyla Arduino UNO kullanıyorsun sana tavsiyem kodunda madem böyle yazılmış git Energia + Stellaris ikilisini kullan demek istediğimi internetten bak anlarsın zaten.
Kararsız...

umt

Alıntı yapılan: Firzen - 13 Ekim 2015, 22:38:25
@umt öncelikle hatanın nerede olduğunu tam biliyor musun? ve Evet 8 sensör kullanabilirsin bunun için çok kanallı ADC Muliplexer var onu denemelisin. Anladığım kadarıyla Arduino UNO kullanıyorsun sana tavsiyem kodunda madem böyle yazılmış git Energia + Stellaris ikilisini kullan demek istediğimi internetten bak anlarsın zaten.
tmm bu dediklerinizi yapıcam . Ama tam olarak nasil bir faydası olucak bunu da belirtirmisiniz ? Nasıl bir yararı yani . Sorunun tam olarak nerede olduğunu çözemedim . Hızını ayarlamaya çalışırken motorun hızını azaltamadim mesela . Değerleri değiştirmeme rağmen .

Firzen

Alıntı yapılan: umt - 13 Ekim 2015, 23:23:53
tmm bu dediklerinizi yapıcam . Ama tam olarak nasil bir faydası olucak bunu da belirtirmisiniz ? Nasıl bir yararı yani . Sorunun tam olarak nerede olduğunu çözemedim . Hızını ayarlamaya çalışırken motorun hızını azaltamadim mesela . Değerleri değiştirmeme rağmen .
öncelikle 6 kanal ADC değil çok çok daha fazla ADC kanalın toplam 40 pinin 80Mhz gibi bir hızım olmuş olacak. Bakınca sende anlarsın zaten 8bit yerine 32bit bir işlemci sonuçta.
Kararsız...