Robot 4WD terus membeku
#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
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).