Go Down

Topic: Robottino inseguitore di percorso prestabilito (Read 426 times) previous topic - next topic

240605

Salve,
Volevo chiedere consiglio per quanto riguarda la parte software di un progetto per realizzare un robot.

Mi chiedevo se fosse possibile comandare un motore, attraverso transistor, in modo che resti acceso per un determinato periodo di tempo che deciderei io all'interno della programmazione.

In pratica vorrei creare un percorso programmato da far eseguire al robottino, stabilendo per quanto tempo debba andare dritto, quando girare a sinistra...

grazie in anticipo

gpb01

Buonasera,  :)
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :)

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell'apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)
Search is Your friend ... or I am Your enemy !

gpb01

#2
Apr 29, 2020, 10:59 am Last Edit: Apr 29, 2020, 10:59 am by gpb01
Il cross-posting è proibito da regolamento, quindi ... NON aprire più threda sullo stesso argomento!  Hai posto qui la domanda, ti sei presentato, ora, pazientemente aspetta e vedi se qualcuno ha qualche risposta da darti ...

Guglielmo
Search is Your friend ... or I am Your enemy !

Arco_500

Potresti anche farti un programma per spostare il robot per un certo tempo ma se il motore trova un attrito maggiore potrebbe rallentarlo e il percorso fatto può ridursi.
Puoi anche fargli seguire una banda nera con una maggiore precisione o altre cose ancora.
Precisa meglio quello che vuoi fare e ottenere.

240605

#4
Apr 29, 2020, 12:34 pm Last Edit: Apr 29, 2020, 01:43 pm by 240605
Buongiorno,
Grazie della tua risposta, ora proverò ad essere un po' più chiaro.

il mio progetto sarebbe quello di creare un robottino telecomandato a IR che, ad esempio, quando si schiaccia un determinato tasto del telecomando, segua un percorso che ho programmato nell' IDE.

Ad esempio quando schiaccio il tasto 1, il robottino dovrebbe andare dritto per 10 secondi, poi girare a sinistra, andare di nuovo dritto per 5 secondi e fermarsi.

Per fare ciò, mi servirebbe un codice che permetta ai motori di restare accesi per un determinato periodo di tempo.

La prima proposta è la più adatta, ma come faccio a creare un programma che mi permetta di spostare il robottino per un determinato periodo di tempo?

Grazie

maubarzi

#5
Apr 29, 2020, 03:16 pm Last Edit: Apr 29, 2020, 03:18 pm by maubarzi
Puoi tranquillamente alimentare un motore per un certo tempo, basta pilotare il driver che alimenta il motore con un segnale gestito da arduino che attivi o disattivi a tempo.
Devi tarare bene i tempi per fargli fare le curve in modo da alimentare un solo motore o entrambi in modo opposto per fargli fare le curve dell'angolo richiesto.

Come pensavi di collegarli i motori?

Serve precisione nel seguire il percorso? Perchè il problema espresso da Arco_500 esiste.
Questo il primo sito che mi è saltato fuori da una rapida ricerca, giusto per darti qualche spunto iniziale.

Maurizio
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

240605

Avrei intenzione di collegare i due motori ad Arduino attraverso due transistor irf520.
Per quanto riguarda la parte della programmazione del pilotaggio dei due motori, l'ho già realizzata includendo il senso di marcia e la velocità dei motori ma non riesco a comprendere quale codice e quale comando utilizzare nello specifico, per alimentare un pin di Arduino con un segnale attivato e disattivato a tempo.

Nel percorso servirebbe precisione ma comunque il terreno su cui dovrebbe andare il robottino sarebbe sempre lo stesso, con lo stesso attrito e quindi non puó rallentare.

Detto ció chiedo se esiste un modo per programmare il percorso che dovrebbe eseguire il robottino.

Buona serata,
Valerio

Arco_500

Per far funzionare i motori in entrambe le direzioni devi usare un ponte a H o appositi integrato tipo L298N (ATTENZIONE questi tipi di integrato hanno una corrente massima che può circolare occorre scegliere il modello corretto. Occorre conoscere le caratteristiche del motore).

240605

Il mio problema è che non so come alimentare i due motori per un periodo di tempo che decido io, in modo che quando prema un interruttore o dia al robottino un segnale, I due motori si a accendano e si spengano dopo tot secondi...

Arco_500

Al circuito del motore (ponte h o integrato) arrivano 2 fili, oltre i 2 di alimentazione, provenienti da arduino.
Questi 2 fili permettono al motore di girare in un senso o nell'altro.
Sarà arduino, tramite apposito programma, trasmettere i segnali corretti per alimentare i motori per il tempo necessario.

maubarzi

#10
Apr 29, 2020, 09:19 pm Last Edit: Apr 29, 2020, 09:21 pm by maubarzi
diciamo che un motore lo piloti con un dispositivo collegato ad un pin di arduino.
Se l'uscita è alta il motore parte e se l'uscita è bassa il motore di ferma.
Per attivare e disattivare usi digitalWrite(pin, value);

in testa al programma puoi definire una cosa del tipo:

Code: [Select]

#define MOTORE 3 // Pin che comanda il motore
#define ACCESO HIGH // Giusto per non incasinarsi con HIGH e LOW
#define SPENTO LOW


nel loop, opportunamente temporizzati metti

Code: [Select]

digitalWrite(MOTORE, ACCESO);
e
digitalWrite(MOTORE, SPENTO);


Per temporizzare puoi crearti un array dove indicare il tempo che deve trascorrere prima di cambiare lo stato del motore.

Code: [Select]

byte tempi[]={5,1,2,10,1,10};


Alla fine le due definizioni ACCESO e SPENTO potrebbero anche non servire.

Definisci una variabile globale da usare come l'indice di scorrimento dell'array dei tempi.

Code: [Select]

byte indice = 0;


Nel loop usando millis, fai una cosa del genere

Code: [Select]

void loop() {
  if (millis() - lastMillis > tempi[indice] * 1000) {
    digitalWrite(MOTORE, !digitalRead(MOTORE)); // Inverte il valore dell'uscita
    indice++; // Incremento l'indice dell'array così al prossimo giro leggo il valore successivo.
    lastMillis = millis(); // Resetto il riferimento per iniziare a contare il nuovo intervallo
  }
}


Ho omesso un po' di cose perchè quanto ho scritto ti deve servire come spunto, perchè se dovevo scriverti proprio tutto io... :smiley-sad-blue:
Ad es. ho omesso la definizione di lastMillis che è un unsigned long e la sua inizializzazione, il controllo per non sforare la dimensione dell'array, parti per attivare la sequenza a comando, ecc.

Spero di averti un po' inquadrato la questione, poi prova a mettere insieme tu il programma definitivo e vedi se ti capisci, in caso contrario chiedi pure.

Maurizio
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

maubarzi

Con il ponte H (che sarebba un modo giusto di pilotare i motori di questo tipo), devi gestire 2 uscite e ti permette anche la retromarcia, oltre a start e stop, per cui va opportunamente esteso quello che ho scritto, ma non è complicato se capisci il meccanismo.
Potresti gestire un secondo array con lo stesso numero di elementi, che accetti valori -1, 0 e 1 o i valori che preferisci, per indicare, giro all'indietro, stop, giro in avanti (termini che hanno un senso se calati sul robottino per facilitare la comprensione del moto desiderato, ma puoi chiamarli come vuoi e rappresentarli come vuoi).
Inoltre, se hai due motori, dovrai duplicare tutto per gestire indipendentemente i due motori, per permettere le curve, dove avrai un motore con un moto e l'altro fermo o con il moto opposto.

Maurizio
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

240605

Ok grazie per la risposta.
Ci proverò
Buona serata

Go Up