4WD Robot donmaya devam ediyor

Oct 15 2020

Bir süredir 4WD robot üzerinde çalışıyorum. Kullandığım parçalar Arduino v4 shield, l298N sürücü motoru, Hc 05 ultrasonik sensör, DHT 11, mq2, Bluetooth modülü, servo motor, ir verici ve alıcı modülü ve tümü 2 adet 18650 Li ion pil ve bir güç ile çalışan bir uno. banka. Engel algılama ve önleme için yalnızca Ir sensörlerini, yalnızca ultrasonik veya her ikisini birden kullanmayı denediğimde, kod donuyor ve ben engeli uzaklaştırana kadar hiçbir şey çalışmıyor ve ardından robot vermek istediği kararı veriyor. Ayrıca donmuşken ara sıra sıfırlanırdı ancak Arduino'yu ayrı ayrı çalıştırarak bu sorunu çözdüm. Bu sorunun çoğunlukla tüm IR'ler düşük sinyal verdiğinde ortaya çıktığını fark ettim. Sanırım sorun kodumla ilgili, ancak neyi yanlış yazdığımı gerçekten göremiyorum.

#include <dht.h>
#include <Servo.h>

#define servoPin 11

// Create a servo object 
Servo Servo1; 

//Ultrasonic Sensor
#define trigPin 9
#define echoPin 10
// defines variables
long duration;
int distance;

//sensor pins
#define gasSens A4
dht DHT;

#define DHT11_PIN 2

//motor driver pins
#define in1 8
#define in2 7
#define in3 6
#define in4 5

//infared pins
#define lftIr 12
#define ctrIr 4
#define rghIr 3

#define buzzer 13

int dist=1000;
int lastVal=0;
int degVal;
int leftDist;
int rightDist;
int gasVal;
int logicVal=49;
int buzzerTrig=0;
unsigned long curTime;

void setup() {
  // put your setup code here, to run once:
  Servo1.attach(servoPin); 
  Servo1.write(100); 

  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  pinMode(lftIr,INPUT);
  pinMode(ctrIr,INPUT);
  pinMode(rghIr,INPUT);

  pinMode(buzzer, OUTPUT);
  
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);

  curTime=millis();

  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available() > 0){ // Checks whether data is comming from the serial port
      logicVal = Serial.read(); // Reads the data from the serial port
   }
   
 if(millis()-curTime>=10000){
    int chk = DHT.read11(DHT11_PIN);
    gasVal=analogRead(gasSens);
    Serial.print(DHT.temperature);
    Serial.print(" C");
    Serial.print("|");
    Serial.print(DHT.humidity);
    Serial.print("%");
    Serial.print("|");
    Serial.print(gasVal);
    Serial.print("|");
    if(gasVal>500){Serial.println("Dangerous gas levels");buzzerTrig=1;}
    else{Serial.println("normal");buzzerTrig=0;}
    curTime=millis();
  }

 if(buzzerTrig==1){
  buzzerCall();
  logicVal==48;
  }
 
 if(logicVal=='1'){
      dist=distanceCall();
      
      int leftIr=digitalRead(lftIr);
      int centerIr=digitalRead(ctrIr);
      int rightIr=digitalRead(rghIr);
      
      if (leftIr==LOW && rightIr==HIGH){
        stopAll();
        while(leftIr==LOW){
          rightMov();
          leftIr=digitalRead(lftIr);
        }
        stopAll();
       }
       else if (leftIr==HIGH && rightIr==LOW){
        stopAll();
          while(rightIr==LOW){
            leftMov();
            rightIr=digitalRead(rghIr);
          }
        stopAll(); 
      }
      else if (leftIr==LOW && centerIr==LOW && rightIr==LOW){
          stopAll();
              while(leftIr==LOW || centerIr==LOW || rightIr==LOW){
                backMov;
                leftIr=digitalRead(lftIr);
                centerIr=digitalRead(ctrIr);
                rightIr=digitalRead(rghIr);
                }
                stopAll();
          }
          
      else if (leftIr==HIGH && centerIr==LOW && rightIr==HIGH){
          stopAll();
          while(centerIr==LOW){
            backMov;
            centerIr=digitalRead(ctrIr);
          }
          stopAll();
          delay(10);
          leftMov();
          delay(500);
          stopAll();
        }
      else{
        fowardMov();
      }
    }
}

int distanceCall(){
  // Clears the trigPin
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    // Sets the trigPin on HIGH state for 10 micro seconds
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    // Reads the echoPin, returns the sound wave travel time in microseconds
    duration = pulseIn(echoPin, HIGH);
    // Calculating the distance
    distance= duration*0.034/2;
    return distance;
}

void fowardMov(){
  digitalWrite(in2,HIGH);
  digitalWrite(in4,HIGH);
  digitalWrite(in1, LOW);
  digitalWrite(in3, LOW);
}

void backMov(){
  digitalWrite(in1,HIGH);
  digitalWrite(in3,HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in4, LOW);
}

void rightMov(){
  digitalWrite(in1, HIGH);
  digitalWrite(in4, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
}

void leftMov(){
  digitalWrite(in2, HIGH);
  digitalWrite(in3, HIGH);
  digitalWrite(in1, LOW);
  digitalWrite(in4, LOW);
}

void stopAll(){
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

void buzzerCall(){
    tone(buzzer, 5000);
    delay(500);
    noTone(buzzer);
    tone(buzzer, 1000);
    delay(500);
    noTone(buzzer);
 }

Amaç, robotun engellerden kaçınması ve yalnızca IR sensörlerini kullanarak otonom olarak hareket etmesidir. Her şeye pillerle güç verirdim ama bazen sallanıyor ve yavaş hareket ediyor, bu yüzden onları ayrı ayrı çalıştırmaya karar verdim. Sorunun kodumla mı yoksa bir donanım sorunuyla mı ilgili olduğunu düşünüyorsunuz? teşekkür ederim

Yanıtlar

1 user3765883 Oct 16 2020 at 18:38

Çok karmaşık bir sisteme sahip olduğunuz için sorun yaşamanıza şaşırmadım. Karmaşık sistemlerde sorun giderirken, onu çok basit 'parçalara' ayırmak ve her basit parçanın ayrı ayrı çalıştığından emin olmak önemlidir.

Sisteminizden üç IR sensörünün kodu dışındaki her şeyi kaldırır ve 0 ile 7 arasında rastgele bir sayı oluşturmak için rastgele bir sayı üreteci kullanırdım. Ardından, digitalRead için dönüş değerlerini oluşturmak için bu sayının ikili gösterimini kullanırdım. () hangi değerlerin üretildiğini ve bu değerlerin neyin üretildiğini size göstermek için uygun çıktılarla sensörleri çağırır. Sanırım 8 olası değerden bir veya daha fazlasının sorunlara neden olduğunu göreceksiniz, çünkü yalnızca 4 için IF cümlecikleriniz var (veya iki 2 değerli sistemi iki kez sayarsanız 6).