4WD Robot donmaya devam ediyor
#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
Ç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).