Curs per a professors d’Introducció a LEGO® Mindstorms NXT i EV3
(versió 4.6)
El Bloc Espera és un dels blocs més simples del programari EV3, i proporciona una de les més simples estructures de control de flux. La seva funció bàsica és pausar l’execució d’un programa fins que es compleixi una condició particular, i aleshores continuar amb el programa. Per exemple, “esperar a que es pressioni el sensor de contacte”, “esperar a que el sensor de color detecti el negre” o “esperar tres segons”.
Però i si volem que un programa esperi fins que ocorrin qualsevol de dues (o més) condicions possibles? Per exemple, “esperar fins que O BÉ el sensor de color detecti negre O BÉ a que es pressioni el sensor de contacte”.
Aquesta unitat didàctica explica com està construit el Bloc Espera en el programari EV3, les seves avantatges i limitacions, i com expandir les seves funcionalitats de programació però amb més condicions.
En l’exemple següent, el programa espera a que el sensor de contacte es pressioni per arrencar un motor durant una rotació.
Esperar a que el sensor de contacte es pressioni per arrencar un motor
Anem a “debugar” o depurar el programa per entendre com els seus blocs es processen internament. Quan arrenca el programa anterior executant el primer bloc, atura immediatament la seva execució i espera a que el sensor de contacte sigui pressionat. Aleshores, immediatament després a que es pressioni el sensor de contacte, el programa continua la seva seqüència, en aquest cas, arrenca un motor durant una rotació i s’atura.
Encara que aquesta estructura de control de flux és molt útil per escursar un programa simple, molts altres llenguatges de programació no tenen quelcom directament equivalent.
Com podem obtenir la mateixa funcionalitat del bloc espera sense utilitzar-lo? La resposta és simple.
Suggeriment: Un bloc Espera és en realitat un bucle que es repeteix fins que es compleix una determinada condició. Està ocult a l’usuari, però si poguéssim veure com el bloc Espera està implementat en el programari EV3, seria equivalent al bloc Bucle en aquest exemple...
Implementació del Bloc Espera a Contacte utilitzant un bucle buit per arrencar un motor
Observem que un bucle pot estar buit!
Si volem que un motor funcioni indefinidament, podem fer-ho amb un bloc espera? La resposta és sí encara que no de forma elegant, necessitem posar el bloc Motor abans que el bloc Espera i associar aquest a una condició que mai es pugui complir, tal com es mostra a continuació.
Arrencar un motor indefinidament o esperar a pressionar el sensor de contacte
En el cas que volguem utilitzar el sensor de contacte per aturar el motor amb precisió, podem millorar aquest programa afegint, just després del bloc Espera a Contacte, un bloc Motor Off configurat per frenar o “Brake”.
Arrencar un motor fins que es pressioni el sensor de contacte i després frenar el motor
Com podem obtenir la mateixa funcionalitat amb un bucle?
Arrencar un motor fins que es pressioni el sensor de contacte
Suggeriment: Un bloc Bucle es pot configurar com a infinit o il·limitat. És a dir, el bucle mai no acabarà (a no ser que s’utilitza un bloc Interruptor de Bucle en una altra part del programa).
Arrencar un motor per sempre utilitzant un bucle infinit buit
Aquesta solució és potser més elegant que l’anterior utilitzant un bloc Espera, perquè? Perquè fa explícit que el bucle es repetirà infinitament... Observem que un bloc Espera no es pot configurar per una espera infinita!
Considerem el següent programa i quina és la seva diferència amb el programa anterior.
Arrencar un motor per sempre utilitzant un bucle infinit
Els dos programs són equivalents, però quines són les seves diferències? El primer programa arrenca el bloc Motor només una vegada, però el segon segueix arrencant el bloc Motor a cada iteració del bucle. Encara que això sigui menys eficient, és potser més fàcil de llegir i entendre. Aquest estil de programació és molt més útil per “debugar” o depurar programes llargs.
Imaginem que ara volem esperar a que O BÉ es pressioni el sensor de contacte O BÉ es detecti el color negre per ALESHORES arrencar un motor. Podem esperar a que es compleixi més d’una condició utilitzant blocs Espera? Podem fer el següent, però no és elegant i té les seves limitacions... Necessitem tenir una seqüència de programa per a cada sensor i utilitzar blocs de Parada de Programa (o blocs “Stop Program”) per forçar la sortida del programa un cop qualsevol de les seqüències ha acabat...
Esperar a les condicions dels sensors de contacte o de color per arrencar un motor, utilitzant blocs espera
Encara que el programa anterior funciona correctament en algunes situacions, té els seus problems...
Com podem scriure un programa millor? Cal utilitzar un bucle. Fer que el bucle sigui explícit per una condició d’espera és molt útil si tenim més d’una condició.
Suggeriment: Un bloc Bucle es pot configurar per agafar un valor lògic. Així es poden utilitzar blocs Lògics per controlar-lo. Això és particularment útil si volem manejar més d’una condició.
Per exemple, per esperar fins que O BÉ es pressioni el sensor de contacte O BÉ que es detecti el color negre, cal connectar els resultats dels sensors a un bloc Lògic OR que, al seu torn, es connecta a la condició de finalització de l’estructura del Bucle...
Esperar a les condicions dels sensors de contacte O de color per arrencar un motor
Alternativament, podem esperar a que es compleixin les dues condicions utilitzant un bloc Lògic AND.
Esperar a les condicions dels sensors de contacte Y de color per arrencar un motor
Si volem afegir més condicions, només cal utilitzar més blocs Lògics per connectar en cadena les sortides dels resultats de comparació dels sensors als blocs Lògics, i connectar la última al connector lògic d’entrada del bloc Bucle.
Coneixements adquirits: Amb aquesta unitat didàctica els estudiants adquiriran un coneixement més profund de com funciona un bloc espera i de com està implementat en el programari Mindstorms EV3. A més, aprendran a utilitzar bucles com estructures de control de flux o bé associades a un sensor, infinites, o lògiques, aprendran com utilitzar seqüències paral·leles de programa i un ús específic del bloc “stop program” d’aturada de programa.
Podeu també trobar aquesta unitat didàctica a la pàgina web de legoengineering.com.