Robot 4WD terus membeku

Oct 15 2020

Saya telah mengerjakan robot 4WD untuk sementara waktu sekarang. Bagian yang saya gunakan adalah pelindung Arduino v4, motor driver l298N, sensor ultrasonik Hc 05, DHT 11, mq2, modul Bluetooth, motor servo, modul pemancar dan penerima ir, dan uno semuanya didukung oleh 2 baterai ion 18650 Li dan daya. bank. ketika saya mencoba menggunakan sensor Ir saja, hanya ultrasonik atau keduanya untuk deteksi rintangan dan menghindari kode macet dan tidak ada yang berfungsi lagi sampai saya memindahkan penghalang kemudian robot membuat keputusan yang ingin dibuatnya. itu juga digunakan untuk mengatur ulang sesekali saat dibekukan tetapi saya memperbaiki masalah itu dengan menyalakan Arduino secara terpisah. saya perhatikan masalah ini sebagian besar terjadi ketika semua IR memberikan sinyal rendah. saya pikir masalahnya ada pada kode saya tetapi saya tidak benar-benar melihat apa yang saya ketik salah.

#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);
 }

Tujuannya agar robot menghindari rintangan dan bergerak secara mandiri hanya dengan menggunakan sensor IR. Saya dulu menyalakan semuanya dengan baterai tetapi kadang-kadang bergetar dan bergerak lambat jadi saya memutuskan untuk menyalakannya secara terpisah. Menurut Anda, apakah masalahnya ada pada kode saya atau masalah perangkat keras? Terima kasih

Jawaban

1 user3765883 Oct 16 2020 at 18:38

Saya tidak heran Anda mengalami masalah, karena Anda memiliki sistem yang sangat rumit. Saat memecahkan masalah sistem yang rumit, penting untuk memecahnya menjadi 'potongan' yang sangat sederhana dan memastikan setiap bagian sederhana berfungsi secara terpisah.

Saya akan menghapus semuanya kecuali kode untuk tiga sensor IR dari sistem Anda, dan menggunakan generator angka acak untuk menghasilkan angka acak antara 0 & 7. Kemudian saya akan menggunakan representasi biner dari angka tersebut untuk menghasilkan nilai kembali untuk digitalRead () panggilan ke sensor, dengan cetakan yang sesuai untuk menunjukkan kepada Anda nilai apa yang dihasilkan dan apa efek nilai yang dihasilkan. Saya pikir Anda akan menemukan bahwa satu atau lebih dari 8 nilai yang mungkin menyebabkan masalah, karena Anda hanya memiliki klausa IF untuk 4 (atau 6 jika Anda menghitung dua sistem bernilai 2 dua kali).