top of page

CICLI E CONDIZIONI

Giulia

Giulia C.

Hey,

Sono Giulia e in questa lezione ti insegnerò ha ad utilizzare i blocchi di controllo per creare dei cicli ripeti.

​

Nella prima parte programmeremo un robot per muoversi fino a quando non rileva la presenza di una linea nera tramite il sensore di colore.

​

Successivamente programmeremo alcuni movimenti attraverso i cicli ripeti. 

Il risultato che otterremo è lo stesso di quello ottenuto con il semplice blocco Muovi dritto per ma questo lavoro ci serve per poter intervenire sul controllo dei movimenti tramite i sensori.

 

Dei movimenti controllati ci occuperemo pero nelle lezioni successive quando avrai preso dimestichezza con i blocchi di controllo
 

Introduzione

Per prima cosa impareremo ad usare i sensori di colore/luce riflessa per arrestare il robot sopra ad una line nera.

​

​Avrai semplicemente bisogno di qualcosa di nero da appoggiare alla superficie dove il robot si muoverà.​

​

Questa volta non ci sarà un percorso, ma il robot dovrà muoversi in linea retta fino a raggiungere una condizione pre-impostata, ovvero il cambio di percezione del colore. 

​​​​​

blocchi sensori

Arresto sulla linea

Come per la scorsa lezione, partiamo inserendo blocchi per le condizioni di partenza, impostando i motori e la velocità di movimento.

​Impostiamo inoltre l'arresto degli Stack con il pulsante sinistro.

​​

Lo scopo è quello di utilizzare un blocco Ripeti fino a quando per avviare il movimento fino a quando la luce riflessa è minore di un certo valore (10% in più di quelli percepito sul nero) a quel punto il ciclo si interrompe e il movimento viene arrestato.

​​

Proseguiamo inserendo il blocco Ripeti fino a quando​

All'interno dell'apposito spazio inserisci un blocco Sensore che utilizzi il sensore di luce riflessa, come quello nell'immagine. Impostiamo la porta collegata al sensore (nel nostro caso A) e cambiamo il valore della luce riflessa. Per sapere qual è il valore giusto posiziona il sensore sopra ad una superficie nera e osserva il valore rilevato dal sensore, a quel valore (nel nostro caso 20%) è sempre meglio aggiungere un 10% per essere sicuri che, anche quando il robot si sta muovendo velocemente, percepisca il nero.

blocchi sensori

Il valore che hai inserito è un valore che potresti dover utilizzare più volte in diverse parti del tuo programma, inoltre è un valore che potresti dover modificare durante la programmazione perché ti accorgi che non è il valore ottimale.

Per evitare di modificare questo valore manualmente in tutte le parti del programma ti consiglio di creare una variabile a cui assegnare questo valore. Modificando il valore della variabile verrà modificato in automatico il valore di questo parametro in tutti i blocchi in cui lo hai utilizzato.

Per prima cosa crea una variabile e chiamala “Riflesso di Arresto”.

All’avvio del programma setta il valore di questa variabile al valore desiderato e inserisci la variabile come parametro delle tue condizioni di arresto.

blocchi sensori
blocchi sensori

Concludiamo inserendo un blocco Avvia Movimento all'interno del ciclo e un blocco Arresta movimento subito dopo.

Quando eseguirai il programma il robot continuerà ad avviare il movimento fino a quando non raggiunge una superficie nera, a quel punto i clicli si interrompe e la CPU passerà all'operazione successiva che nel nostro caso è un arresta movimento.

blocchi sensori
blocchi sensori
blocchi sensori

Arresto a tempo

La condizione di uscita a tempo è molto utilizzata in First lego League, noi la utilizziamo quando vogliamo appoggiarci ad una â€‹â€‹â€‹parete o a un modello di missione. Quando il robot si appoggia ad una struttura infatti le ruote potrebbero rimanere bloccare rendendo inefficace la condizione a rotazioni.

​

Cominciamo di nuovo dal nostro blocco Ripeti fino a quando​

Questa volta inserisci l’operatore logico di maggiore all’interno della condizione di uscita del blocco.

Inserisci il valore misurato dal timer che trovi nei sensori nel primo slot del operatore logico mentre nel secondo imposta il tempo desiderato.

blocchi sensori

Quando utilizziamo il timer interno del nostro Hub dobbiamo ricordarci che questo ha iniziato a misurare il tempo da quando abbiamo avviato il programma. per garantire quindi un corretto funzionamento di questa condizione di uscita dobbiamo assicurarti che il timer venga riavviato prima di avviare il nostro ciclo.

Per farlo posiziona in blocco Reimposta timer prima del ciclo ripeti.

Concludiamo il programma inserendo come prima i due blocchi Avvia movimento e Arresta Movimento.

Con questo codice abbiamo creato un programma che fa muovere il robot per un numero di secondi pari a quello che inseriamo nello spazio bianco.

blocchi sensori
blocchi sensori
blocchi sensori
blocchi sensori

Arresto a rotazioni

La condizione di arresto che si basa sulle rotazioni delle ruote è sicuramente più affidabile di quella a tempo perché la misura dello spazio percorso è una misura diretta.

Lo spazio percorso in determinato lasso ti tempo infatti dipende anche dalla velocità del robot. In particolare la velocità può variare leggermente a seconda del livello di carica e questo comporta delle imprecisioni.

 

Per realizzare questa condizione ripartiamo dal blocco Ripeti fino a quando in cui abbiamo inserito la condizione logica di maggiore ed inseriamo Posizione relativa ricordandoci di selezionare uno dei due motori di movimento.

 

Un errore comune nella realizzazione di questa condizione è la scelta del blocco “posizione” anzi che il blocco “posizione relativa”.

Il primo blocco misura la posizione assoluta del motore e quindi azzera il conteggio alla fine di ogni giro mentre il secondo conta l’angolo in gradi rispetto alla posizione iniziale conteggiando anche valori superiori a 360°.

blocchi sensori

Il conteggio dei gradi rispetto alla posizione iniziale può essere sia positivo che negativo, dipende dal verso di rotazione delle nostre ruote.

Usare la sola condizione maggiore non può funzionare quando il motore si sposta verso angoli negativi. In questo caso infatti la condizione non si verificherebbe mai ed il ciclo si ripeterebbe all’infinito

 

Il modo più semplice per risolvere questo problema è inserire un valore assoluto alla misura della posizione relativa. Grazie a questo infatti il valore che andremo a confrontare sarà positivo indipendentemente dal fatto che la ruota giri in senso orario o antiorario.

 

Il blocco valore assoluto lo troviamo come ultimo blocco della sezione operatori.

Prendi questo blocco e inserisci al suo interno la misura della posizione relativa

blocchi sensori

Durante alcune manovre il robot potrebbe muoversi utilizzando una sola ruota, per questo motivo non possiamo affidarci soltanto alla misura di una delle due.

Calcoliamo quindi la media tra le posizioni relative delle due ruote.

blocchi sensori

Il valore della misura della posizione dei motori è in gradi e quindi nel secondo slot nel blocco Maggiore di dovremmo inserire un valore in gradi.

Per lavorare con numeri più piccoli e tangibili possiamo effettuare una conversione che ci permette di utilizzare le rotazioni.

Per utilizzare questo come parametro ci basta moltiplicare il numero di rotazioni che vogliamo eseguire per l’angolo giro (360°).

​

Per finire dobbiamo reimpostare la posizione relativa prima di iniziare il ciclo proprio come avevamo fatto per il timer.

Inseriamo il blocco “porta posizione relativa dei motori A+B su 0.
concludiamo aggiungendo i comandi avvia movimento e arresta movimento.​

blocchi sensori

Il codice che abbiamo scritto ci permette di muovere il robot avanti e indietro di un numero di rotazioni che inseriamo nello spazio bianco.

blocchi sensori
blocchi sensori
blocchi sensori
blocchi sensori

Movimenti controllati

I programmi che abbiamo realizzato in questa lezione non sono utili se utilizzati direttamente in questo modo, per muovere il robot di un certo numero di rotazione o per un intervallo di tempo possiamo affidarci ai blocchi Muovi per. 

Questi programmi che abbiamo scritto avviano ripetutamente il movimento sempre nello stesso modo. Nelle prossime lezioni li aggiorneremo in modo che i valori di velocità e traiettoria possano cambiare ad ogni iterazione del ciclo per rispondere alle nostre esigenze di programmazione.

bottom of page