Robotik kodlamadaki hata ne olabilir?

Della.dd

Decipat
Katılım
25 Ağustos 2024
Mesajlar
2.285
Çözümler
22
Daha fazla  
Cinsiyet
Erkek
Kod:
#include "IRremote.h"
// Motor pinleri
int ena = 3;
int enb = 6;
int in1 = 2;
int in2 = 4;
int in3 = 5;
int in4 = 7;
// IR sensör pini
int sensor = A5;
// Buton kodları
String buton_yukari = "E718FF00";
String buton_asagi = "AD52FF00";
String buton_sol = "F708FF00";
String buton_sag = "A55AFF00";
String buton_ok = "E31CFF00";
String kod, sonkod;
void setup() {
  Serial.begin(9600);
  IrReceiver.begin(sensor, 0);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(ena, OUTPUT);
  pinMode(enb, OUTPUT);
}
void ileri() {
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(ena, 255);
  analogWrite(enb, 255);
}
void geri() {
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(ena, 255);
  analogWrite(enb, 255);
}
void sag() {
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(ena, 172);
  analogWrite(enb, 244);
  delay(50);
}
void sol() {
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(ena, 244);
  analogWrite(enb, 172);
  delay(50);
}
void dur() {
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(ena, LOW);
  analogWrite(enb, LOW);
}
void loop() {
  if (IrReceiver.decode()) {
    kod = String(IrReceiver.decodedIRData.decodedRawData, HEX);
    if (kod != "0") {
      sonkod = kod;
    } else {
      kod = sonkod;
    }
    kod.toUpperCase();
    Serial.print("Okunan Kod: ");
    Serial.println(kod);
    if(kod == buton_yukari){ ileri(); }
    else if(kod == buton_asagi){ geri(); }
    else if(kod == buton_sag){ sag(); }
    else if(kod == buton_sol){ sol(); }
    else if(kod == buton_ok){ dur(); }
    else { dur(); }
    IrReceiver.resume();
  }
}

Şimdi bu kodda ben kumandamı tanımladım, üstünde ileri geri sağ sol ve ok var. Sağ sağa döndürücek sol sola döndürücek ileri ileri gittirecek geri ise geri gittirecek arabayı. OK'a basınca da duracak çünkü ileri geri sağ sol tuşlarından herhangi birine basınca motorlar sürekli hareket ediyor ok'a basınca duruyor. Ben sağa ve sola dönerken yavaş olsunlar diye pwm'i kıstım ama bu sefer de dur (OK) tuşu işe yaramadı. Ama ileri geri de çalışıyor onların pwm'i full, yani pwm'i kısınca ok tuşu çalışmıyor.
 
Kodu paylaşırken dil seçmeyi unutmayın. Ayrıca tek satırlık if else döngü vb. kodlarda paranteze almanıza gerek yok. Ek olarak bir değişken üzerinde şartlara bakılacağı zaman switch-case kullanmak okunabilirlik açısından daha iyi. Sensör'den gelen verileri debug ettiğiniz mi? Kodda ilk bakışta bir hata göremedim.
 
Kodu paylaşırken dil seçmeyi unutmayın. Ayrıca tek satırlık if else döngü vb. kodlarda paranteze almanıza gerek yok. Ek olarak bir değişken üzerinde şartlara bakılacağı zaman switch-case kullanmak okunabilirlik açısından daha iyi. Sensör'den gelen verileri debug ettiğiniz mi? Kodda ilk bakışta bir hata göremedim.
Sensörden gelen verileri nasıl debug edeceğim ?
 
Arduino'da kızılötesi kumanda kadar dert bir komponent yok. Büyük ihtimalle sinyal kodu bozuluyordur. Tekrar seri haberleşme ile kodu print edin.
Sadece kumandayı ters bir konumda yani garip tuttuğumda tanımsız kod diyor seri monitörde. Ama dümdüz bir hizada tuttuğumda her tuşu tanımlı, bilmem ne tuşu diye print ediyor. Zaten denerken arkada seri monitör açık oluyor.
 
Tam olarak neyin pwmini kısıyorsunuz?
Sağ ve sola dönerken kullanılan motorların ena enb pwm'ini kısıyorum kodda.
void sag() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(ena, 172); //kıstım
analogWrite(enb, 244); //kıstım
delay(50);
}
void sol() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(ena, 244); //kıstım
analogWrite(enb, 172); //kıstım
delay(50);
Bu //kıstım yazdığım yerlere ena enb'ye 255 verirsem durmama gibi bir durum olmuyor. Oralara 255 veirsem sorun çözülücek ama 255 vermek ıstemıyorum
 
Sağ ve sola dönerken kullanılan motorların ena enb pwm'ini kısıyorum kodda.
void sag() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(ena, 172); //kıstım
analogWrite(enb, 244); //kıstım
delay(50);
}
void sol() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(ena, 244); //kıstım
analogWrite(enb, 172); //kıstım
delay(50);
Bu //kıstım yazdığım yerlere ena enb'ye 255 verirsem durmama gibi bir durum olmuyor. Oralara 255 veirsem sorun çözülücek ama 255 vermek ıstemıyorum
Onu anladım, güç dağıtımında sorun var. Bizim labirent çözen robot ta 140'ta çalışırken 130'a alınca sensörler çalışmıyordu. bu kısmayı az az kademeli olarak yapın bir de. Belli seviyeye kadar durma sorunu olmaması lazım.
 

Technopat Haberler

Yeni konular

Geri
Yukarı