servomotori

ho programmato i motori per andare avanti e quando trova l’ostacolo gira destra, ma io voglio che faccia entrambe le direzioni mi aiutate
io ho scritto questo programma:
#include <Servo.h>

// creazione degli oggetti servo
Servo MotoreSinistro;
Servo MotoreDestro;

const int periodoStampaSuSeriale = 250; // stampa sulla Serial Monitor ogni 1/4 di secondo
unsigned long ritardoSuSeriale = 0;

const int periodoLoop = 20; // un periodo di 20 ms = una frequenza di 50Hz
unsigned long ritardoLoop = 0;

// specifica i pin di trig e echo usati per il sensore ad ultrasuoni
const int TrigPin = 8;
const int EchoPin = 9;

int distanza; // distanza rilevata dal sensore
int durata; // durata dell’eco rilevata dal sensore ad ultrasuoni
int minimaDistanza = 10; // distanza di soglia a cui il robot deve cambiare direzione
unsigned long tempoRotazioneSx = 1100; // 1,1 secondi (circa) per effettuare una rotazione di 90°
// variare questo valore in funzione nel caso la rotazione non sia perfettamente di 90°

// definizione degli stati
#define VAI_AVANTI 0
#define GIRA_SX 1

int stato = VAI_AVANTI; // 0 = vai avanti (DEFAULT), 1 = gira a sinistra

void setup()
{
Serial.begin(9600); // configurazione dei pin Arduino a cui colleghiamo il sensore
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);

MotoreSinistro.attach(11);
MotoreDestro.attach(10);
}

void loop()
{
printOutput(); // stampa un messaggio di debug sulla Serial Monitor

if(millis() - ritardoLoop >= periodoLoop)
{
letturaSensoreUltrasuoni(); // legge e memorizza la distanza misurata

azioneRobot();

ritardoLoop = millis();
}
}

void azioneRobot()
{
if(stato == VAI_AVANTI) // non viene rilevato nessun ostacolo
{
if(distanza > minimaDistanza || distanza < 0)
// non è presente nessun ostacolo di fronte al sensore
// nota: la distanza rileata può assumere valori negativi se non è presente nessun ostacolo di fronte
{
// vai avanti
MotoreDestro.write(180);
MotoreSinistro.write(0);
}
else // se ci sono oggetti di fronte gira a sinistra
{
stato = GIRA_SX;
}
}
else if(stato == GIRA_SX) // viene rilavato un ostacolo, il robot gira a sinistra
{
unsigned long tempoRotazioneSx = 1100; // ci voglion circa 1,1 secondi per ruotare di 90°
unsigned long tempoInizioRotazione = millis(); // memorizziamo l’istante in cui incomincia la rotazione

while((millis()-tempoInizioRotazione) < tempoRotazioneSx) // il robot ruota a sinistra fino a quando non sono passati 1,1 secondi
{
// gira a sinistra
MotoreDestro.write(180);
MotoreSinistro.write(180);
}
stato = VAI_AVANTI;
}
}

void letturaSensoreUltrasuoni()
{
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10); // mantiene alto il trigger per almeno 10us
digitalWrite(TrigPin, LOW);

durata = pulseIn(EchoPin, HIGH);
distanza = (durata/2)/29;
}

void printOutput()
{
if((millis() - ritardoSuSeriale) > periodoStampaSuSeriale)
{
Serial.print("distanza: ");
Serial.print(distanza);
Serial.print("cm: ");
Serial.println();

ritardoSuSeriale = millis();
}
}
mi aiutate a fare entrambe le direzioni cioè la prima volta a sinistra e l’altra a destra
:slight_smile:

Prima di tutto, nella sezione in lingua Inglese si può scrivere SOLO in Inglese … quindi, per favore, la prossima volta presta più attenzione, poi, essendo questo il tuo primo post, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO

… infine, in conformità al suddetto regolamento, punto 7, devi editare (in basso a destra del post, bottone More → Modify) il tuo post e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.

Guglielmo

P.S.: Il tuo post è stato spostato nell’opportuna sezione del forum “Italiano”

majkel95:
ho programmato i motori per andare avanti e quando trova l'ostacolo gira destra, ma io voglio che faccia entrambe le direzioni mi aiutate

mi aiutate a fare entrambe le direzioni cioè la prima volta a sinistra e l'altra a destra

Innanzi tutto spero che quando trova un ostacolo non solo giri a sx o dx ma faccia anche un piccolo passo indietro.
anche solo pochi cm.
Per il girare, devi avere una variabile globale. Valori accettati 1 o 2. Ovvero GIRA_SX e GIRA_DX
Quando trovi ostacolo se la variabile:

  • vale 1 allora giri a dx e la poni a 2
  • vale 2 allora giri a sx e la poni a 1

Logicamente devi fare il define di GIRA_DX e l'if per il gira a dx