Curs per a professors d’Introducció a LEGO® Mindstorms NXT i EV3

(versió 4.6)

 

UNITAT 11. Com esperar a que es compleixin una o més condicions de sensors.

 

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.

 

Unitat 11 exercici 1: Esperar a pressionar el sensor de contacte.

 

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.

 

Unitat 11 exercici 2: Esperar a més d’una condició.

 

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...

  1. Cal explícitament aturar el programa al final de cada seqüència per impedir que la resta de seqüències segueixin funcionant.
  2. Cada seqüència repeteix tots els blocs d’acció, en el nostre cas, arrencar el motor durant una rotació. Cal intentar reduir el codi repetit sempre que sigui possible.
  3. Però més important, què passarà si immediatament després de pressionar el sensor de contacte, el sensor de color detecta negre? El motor girarà més d’una rotació!

 

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.

 

 

 

Creative Commons License

Curs d'introducció a LEGO® Mindstorms NXT i EV3 by Josep Maria Fargas is licensed under a Creative Commons Reconocimiento-No comercial-Compartir bajo la misma licencia 3.0 España License.

Permissions beyond the scope of this license may be available at www.bogatech.org.