Salve gente, sto muovendo i miei primi piccoli passi nel mondo di Arduino, il mio progetto (da realizzare in tutta calma!) è di realizzare un piccolo tagliaerba automatico che gironzoli per il giradino. L'idea è quella semplicissima dei 2 switch anteriori che rilevano gli ostacoli per far indietreggiare, inclinare e ripartire il piccolo robot. Un programmino funzionante l'ho già scritto, ma mi sono bloccato sulla eventuale pressione di entrambi gli switch in un tempo molto breve (2-300 ms esagerando), per conferirgli in quel caso un comportamento più consono.
//Primo test programma per robot
#define DES_AV 5
#define SIS_AV 7
#define DES_IND 6
#define SIS_IND 9
#define OST_DES 4
#define OST_SIS 12
int ostdes = 0;
int ostsis = 0;
int olddes = 0;
int oldsis = 0;
int statdes = 0;
int statsis = 0;
byte mode = 0;
unsigned long rilOstdes = 0;
unsigned long rilOstsis = 0;
void setup(){
pinMode(DES_AV,OUTPUT);
pinMode(SIS_AV,OUTPUT);
pinMode(DES_IND,OUTPUT);
pinMode(SIS_IND,OUTPUT);
pinMode(OST_DES,INPUT);
pinMode(OST_SIS,INPUT);
}
void loop(){
ostdes = digitalRead (OST_DES); //Legge i pulsanti
ostsis = digitalRead (OST_SIS);
if ((ostdes==HIGH) && (olddes==LOW)){
statdes=1-statdes;
rilOstdes=millis();
delay(25);
}
olddes=ostdes;
if ((ostsis==HIGH) && (oldsis==LOW)){
statsis=1-statsis;
rilOstsis=millis();
delay(25);
}
oldsis=ostsis;
if ((statdes==0) && (statsis==0)){ //Se nessun pulsante è premuto cammina
digitalWrite(DES_AV,HIGH);
digitalWrite(SIS_AV,HIGH);
}else{
if ((statdes==1) && (statsis==0)){ //altrimenti attribuisci a mode un valore relativo alla posizione dell'ostacolo
mode=1;
delay(100);
}
if ((statdes==0) && (statsis==1)){
mode=2;
delay(100);
}
if ((statdes==1) && (statsis==1)){
mode=3;
delay(100);
}
digitalWrite(DES_AV,LOW); //ferma i motori e retrocedi
digitalWrite(SIS_AV,LOW);
delay(500);
digitalWrite(DES_IND,HIGH);
digitalWrite(SIS_IND,HIGH);
delay(700);
digitalWrite(DES_IND,LOW);
digitalWrite(SIS_IND,LOW);
}
switch (mode){
case 1: //se l'ostacolo è a destra gira a sinistra
digitalWrite(DES_AV,HIGH);
delay(500);
digitalWrite(DES_AV,LOW);
delay(100);
mode=0;
statdes=0;
statsis=0;
break;
case 2:
digitalWrite(SIS_AV,HIGH); //se l'ostacolo è a sinistra gira a destra
delay(500);
digitalWrite(SIS_AV,LOW);
delay(100);
mode=0;
statdes=0;
statsis=0;
break;
case 3: //se l'ostacolo è al centro ruota su te stesso
digitalWrite(DES_AV,HIGH);
digitalWrite(SIS_IND,HIGH);
delay(1000);
digitalWrite(DES_AV,LOW);
digitalWrite(SIS_IND,LOW);
delay(100);
mode=0;
statdes=0;
statsis=0;
break;
}
}
questo è il codice scritto fino ad ora, ho fatto diversi tentativi del tipo se millis-rilOstdes<500||millis-rilOstsis&&statdes==0&&statsis==0 ripeti la lettura altrimenti prosegui, ma fino ad ora non ho ottenuto alcun risultato, qualcuno avrebbe la pazienza di darmi qualche indicazione dalla quale sviluppare un codice funzionante? Dimenticavo, ho fatto anche qualche tentativo con while ma nulla...
Vi ringrazio per l'attenzione!