Stavo lavorando ad un robot che evita ostacoli, ho inoltre aggiunto un sistema per metterlo in "stand by" o attivarlo a distanza, con un telecomando infrarosso. Il problema è questo:
quando lo attivo non schiva gli ostacoli, anzi, prosegue dritto come niente fosse, ma se schiaccio un certo numero di volte (che non è mai costante) sul telecomando il tasto per l' attivazione, inizia a schivare e viaggia autonomamente. Se poi lo rimetto in stand by e successivamente lo riattivo, si ha la stessa situazione di prima.
Il robot ha iniziato a comportasi così solo dopo che ho aggiunto l' attivazione remota, prima funzionava correttamente.
Mi dareste una mano? io sto impazzendo
Grazie mille!!!
(forward() e right() sono funzioni che ho aggiunto in una tab)
// libreria, sensore di distanza e comunicazione IR
#include <DistanceGP2Y0A21YK.h>
#include <IRremote.h>
//
// led di stato:
int green = 4;
int red =5;
boolean idle = true;// fa rimanere acceso il led rosso all' avvio
//
// motori
#define motsx 6 //il pin del motore snistro
#define Dirsx 7 //controlla la direzione del motore sinistro
#define motdx 11 //il pin del motore destro
#define Dirdx 13 //controlla la direzione del motore destro
//
// IR stuff
#define RECV_PIN 3 //stabilisce il pin del ricevitore
IRrecv irrecv(RECV_PIN); //crea un oggetto per la decodifica
decode_results dati; //consente la decodifica del codice ir
//
// Distance stuff
int distance; // variabile che memorizza la distanza
DistanceGP2Y0A21YK Dist;
//
void setup() {
// motori
pinMode(motdx,OUTPUT);
pinMode(motsx,OUTPUT);
pinMode(Dirsx,OUTPUT);
pinMode(Dirdx,OUTPUT);
// LEDs
pinMode(green,OUTPUT);
pinMode(red,OUTPUT);
//
//Sceglie il pin del sensore di distanza
Dist.begin(A0);
//
// avvia il ricevimento ir
irrecv.enableIRIn();
//
Serial.begin(9600);
}
//IL MAIN PROGRAM
void loop() {
// stampa il codice dicevuto dal telecomando
if (irrecv.decode(&dati)) {
Serial.print(dati.value, HEX);
irrecv.resume(); // Receive the next value
}
// stand by all' avvio
if(idle == true)
{
digitalWrite(red,HIGH);
}
// se si preme "ON" sul telecomando
if (dati.value == 0xF7C03F ) {
digitalWrite(green,HIGH);
digitalWrite(red,LOW);
idle = false;
distance = Dist.getDistanceCentimeter();
if (distance >=8) {
forward();
}
else {
right();
}
}
// se si preme "OFF"
if (dati.value == 0xF740BF )
{
digitalWrite(green,LOW);
digitalWrite(red,HIGH);
fermo();
}
}