quando l'erba cresce e la disperazione del sabato " help"

salve a tutti premetto che sono nuovo e mi sono presentato ho un problema " terzo motore " ,
la mi invenzione sarebbe di fare un rasa erba con

arduino uno r3

sensori ultrasuoni HC-SR04 tre frontali

motore ruote{

motorduttori dc
Modello 4632-370
Materiale Metallo
Tensione d’ingresso (V) DC 12V
Rapporto di riduzione del rallentatore 1: 200
Nessuna velocità di carico (RPM) 30
Corrente di carico (mA) ≤60
Coppia nominale (kg.cm) 4,0 Kg.cm
Velocità nominale (RPM) 22
Corrente nominale (A) ≤0.5
Coppia di stallo ≥ 9,0 Kg.cm
stallCurrent (A) 1.3
Adatto a RF-370

x 2 Modulo scheda driver L298N doppio ponte H

batteria da 26.400 mah BL-18650 14.8 v + segnalatore buzzer livello batteria

x2 DC Convertitori Boost 2A Modulo Alimentazione Elettrica 2V-24V

eccolo il mio problema per taglio erba

Motore GW370 DC 12V 120rpm per la compilazione del codice mi serve che parte dopo 5 sec. della partenza del robot io ho provato a scrivere il codice
se cortesemente mi date una mano ringrazio anticipatamente

tagliaerba.ino (4.1 KB)

aggiungendo nel piano sottostante un sensore a infrarossi per i pozzetti scolo acqua

incremento nuova funzione motori

// accelera da zero a 255
for (int i = 0; i < 256; i++)
{
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}

>luky802ita: anche se si stratta di poche righe, ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

eccolo mi da troppi errori

  const int trigPin1 = A0;
  const int echoPin1 = A1;
  const int trigPin2 = A3; 
  const int echoPin2 = A4;
  const int trigPin3 = A2;
  const int echoPin3 = A5;
  const int in1 = 9;// motore dx
  const int in2 = 8;
  const int in3 = 4;//motore sx
  const int in4 = 3;
  const int enA = 5;
  const int enB = 6;
  const int in6 = 10; //motore lama 
  const int in5 = 11;
  const int enA2 = 12;
 #define PWM 125
 #define PWM2 150
 #define DIS 15
void setup()
 {
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);

  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);

  pinMode (in1, OUTPUT);
  pinMode (in2, OUTPUT);
  pinMode (in3, OUTPUT);
  pinMode (in4, OUTPUT);
  pinMode (enA, OUTPUT);
  pinMode (enB, OUTPUT);
  pinMode (in5, OUTPUT);
  pinMode (in6, OUTPUT);
  pinMode (enA2, OUTPUT);
 
  // accelera da zero a 255
  for (int i = 0; i < 256; i++)
  {
    analogWrite(enA, i);
    analogWrite(enB, i);
    delay(20);
  } 

void motorelame  ();
     {
      delay(5000)
      digitalWrite(in6, HIGH);//ACENSIONE MOTORE LAMA DOPO 5 SEVONDI DEL AVVIO 
      digitalWrite(in5, LOW);
      analogWrite(enA2, PWM2);
     }
  
void loop()
{
 if ( FrontSensor() < DIS && RightSensor () <DIS && LeftSensor
()<DIS) // ostacolo davanti a tutti e 3 i lati
 {
 reverse ();
//quindi invertire
 }
 else if (FrontSensor() <DIS && RightSensor () <DIS && LeftSensor
()>DIS) // ostacolo sui lato destro e anteriore
 {
 turn_left ();
// girare a sinistra
 }
 else if (FrontSensor() <DIS && RightSensor () >DIS && LeftSensor
()<DIS) // ostacolo sui lato sinistro e anteriore 
 {
 turn_right ();
// girare a destra
 }
 else if (FrontSensor() <DIS && RightSensor () >DIS && LeftSensor
()>DIS) // ostacolo difronte
 {
 turn_right ();
// quindi girare a destra
 }
 else if (FrontSensor() >DIS && RightSensor () >DIS && LeftSensor
()<DIS) // ostacolo sul lato sinistro 
 {
 turn_right ();
// quindi girare a destra e poi in avanti
 delay(100);
 forward();
 }
 else if (FrontSensor() >DIS && RightSensor () <DIS && LeftSensor
()>DIS) // ostacolo sul lato destro
 {
 turn_left ();
// quindi girare a sinistra e poi avanti
 delay(100);
 forward();
 }
 else
 {
 forward();
 }
}
void forward ()
{
 digitalWrite(in1, HIGH);
 digitalWrite(in2, LOW);
 digitalWrite(in3, HIGH);
 digitalWrite(in4, LOW);
 analogWrite(enA, PWM);
 analogWrite(enB, PWM);
}
void turn_left ()
{
 digitalWrite(in1, HIGH);
 digitalWrite(in2, LOW);
 digitalWrite(in3, LOW);
 digitalWrite(in4, HIGH);
 analogWrite(enA, PWM);
 analogWrite(enB, PWM);
}
void turn_right ()
{
 digitalWrite(in1, LOW);
 digitalWrite(in2, HIGH);
 digitalWrite(in3, HIGH);
 digitalWrite(in4, LOW);
 analogWrite(enA, PWM);
 analogWrite(enB, PWM);
}
void reverse ()
{
 digitalWrite(in1, LOW);
 digitalWrite(in2, HIGH);
 digitalWrite(in3, LOW);
 digitalWrite(in4, HIGH);
 analogWrite(enA, PWM);
 analogWrite(enB, PWM);
}
void stop()
{
 digitalWrite(in1, LOW);
 digitalWrite(in2, LOW);
 digitalWrite(in3, LOW);
 digitalWrite(in4, LOW);
 analogWrite(enA, LOW);
 analogWrite(enB, LOW);
}
long FrontSensor ()
{
long dur;
 digitalWrite(trigPin1, LOW);
 delayMicroseconds(5); // sono richiesti ritardi perche sensore sia di successo
 digitalWrite(trigPin1, HIGH);
 delayMicroseconds(10); // è richiesto anche questo ritardo!
 digitalWrite(trigPin1, LOW);
 dur = pulseIn(echoPin1, HIGH);
 return (dur/58);// converti la distanza in centimetri.
}
long RightSensor ()
{
long dur;
 digitalWrite(trigPin2, LOW);
 delayMicroseconds(5); // sono richiesti ritardi perche sensore sia di successo
 digitalWrite(trigPin2, HIGH);
 delayMicroseconds(10); //è richiesto anche questo ritardo!
 digitalWrite(trigPin2, LOW);
 dur = pulseIn(echoPin2, HIGH);
 return (dur/58);// converti la distanza in centimetri.
}
long LeftSensor () 
{
long dur;
 digitalWrite(trigPin3, LOW);
 delayMicroseconds(5); // sono richiesti ritardi perche sensore sia di successo
 digitalWrite(trigPin3, HIGH);
 delayMicroseconds(10); // è richiesto anche questo ritardo!
 digitalWrite(trigPin3, LOW);
 dur = pulseIn(echoPin3, HIGH);
 return (dur/58);// converti la distanza in centimetri.
}

Informazioni, la lama deve partire dopo cinque secondi dall'avvio del robot=accensione oppure dopo cinque secondi che le ruote hanno iniziato a girare=robot fuori dalla docking station?
Chiesto questo iniziamo con i problemi:
Il codice che hai postato non compila neppure senza errori il setup non è chiuso, la funzione che hai scritto ha un nome errato edit: già fatta la mofifica nel tempo della mia risposta, manca il punto e virgola dopo il delay e soprattutto se non la richiami mai come può fare ciò che desideri?
Aggiungo qualche suggerimento di base anche se non mi sono mai cimentato nel realizzare un robot rasaerba, in tutti qui casi dove è necessario svolgere più azioni (quasi) "contemporaneamente" i delay non li devi neanche prendere in considerazione ovvero anche se tu inserissi la chiamata alla tua funzione, il robot parte in avanti, entri nella fuznione che aspetta 5 secondi e poi fa partire la lama nel frattempo se un ostacolo si manifesta davanti al robot essendo Arduino bloccato nel delay non permetterà la rilevazione dello stesso e l'intervento da parte della logica portando il robot a scontrarsi con l'ostacolo. Stessa considerazione se il robot si ribalta o qualcuno lo solleva è imperativo fermare la lama immediatamente se ciò avviene quando sei bloccato in un delay la lama non siferma e il riscio di infortunio e quasi una certezza.
Poi metterei le letture dei vari sensori in altrettante variabili, altrimenti ad ogni if valutato reinterroghi i sensori, credo sia più efficente in termini di tempistiche effettuare le letture e sfruttare le variabili contenete i risultati dei vari sensori negli if

fabpolli:
Informazioni, la lama deve partire dopo cinque secondi dall'avvio del robot=accensione oppure dopo cinque secondi che le ruote hanno iniziato a girare=robot fuori dalla docking station? ....

mi potresti dare una mano, aggiungendo un giroscopio o un sensore anti ribaltamento se cortesemente mi puoi fare una correzione del codice , 5 sec. dopo lavvio delle ruote

Ho tolto un po’ di errori formali: spazi di troppo, spazi assenti, parentesi mancanti… Adesso viene compilato, però rimangono tutti gli errori concettuali.

const int trigPin1 = A0;
  const int echoPin1 = A1;
  const int trigPin2 = A3; 
  const int echoPin2 = A4;
  const int trigPin3 = A2;
  const int echoPin3 = A5;
  const int in1 = 9;// motore dx
  const int in2 = 8;
  const int in3 = 4;//motore sx
  const int in4 = 3;
  const int enA = 5;
  const int enB = 6;
  const int in6 = 10; //motore lama 
  const int in5 = 11;
  const int enA2 = 12;
 #define PWM 125
 #define PWM2 150
 #define DIS 15
void setup()
 {
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);

  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);

  pinMode (in1, OUTPUT);
  pinMode (in2, OUTPUT);
  pinMode (in3, OUTPUT);
  pinMode (in4, OUTPUT);
  pinMode (enA, OUTPUT);
  pinMode (enB, OUTPUT);
  pinMode (in5, OUTPUT);
  pinMode (in6, OUTPUT);
  pinMode (enA2, OUTPUT);
 }
  void motore_lama() 
     {                       //ACENSIONE MOTORE LAMA DOPO 5 SEVONDI DEL AVVIO 
      delay(5000);
      digitalWrite(in6, HIGH);
      digitalWrite(in5, LOW);
      analogWrite(enA2, PWM2);
     }
  
void loop()
{
 if ( FrontSensor() < DIS && RightSensor () <DIS && LeftSensor()<DIS) // ostacolo davanti a tutti e 3 i lati
 {
 reverse();
//quindi invertire
 }
 else if (FrontSensor() <DIS && RightSensor () <DIS && LeftSensor
()>DIS) // ostacolo sui lato destro e anteriore
 {
 turn_left();
// girare a sinistra
 }
 else if (FrontSensor() <DIS && RightSensor () >DIS && LeftSensor
()<DIS) // ostacolo sui lato sinistro e anteriore 
 {
 turn_right();
// girare a destra
 }
 else if (FrontSensor() <DIS && RightSensor () >DIS && LeftSensor
()>DIS) // ostacolo difronte
 {
 turn_right();
// quindi girare a destra
 }
 else if (FrontSensor() >DIS && RightSensor () >DIS && LeftSensor
()<DIS) // ostacolo sul lato sinistro 
 {
 turn_right ();
// quindi girare a destra e poi in avanti
 delay(100);
 forward();
 }
 else if (FrontSensor() >DIS && RightSensor () <DIS && LeftSensor
()>DIS) // ostacolo sul lato destro
 {
 turn_left();
// quindi girare a sinistra e poi avanti
 delay(100);
 forward();
 }
 else
 {
 forward();
 }
}
void forward()
{
 digitalWrite(in1, HIGH);
 digitalWrite(in2, LOW);
 digitalWrite(in3, HIGH);
 digitalWrite(in4, LOW);
 analogWrite(enA, PWM);
 analogWrite(enB, PWM);
}
void turn_left()
{
 digitalWrite(in1, HIGH);
 digitalWrite(in2, LOW);
 digitalWrite(in3, LOW);
 digitalWrite(in4, HIGH);
 analogWrite(enA, PWM);
 analogWrite(enB, PWM);
}
void turn_right()
{
 digitalWrite(in1, LOW);
 digitalWrite(in2, HIGH);
 digitalWrite(in3, HIGH);
 digitalWrite(in4, LOW);
 analogWrite(enA, PWM);
 analogWrite(enB, PWM);
}
void reverse()
{
 digitalWrite(in1, LOW);
 digitalWrite(in2, HIGH);
 digitalWrite(in3, LOW);
 digitalWrite(in4, HIGH);
 analogWrite(enA, PWM);
 analogWrite(enB, PWM);
}
void stop()
{
 digitalWrite(in1, LOW);
 digitalWrite(in2, LOW);
 digitalWrite(in3, LOW);
 digitalWrite(in4, LOW);
 analogWrite(enA, LOW);
 analogWrite(enB, LOW);
}
long FrontSensor()
{
long dur;
 digitalWrite(trigPin1, LOW);
 delayMicroseconds(5); // sono richiesti ritardi perche sensore sia di successo
 digitalWrite(trigPin1, HIGH);
 delayMicroseconds(10); // è richiesto anche questo ritardo!
 digitalWrite(trigPin1, LOW);
 dur = pulseIn(echoPin1, HIGH);
 return (dur/58);// converti la distanza in centimetri.
}
long RightSensor ()
{
long dur;
 digitalWrite(trigPin2, LOW);
 delayMicroseconds(5); // sono richiesti ritardi perche sensore sia di successo
 digitalWrite(trigPin2, HIGH);
 delayMicroseconds(10); //è richiesto anche questo ritardo!
 digitalWrite(trigPin2, LOW);
 dur = pulseIn(echoPin2, HIGH);
 return (dur/58);// converti la distanza in centimetri.
}
long LeftSensor() 
{
long dur;
 digitalWrite(trigPin3, LOW);
 delayMicroseconds(5); // sono richiesti ritardi perche sensore sia di successo
 digitalWrite(trigPin3, HIGH);
 delayMicroseconds(10); // è richiesto anche questo ritardo!
 digitalWrite(trigPin3, LOW);
 dur = pulseIn(echoPin3, HIGH);
 return (dur/58);// converti la distanza in centimetri.
}

P.S.:
const int trigPin1 = A0;
come viene interpretato?.. Come esadecimale? Se è così, vale 160…

>luky802ita: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce. Gli utenti da device "mobile" ringrazieranno per la cortesia :wink:

Ho quindi editato io il tuo post più sopra ...

Guglielmo

P.S.: Rileggi inoltre con attenzione il mio post #3 ... perché NON hai fatto quanto richiesto ...

Una mano te la do volentieri ma rispettando il regolamento del forum punto 16 (16.1 nello specifico), quindi ti posso dire che ti consiglio di procedere per gradi ovvero, elimina il delay della funzione, metti nel loop la chiamata alla funzione dopo cinque secondi dall'avvio delle ruote, per farlo dovrai usare la funzione millis, per capire le basi con cui si usa millis() consiglio prima la lettura di QUESTO post esplicativo, dopo di che lo studio di come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... alla fine il tutto dovrebbe essere più chiaro :slight_smile:
Mi spiace farti scontrare con la dura realtà ma credo tu stia puntando un poco in alto per le tue conoscenze attuali, hai già difficoltà nelle basi del C e, francamente, le sfide che stanno dietro al robot rasaerba sono non indifferenti perché anche se tu percorressi semplicemente il perimetro alla ricerca di ostacoli poi dovrai implementare tutta la logica per rasare la parte interna e non è semplice come cosa, anche perché le cose "furbe" che di solito vengono in mente tipo posizione GPS o simili non offrono adeguata precisione, così come calcolare la posizione del robot basandosi sul tempo di accensione dei motori (le ruote slittano), ma non volgio dire di abbandonare, solo che prima di procedere con un progetto così complesso forse è meglio farsi le ossa con progetti "didattici" più semplici che ti permettano di padroneggiare le singole componenti singole (Es. giroscopio, millis, ecc.)

fabpolli:
... poi dovrai implementare tutta la logica per rasare la parte interna e non è semplice come cosa, anche perché le cose "furbe" che di solito vengono in mente tipo posizione GPS o simili non offrono adeguata precisione, così come calcolare la posizione del robot basandosi sul tempo di accensione dei motori (le ruote slittano) ...

... e difatti, i VERI robot taglia erba (ma anche i vari robot aspirapolvere) NON usano alun meccanismo "posizionale" (a parte le barriere perimetrali) , ma si muovono con un movimento simile al "moto browniano", ovvero causale che, statisticamente, gli permette di coprire l'intera superficie in un certo tempo X.

Guglielmo

Scusate… Come ho scritto nel messaggio modificato:

const int trigPin1 = A0;
come viene interpretato?.. Come esadecimale? Se è così, vale 160…

Diciamo pure che “in” non è molto appropriato per un’uscita che comanda un motore, così come “en” che sembra un’abilitazione (enable), visto che parecchio è scritto in inglese…

A0 è una define costante definita, credo nel file hardware/arduino/avr/variants/standard/pins_arduino.h se non erro e per la uno dovrebbe essre definita così:
static const uint8_t A0 = 14;

Datman:
.... Come ho scritto nel messaggio modificato:

const int trigPin1 = A0;
come viene interpretato?... Come esadecimale? Se è così, vale 160...

Impossibile, nessun compilatore, senza lo 0x davanti lo interpreterebbe come un hex!

Viene interpretato come è definito, o una variabile di nome A0 o una costante (come nel caso di Arduino e come ti ha ben specificato fabpolli) :wink:

Guglielmo

gpb01:
una costante di nome A0 (come ti ha ben specificato fabpolli)

Ok, Capo! :slight_smile:

gpb01:
ma si muovono con un movimento simile al "moto browniano", ovvero causale che, statisticamente, gli permette di coprire l'intera superficie in un certo tempo X.

Guglielmo

Si e no. Si nel senso che molti rasaerba a basso costo fanno csì e va bene per la maggior parte delle casistiche e si nel senso di far capire che farli bene non è tre motori e due sensori collegati.
No invece nel senso che alcuni rasaerba evoluti, e un pochino costosi, mappano la zona da rasare e sfruttano algoritmi per rasare zone del prato ad intervalli ben determinati e con percorsi che massimizzano la resa finale del prato... tipo quelli che fanno alcuni miei colleghi :slight_smile: ma non conosco l'hw usato e.. no no credo ci sia una classe Arduino per gestire la complessità

scusate la mia ignoranza ho 200 metri quadri di giardino con 7 alberelli il robottino avrà un rettangolo 20 x 10 la mia idea era di farlo andare a caso sotto la mia sorveglianza con tre sensori per non farlo sbattere in giro con un pulsante di emergenza per togliere la corrente un rasa erba spartano per iniziare ;2 mesi che studio arduino e c++ :wink: mi scuso per la mia ignoranza

luky802ita:
2 mesi che studio arduino e c++ :wink: mi scuso per la mia ignoranza

Non scusarti dell'ignoranza, nessuno è nato imparato e nessuna sa tutto di tutto è solo che più volte è capitato , a me in primis con i miei primi progetti, di sparare alto e incastrarmi senza vie d'uscita un po' perché si è portati a credere che grazie ad Arduino sia tutto semplice, cosa non vera. Quindi bene che tu ti sia prefisso un obiettivo, altrettanto bene che tu voglia un robottino per una tua specifica esigenza "semplice" ovvero che non debba contemplare tutti i casi possibili ma resta il fatto che due mesi di studio non significano nulla, potresti essere un super esperto di C e due mesi studio della piattaforma Arduino essere un enormità, essere un neofita del C e/o dell'elettronica e quindi due mesi sarebbero una goccia nel mare oppure una qualsiasi sfumaruta tra questi due estremi. Sta di fatto che se non sei pratico e cerchi di arrivare all'pbiettivo senza padroneggiare le varie parti del progetto andrai poco lontano e/o ti servirà molto molto più tempo che non imparare le varie basi per usare le varie componenti in progetti separati e poi riunire il tutto in un progetto complesso. Almeno io la penso così e per i miei progetti mi attengo a questa strategia, sto affrotando una cosa nuova che non conosco (Es. giroscopio) bene progettini didattici isolati finché non ho capito come usarlo e poi metto in piedi la cosa nel progetto reale, va da se che tutte le parti che conosco (chessò uso di millis, come pilotare un motore, ecc.) le implemento direttamente nel progetto finale, proprio perché conoscendole parto da una base che mi permetterà di incappare in pochi errori progettuali/logici.

fabpolli:
le implemento direttamente nel progetto finale, proprio perché conoscendole parto da una base che mi permetterà di incappare in pochi errori progettuali/logici.

grazie per la tua risposta e possibile realizzare il mio progetto con 3 sensori . per il ritardo 5 secondi con millis ho letto ho capito . mi potresti compilare il codice in logica che forse per me e un po troppo complesso ti ringrazio anticipatamente

luky802ita:
.... mi potresti compilare il codice in logica che forse per me e un po troppo complesso ti ringrazio anticipatamente

Non voglio sembrare scortese, ma ... ti è già stato fatto il riferimeto al punto 16.1 del REGOLAMENTO. Noi qui aiutiamo a correggere quanto gli utenti scrivono, ma non forniamo la "pappa fatta" ... ciascuno deve studiare e poi provare a realizzare quello che vuole e, se ha dubbi o commette errori, noi cerchiamo di aiutarlo :slight_smile:

Se non hai mai sviluppato su Arduino, o hai sviluppato molto poco, puoi cominciare con studiare QUESTO proseguire con QUESTO ed acquistare qualche buon libro (es. QUESTO) ... dopo di che puoi scrivere il tuo programma, metterlo qui e chiedere aiuto sui punti che non ti funzionano o che non capisci. :wink:

Guglielmo