3 Sensörlü mini sumo kod

Kodla Büyü
Mesajlar
3
Merhaba arkadaşlar ilk defa MEB robot yarışmasına katılacağız robotun donanım kısmını bitirdim çok uyumlu güzel oldu fakat yazılım konusunda ihtiyacım var
malzemelerim
NANOZADE robotik kartı
FS-80 cisim sensörü x3
QTR 1-A çizgi sensörü 2x
6v 1000 rpm 1.5 kg tork motor 2x(11.4 v da kullanılacak)
11.4v 3c 400 mah batarya
SLT 20 silikon tekerler
Arduino nano
Arkadaşlar malzemelerim bunlar fakat kendi yazdığım kodlar biraz sapıttırıyor robotu kodlarımı atsam mini sumo robottan anlayan hocalarım bana yardım'da bulunsa sevinirim

Kodlarım
#define solpwm1 3
#define solpwm2 11
#define sagpwm1 9
#define sagpwm2 10

#define solqtr A0
#define sagqtr A3
#define solsensor 12
#define onsensor 8
#define sagsensor A5


#define led_buzzer 13
#define button 7
#define ir 2

#define DS1 4
#define DS2 5
#define DS3 6

int qtr = 900;
int irr=0;
int Speed = 254;
int MaxSpeed = 255; // Idle Speed while no sensor giving data.
int LastValue = 5; // Last Value Variable for remembering last Opponent sensor sense.

void setup()
{

pinMode(solpwm1, OUTPUT);
pinMode(solpwm2, OUTPUT);
pinMode(sagpwm1, OUTPUT);
pinMode(sagpwm2, OUTPUT);

pinMode(solqtr, INPUT_PULLUP);
pinMode(sagqtr, INPUT_PULLUP);
pinMode(solsensor, INPUT_PULLUP);
pinMode(onsensor, INPUT_PULLUP);
pinMode(sagsensor, INPUT_PULLUP);


pinMode(led_buzzer, OUTPUT);
pinMode(button, INPUT_PULLUP);
pinMode(ir, INPUT);

pinMode(DS1, INPUT_PULLUP);
pinMode(DS2, INPUT_PULLUP);
pinMode(DS3, INPUT_PULLUP);


digitalWrite(led_buzzer, LOW);
digitalWrite(solpwm1, LOW);
digitalWrite(solpwm2, LOW);
digitalWrite(sagpwm1, LOW);
digitalWrite(sagpwm2, LOW);

//Serial.begin(9600);
tone(led_buzzer, 200, 350);
delay(300);
noTone(led_buzzer);

tone(led_buzzer, 300, 200);
tone(led_buzzer, 4000, 500);
noTone(led_buzzer);

}


void loop() {



Wait:




if (digitalRead(solsensor) == LOW || digitalRead(onsensor) == LOW || digitalRead(sagsensor) == LOW) {
digitalWrite(led_buzzer, HIGH);
} else {
digitalWrite(led_buzzer, LOW);
}


if (digitalRead(ir)==1) {
irr=1;

/*for (int i = 0; i < 6; i++) {
Set_Motor(0, 0, 1);
tone(led_buzzer, 523, 200);
delay(200);
noTone(led_buzzer);
delay(600);
}*/

if (digitalRead(DS1) == 0 && digitalRead(DS2) == 1 && digitalRead(DS3) == 1) {
//Serial.print("sola dön");
Set_Motor(-100, 100, 120);
Set_Motor(80, 80, 20);
LastValue = 7 ;
}

else if (digitalRead(DS1) == 0 && digitalRead(DS2) == 0 && digitalRead(DS3) == 1) {
// Serial.print("sola açı");
Set_Motor(40, 80, 120);
LastValue = 7;
}

else if (digitalRead(DS1) == 1 && digitalRead(DS2) == 1 && digitalRead(DS3) == 0) {
// Serial.print("Sag");
Set_Motor(100, -100, 120);
Set_Motor(80, 80, 20);
LastValue = 3;
}
else if (digitalRead(DS1) == 1 && digitalRead(DS2) == 0 && digitalRead(DS3) == 0) {
//Serial.print("saga açı");
Set_Motor(80, 40, 120);

LastValue = 3;
}
else if (digitalRead(DS1) == 0 && digitalRead(DS2) == 0 && digitalRead(DS3) == 0) {
//Serial.print("saga açı");
Set_Motor(40, 40, 100);

LastValue = 3;
}


noTone(led_buzzer);
goto Start;
}


if (digitalRead(button) == 0) {

for (int i = 0; i < 6; i++) {
Set_Motor(0, 0, 1);
tone(led_buzzer, 523, 200);
delay(200);
noTone(led_buzzer);
delay(600);
}

if (digitalRead(DS1) == 0 && digitalRead(DS2) == 1 && digitalRead(DS3) == 1) {
//Serial.print("sola dön");
Set_Motor(-100, 100, 120);
Set_Motor(80, 80, 20);
LastValue = 7 ;
}

else if (digitalRead(DS1) == 0 && digitalRead(DS2) == 0 && digitalRead(DS3) == 1) {
// Serial.print("sola açı");
Set_Motor(40, 80, 170);
LastValue = 7;
}

else if (digitalRead(DS1) == 1 && digitalRead(DS2) == 1 && digitalRead(DS3) == 0) {
// Serial.print("Sag");
Set_Motor(100, -100, 120);
Set_Motor(80, 80, 20);
LastValue = 3;
}
else if (digitalRead(DS1) == 1 && digitalRead(DS2) == 0 && digitalRead(DS3) == 0) {
//Serial.print("saga açı");
Set_Motor(80, 40, 170);

LastValue = 3;
}
else if (digitalRead(DS1) == 0 && digitalRead(DS2) == 0 && digitalRead(DS3) == 0) {
//Serial.print("saga açı");
Set_Motor(40, 40, 100);

LastValue = 3;
}


noTone(led_buzzer);
goto Start;
}

goto Wait;


Start:

if (digitalRead(ir)==0 && irr==1) {
Set_Motor(0, 0, 1);
irr=0;
goto Wait;

}


if (analogRead(solqtr)>600 && analogRead(sagqtr)>600 ){


if (digitalRead(onsensor) == LOW) {
Set_Motor(MaxSpeed, MaxSpeed, 1);
digitalWrite(led_buzzer, HIGH);
} else if (digitalRead(solsensor) == LOW) {
Set_Motor(-102, 102, 1);
digitalWrite(led_buzzer, HIGH);
LastValue = 7;
} else if (digitalRead(sagsensor) == LOW) {

Set_Motor(102, -102, 1);
digitalWrite(led_buzzer, HIGH);
LastValue = 3;
} else
{

digitalWrite(led_buzzer, LOW);

if (LastValue == 7) {
Set_Motor(-102, 102, 2);
} else // Left Turning Based on SPD (A7) Trimpot

if (LastValue == 3) {
Set_Motor(102, -102, 2); // Right Turning Based on SPD (A7) Trimpot
}

}

}else

if (analogRead(solqtr)<600 && analogRead(sagqtr)>600 ){
Set_Motor(-102, -102, 150);
Set_Motor(102, -102, 100);
//LastValue=3;
digitalWrite(led_buzzer, LOW);
}else

if (analogRead(solqtr)>600 && analogRead(sagqtr)<600 ){
Set_Motor(-102, -102, 150);
Set_Motor(-102, 102, 100);
// LastValue=7;
digitalWrite(led_buzzer, LOW);
}else

if (analogRead(solqtr)<600 && analogRead(sagqtr)<600 ){
if (LastValue==3){
Set_Motor(-102, -102, 150);
Set_Motor(102, -102, 100);
//LastValue=3;
digitalWrite(led_buzzer, LOW);
}else

if (LastValue==7){
Set_Motor(-102, 0, 150);
Set_Motor(-102, 0, 100);
//LastValue=7;
digitalWrite(led_buzzer, LOW);
}



}




goto Start;
}



void Set_Motor (float Lval, float Rval, int timex) {
Lval = Lval * 2.5;
Rval = Rval * 2.5;

if (Lval >= 0) {
analogWrite(solpwm1,LOW );
digitalWrite(solpwm2,Lval );
} else {
Lval= abs(Lval);
digitalWrite(solpwm1,Lval);
analogWrite(solpwm2, LOW );
}

if (Rval >= 0) {
analogWrite(sagpwm1, Rval);
digitalWrite(sagpwm2, LOW);
} else {
Rval= abs(Rval);
digitalWrite(sagpwm1, LOW);
analogWrite(sagpwm2, Rval);
}
delay(timex);
}
 
Hocam nacizane birkaç fikir vereyim. Kodu detaylı inceleme fırsatım olmadı ama birincisi taktik switchlerinin bir kez kontrol edilmesi yeterli, neden iki defa kontrol ediyorsunuz. İkincisi cisim sensörlerini tek tek kontrol etmek için farklı bir kod kullanmalısınız yada her durum için robotun ne yapacağını açıkça yazmalısınız. 3 sensör için 8 farklı durum oluşur. Üçüncüsü eğer şaseyi de aynı yerden aldıysanız muhtemelen helon dedikleri şasedir,( eğer şase o ise) o şasenin yanları boş qtr lar açıkta kalıyor yarışma ortamında ışıktan etkileniyor, tavsiyem ya qtrları izole edin yada hiç qtr kullanmayın(hatta bana sorarsanız kullanmayın çünkü 1000 rpm motor tam güçte çalışırken çizgiyi görüp geri dönmez)
 
Hocam nacizane birkaç fikir vereyim. Kodu detaylı inceleme fırsatım olmadı ama birincisi taktik switchlerinin bir kez kontrol edilmesi yeterli, neden iki defa kontrol ediyorsunuz. İkincisi cisim sensörlerini tek tek kontrol etmek için farklı bir kod kullanmalısınız yada her durum için robotun ne yapacağını açıkça yazmalısınız. 3 sensör için 8 farklı durum oluşur. Üçüncüsü eğer şaseyi de aynı yerden aldıysanız muhtemelen helon dedikleri şasedir,( eğer şase o ise) o şasenin yanları boş qtr lar açıkta kalıyor yarışma ortamında ışıktan etkileniyor, tavsiyem ya qtrları izole edin yada hiç qtr kullanmayın(hatta bana sorarsanız kullanmayın çünkü 1000 rpm motor tam güçte çalışırken çizgiyi görüp geri dönmez)
Hocam evet helon şasesi QTR kullanmak yerine ne kullanabilirim
 
Hocam evet helon şasesi QTR kullanmak yerine ne kullanabilirim
Kodunuzu şimdi inceleme fırsatım oldu. MEB yarışması için buton kontrolü yapmanıza gerek yok yarışma kumanda ile başlar ir kontrolü yaptırmanız yeterli veya üstteki if te ir veya button aktif ise başla diyebilirsiniz iki ayrı kontrol yapmanıza gerek yok. Buton ile başlayan yarışma çok nadir genelde yarışmalar kumanda ile başlar butonla başlanan yarışmalarda da genelde butona basıldıktan sonra bir kaç saniye bekleyip başlar yarışma. QTR meselesine gelince beyaz algılamak için kontras sensörü kullanmalısınız burada sorun yok. Piyasada QTR ile aynı işi yapan sensörler de var (ml1 var mesela robotus'ta qtr ile aynı işi yapar biraz daha küçüktür.) ama hepsi ışıktan etkilenir. Bir şekilde qtr sensörü izole edin(şasenin kenarlarını ışık geçmeyecek şekilde kapatmak epey etkili oluyor) ama ben yerinizde olsam beyaz çizgiyi hiç takmam, qtr da kullanmam. Dediğim gibi 1000 rpm motoru zaten durduramazsınız robot siz geri git diyene kadar zaten çıkar pistten ki zaten siz rakibi bulduktan sonra kenar çizgiyi algılamaya ihtiyacınız yok.
 
Kodunuzu şimdi inceleme fırsatım oldu. MEB yarışması için buton kontrolü yapmanıza gerek yok yarışma kumanda ile başlar ir kontrolü yaptırmanız yeterli veya üstteki if te ir veya button aktif ise başla diyebilirsiniz iki ayrı kontrol yapmanıza gerek yok. Buton ile başlayan yarışma çok nadir genelde yarışmalar kumanda ile başlar butonla başlanan yarışmalarda da genelde butona basıldıktan sonra bir kaç saniye bekleyip başlar yarışma. QTR meselesine gelince beyaz algılamak için kontras sensörü kullanmalısınız burada sorun yok. Piyasada QTR ile aynı işi yapan sensörler de var (ml1 var mesela robotus'ta qtr ile aynı işi yapar biraz daha küçüktür.) ama hepsi ışıktan etkilenir. Bir şekilde qtr sensörü izole edin(şasenin kenarlarını ışık geçmeyecek şekilde kapatmak epey etkili oluyor) ama ben yerinizde olsam beyaz çizgiyi hiç takmam, qtr da kullanmam. Dediğim gibi 1000 rpm motoru zaten durduramazsınız robot siz geri git diyene kadar zaten çıkar pistten ki zaten siz rakibi bulduktan sonra kenar çizgiyi algılamaya ihtiyacınız yok.

Hocam peki buton olayını nasıl silicem yani silince kodlar bozuluyor ne yapmalıyım bi de QTR leri makaron ile kapladık ışıktan az etkilensin diye
 
Hocam peki buton olayını nasıl silicem yani silince kodlar bozuluyor ne yapmalıyım bi de QTR leri makaron ile kapladık ışıktan az etkilensin diye
Hocam butonu okutup kontrol ettiğiniz blogu silerseniz sorun olmaz dursa da sorun yok sadece fazladan kod olur. Qtr cinstir hocam makaron la nasıl yaptınız bilmiyorum ama sensör kapanmayacak şekilde düzgün izole edilmesi lazım
 
Geri
Üst