Le robot 4WD continue de geler
#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);
}
L'objectif est que le robot évite les obstacles et se déplace de manière autonome en utilisant uniquement les capteurs IR. J'avais l'habitude d'alimenter tout avec les piles, mais parfois ça tremble et bouge lentement, alors j'ai décidé de les alimenter séparément. Pensez-vous que le problème vient de mon code ou que c'est un problème matériel? Merci
Réponses
Je ne suis pas surpris que vous ayez des problèmes, car vous avez un système très compliqué. Lors du dépannage de systèmes compliqués, il est important de le décomposer en «morceaux» très simples et de s'assurer que chaque élément simple fonctionne séparément.
Je supprimerais tout sauf le code des trois capteurs IR de votre système et utiliserais un générateur de nombres aléatoires pour générer un nombre aléatoire entre 0 et 7. Ensuite, j'utiliserais la représentation binaire de ce nombre pour générer les valeurs de retour pour le digitalRead () appelle les capteurs, avec des impressions appropriées pour vous montrer quelles valeurs ont été générées et quel effet ces valeurs ont produit. Je pense que vous constaterez qu'une ou plusieurs des 8 valeurs possibles posent des problèmes, car vous n'avez que des clauses IF pour 4 (ou 6 si vous comptez deux fois les deux systèmes à 2 valeurs).