Curs per a professors d’Introducció a LEGO® Mindstorms NXT i EV3
(versió 4.5)
Un dels aspectes més obvis i fonamentals, però que els alumnes no sempre entenen, de la relació entre el programari (software) i el maquinari (hardware) d’un robot té a veure amb la velocitat d’execució d’ambdós i la seva relació. En aquesta unitat didàctica estudiarem el funcionament intern d’un rastrejador simple de dues passes amb un sol sensor de llum o de color, que ja hem programat anteriorment. És un exemple molt simple però que pot ajudar a entendre i a programar correctament altres situacions.
Una de les funcionalitats més importants de la robòtica i de la informàtica és la capacitat d’enregistrar informació per analitzar-la en temps real o en diferit. Més endavant en aquest curs veurem com podem utilitzar la pantalla del maó intel·ligent per visualitzar missatges i lectures dels sensors mentre el robot realitza determinades tasques. Però en determinades situacions, no és factible aturar el robot per llegir la seva pantalla i cal, o bé enregistrar les dades per analitzar-les a posteriori, o bé visualitzar-les en temps real des de l’ordinador, si aquest està connectat al maó intel·ligent.
Aquesta unitat didàctica explica en detall el concepte de registre de dades o “data logging” mitjançant l’accés a fitxers de forma manual, la gestió d’aquests fitxers des del programari mitjançant “uploads” i “downloads”, i la consulta i anàlisi posterior dels mateixos. S’utilitzen conversions de dades, lògica i cables de dades per controlar el flux del programa.
També s’aprofita la introducció al concepte de “data logging” per utilitzar la capacitat del programari Mindstorms, heretada de LabVIEW, que permet enregistrar dades de forma automàtica per visualitzar-les de forma gràfica en la pantalla de l’ordinador. Aquesta capacitat de generar i relacionar les diferents corbes de les lectures dels sensors en funció del temps s’anomena “experiment” i pot ser extremadament útil en moltes i diverses situacions. Tant el software LEGO Mindstorms NXT-G com EV3 inclouen una interfície dedicada a la visualització del registre de dades o “data logging” que aquesta unitat explica amb un cert detall, ja que és molt útil per entendre amb profunditat i relacionar millor diversos conceptes de forma gràfica.
Finalment, cal puntualitzar que el registre de dades o “data logging” pot ser una forma molt útil de “debugging” o depuració informàtica d’un programa, donat que permet, en moltes ocasions, entendre molt millor el flux informàtic d’un programa i les raons de la presa de decisions del mateix, com per exemple, el funcionament d’una bifurcació dins un bucle.
Una mica de teoria
Si estudiem amb una mica de detall el funcionament del rastrejador inicial de la unitat didàctica 5, que es mostra en la figura a continuació, ens podem preguntar quants cops el programa passa per cadascuna de les opcions de la bifurcació abans de canviar d’opció, mentre dura el bucle temporal del nostre exemple.
Rastrejador simple de dues passes amb un sensor de llum (NXT)
Rastrejador simple de dues passes amb un sensor de color, amb blocs Motor (EV3)
Rastrejador simple de dues passes amb un sensor de color, amb bloc Move Tank (EV3)
En els exemples anteriors els motors utilitzen una potència de 40% en NXT i 30% en EV3, per evitar moviments massa bruscos, i el bucle temporal té una durada de 10 segons. En EV3, el bloc bifurcació o “Switch” està associat al sensor de Color amb el mode “Compare – Reflected Light Intensity”. En el següent exemple, el sensor de Color utilitza el mode “Measure – Color” per mesurar el color.
Rastrejador simple de dues passes amb un sensor de color amb mode “Measure – Color” (EV3)
Suggeriment: En el cas d’utilitzar el sensor de Color amb mode “Measure – Color”, mesurar el color, és important seleccionar el cas per defecte de la bifurcació, per exemple en el nostre cas, el color blanc. També podem seleccionar el cas per defecte “No Color” de tal manera que qualsevol color detectat pel sensor de color que no sigui negre executi aquest cas. Com es comportarà el robot si no posem per defecte el cas “No Color”? És important que els alumnes facin proves per entendre el funcionament de la bifurcació.
En aquest punt és molt important demanar als alumnes que donin la seva opinió i que, per exemple, repliquin el funcionament del robot amb el seu cos. Veurem que la majoria no té clar el funcionament de l’algoritme, i si no reflexionen, diran que mentre dura el bucle, el programa passa un cop per cada branca de la bifurcació. Veurem que això és totalment incorrecte, el programa passa moltes vegades per una mateixa opció o branca de la bifurcació a mida que el robot tracta d’anar d’un color a l’altre, encara que observant el robot ens sembli que el seu moviment és extremadament ràpid.
Els següents exercicis mostren amb molt detall el funcionament de la bifurcació dins del bucle per l’algoritme del rastrejador simple de dues passes amb un sol sensor de llum o de color.
La idea més senzilla per demostrar que l’execució del programa pel maó intel·ligent és infinitament més ràpida que l’execució física del mateix pel robot és enregistrar la branca de la bifurcació que s’executa en cada iteració del bucle.
Aquest exercici utilitza el bloc “File Access” o accés a fitxer per enregistrar en un fitxer de text la branca de la bifurcació per la que acaba de passar el programa. La finalitat és observar el fitxer de text final generat per fer les comprovacions.
Crear un nou programa, per exemple “u6ex1.rbt”, copiar l’algoritme bàsic del rastrejador inicial de la unitat didàctica 5 i afegir els blocs “File Access” o accés a fitxer, tal com es mostra a continuació.
Programa rastrejador simple amb blocs “File Access” d’accés a dades (NXT)
Programa rastrejador simple amb blocs “File Access” d’accés a dades (EV3)
Primer cal afegir un bloc inicial posant l’acció “Write” d’escriure al fitxer, el nom del fitxer que volem crear, per exemple “motor”, el tipus d’informació que volem afegir, triar l’opció “Text” del desplegable “Type” o tipus, per afegir un text inicial, per exemple “---Inici---”, que ens permetrà saber quan s’inicia el registre de dades en el fitxer de text.
Seguidament afegirem dos blocs “File Access” o accés a fitxer similars a l’anterior al final de cadascuna de les dues branques del “Switch” o bifurcació per tal d’escriure en el fitxer la branca per la que acaba de passar el programa. Per exemple, quan passa per l’opció on actua el motor B afegirem “B” i quan passa per l’altra opció afegirem “C”, en la casella de “Text”.
Per acabar el programa, cal tancar el fitxer abans d’aturar el programa. Per això cal afegir un últim bloc amb l’acció “Close” per tancar el fitxer. Cal tenir cura de posar sempre el nom de fitxer adequat, en el nostre cas “motor”. Per evitar errors, una bona opció és copiar algun dels blocs anteriors i anar modificant les opcions desitjades.
Un cop compilat el programa i executat en el robot, cal connectar el robot a l’ordinador i buscar el fitxer generat. Per això farem “clic” sobre el botó que obre la finestra del NXT i anirem a la pestanya de memòria “Memory”. Cal triar l’opció de “altra” memòria o “Other” i trobarem el fitxer de text “motor.txt” en NXT.
Finestra NXT amb la pestanya de gestió de memòria del maó intel·ligent
En EV3 cal fer clic al botó “Open Memory Browser” a la part inferior dreta de la finestra del programa per tal d’obrir la finestra de gestió de memòria del EV3 on trobarem el fitxer de text “motor.rtf”.
Botó per obrir la gestió de memòria del maó intel·ligent (EV3)
Finestra de gestió de memòria del maó intel·ligent (EV3)
Ara només cal “pujar” el fitxer des del maó intel·ligent, fent un “Upload” del mateix, i salvar-lo en l’ordinador al lloc desitjat.
El pas final és obrir el fitxer “motor.txt” amb el “Bloc de notes” per exemple, o “motor.rtf” amb “Word” i observar el seu contingut. Observarem que el fitxer de text generat té una extensió “.txt” o “.rtf” que afegeix el programa. Abans d’obrir-lo, pot ser interessant demanar als alumnes què creuen que contindrà i fer-los omplir el fitxer manualment a la pissarra. Tal com hem comentat inicialment, els alumnes que creuen que, a mida que el robot va d’un color a l’altre, cada branca de la bifurcació s’executarà una sola vegada haurien d’escriure en el fitxer: “B, C, B, C, B, ...”, tal com mostra la imatge següent.
Contingut suposat del fitxer “motor.txt” o “motor.rtf”
En obrir el fitxer i contràriament a la intuïció de molts alumnes, mentre dura el bucle del rastrejador podem observar que cada lletra es repeteix moltes vegades, la qual cosa indica que el programa passa moltes vegades per una mateixa branca de la bifurcació abans de canviar de branca dins del bucle. Per tant, el programa executa molt més ràpidament el bucle que els moviments del robot, tal com mostren les imatges següents.
Contingut real del fitxer “motor.txt” o “motor.rtf”
El següent repte és comptar quants graus gira cada motor abans de canviar de branca en la bifurcació dins del bucle. Principalment, els graus de gir de cada motor dependran de la seva potència, així com del propi disseny del robot, que en el nostre cas serà sempre el mateix per a tots els alumnes. Inicialment suposarem una potència de 40% en NXT i 30% en EV3 per evitar que el robot rellisqui. Per això utilitzarem explícitament el sensor de rotació intern de cada motor.
Un aspecte important abans de començar l’exercici és preguntar als alumnes on s’han d’afegir els blocs del sensor de rotació intern de cada motor. És important adonar-se que, donat que el programa passa varis cops dins la mateixa branca de la bifurcació abans de canviar de branca dins el bucle, tal com s’ha demostrat, cal enregistrar les rotacions d’un motor just abans del canvi de motor actiu en la bifurcació.
La següent imatge mostra el programa del rastrejador anterior on s’han afegit els blocs del sensor de rotació intern de cada motor. Cal adonar-se de que quan es para un motor es compten les rotacions realitzades pel mateix, es reinicialitza el sensor i, finalment, s’enregistren aquests graus de gir en el fitxer de text. Per realitzar aquest procés, cal connectar la presa de sortida del concentrador de dades o “data hub” del bloc del sensor de rotació intern de cada motor, corresponent als graus de gir “Degrees” del motor, amb la corresponent entrada de text del concentrador de dades del bloc d’accés a dades o “File Access”.
Programa rastrejador inicial amb blocs d’accés a dades i del sensor de rotació intern (NXT)
En aquesta imatge podem veure que el cable de dades o “data wire” que connecta els graus de rotació del motor amb l’entrada de dades del bloc d’accés a dades no és vàlida, està “trencada”, en color gris i amb una ratlla discontínua. Això és així donat que els tipus de dades que volem connectar són diferents, el primer és numèric i el segon és text. Per això cal, o bé canviar el tipus de dades del bloc d’accés a dades “File Access” a numèric, o bé convertir els graus de gir dels blocs motor de tipus numèric a tipus text. Aquesta segona opció requereix un nou bloc anomenat “Número a Text” o “Number to Text” que permet convertir un tipus numèric en un tipus text.
Programa rastrejador inicial amb blocs d’accés a dades i del sensor de rotació intern (EV3)
Tal com veiem en la imatge anterior, el bloc “File Access” d’accés a fitxers en EV3 és capaç de convertir automàticament els valors numèrics dels graus de gir en una cadena de text i no cal utilitzar un bloc de conversió.
Però hem obtingut el resultat desitjat? Si analitzem una mica en detall el resultat que volem obtenir en el fitxer de text, veurem que no tant sols necessitem enregistrar els graus de gir, sinó que també cal enregistrar el motor que ha girat aquests graus. Altrament, obtindrem una sèrie de números i no sabrem a quin motor fan referència. Per això, cal afegir als graus de gir la lletra del motor “B” o “C” que els ha realitzat en cada cas. Per tant, cal afegir un nou bloc que permeti concatenar aquestes cadenes de text. Aquest bloc s’anomena “Text” i permet concatenar fins 3 cadenes de text.
Suggeriment: És interessant observar que cada cop que s’utilitza el bloc d’accés a dades, aquest escriu una nova línia al fitxer textual de registre de dades. Per tant, si no es concatenen les cadenes de text i s’utilitza el bloc d’accés a fitxer o “File Access” dues vegades seguides, una per a cada text, aleshores obtindrem la lletra del motor i els seus graus de gir en línies diferents, la qual cosa dificultarà la lectura del fitxer de registre de dades.
Programa rastrejador correcte amb blocs d’accés a dades i del sensor de rotació intern (NXT)
Programa rastrejador correcte amb blocs d’accés a dades i del sensor de rotació intern (EV3)
Tal com s’ha comentat, podem observar que per discernir els graus de gir de cada motor, s’indica el motor a més dels seus graus de gir al enregistrar la dada en el fitxer de text. Per això, en NXT cal transformar els graus de gir en text, amb un bloc “Number to Text”, i combinar aquest text, mitjançant un bloc “Text”, amb un altre que indica el motor corresponent, per exemple mitjançant la cadena de text “B: ” o “C: ” per a cada cas, tal com mostra la imatge següent.
Exemple d’atributs del bloc “Text” que concatena la cadena “C: ”
amb els graus de gir del motor “C” connectat a la presa de dades
“B” del concentrador de dades o “data hub” del bloc “Text” (NXT)
Seguidament, es compila i descarrega el programa en el robot i abans que aquest l’executi, és important esborrar el fitxer de text anterior de la memòria per evitar que el programa afegeixi les dades i incrementi la mida del fitxer. Si no l’esborrem, trobarem fàcilment l’inici de cada prova mitjançant la cadena de text inicial que afegeix el programa tot just abans de començar.
Suggeriment: Cada cop que es genera un registre de dades amb el mateix nom, aquest incrementa de mida, la qual cosa pot arribar a omplir tota la memòria del maó intel·ligent. Per tant, abans d’executar un programa en el robot que generi un registre de dades, és important esborrar el fitxer anterior de la memòria per evitar que el programa afegeixi les dades i incrementi la mida del fitxer, sempre que les dades anteriors no siguin importants. Si es vol, això es pot realitzar programàticament posant a l’inici del programa un bloc “File Access” amb l’acció “Delete” o esborrar i seleccionant el nom de fitxer adequat.
Finalment, descarreguem el fitxer “motor.txt” (NXT) o “motor.rtf” (EV3) corresponent al registre de dades per observar i analitzar el seu contingut. Abans d’obrir el fitxer pot ser interessant demanar als alumnes que especifiquin amb el màxim de detall possible quin creuen que serà el seu contingut.
Contingut del fitxer “motor.txt” o “motor. rtf” amb els graus de gir de cada motor
Tal com esperàvem, veiem que les entrades del fitxer que capturen les rotacions realitzades per cada motor just abans de canviar la branca de la bifurcació dins el bucle, contenen uns graus de gir que van de 30 a 50 graus.
Però la pregunta és perquè hi han entrades iguals a “0” o molt petites, “1” o “2”? La resposta és molt senzilla, quan comptem les rotacions d’un motor la bifurcació escriu en el fitxer les rotacions del motor contrari, que òbviament està parat. Si aquest motor rellisca una mica pot ser que faci un o dos graus de gir, o que fins i tot rellisqui enrere, el que implica graus de gir negatius, és a dir iguals a “-1” per exemple!
Com podem millorar el nostre registre de dades? Cal eliminar del mateix les dades que no aporten cap informació interessant. Per això cal utilitzar l’atribut de comparació del bloc del sensor de rotació intern de cada motor, comparar-lo amb els valors que volem enregistrar, per exemple només els superiors a 3, i finalment, enregistrar només aquestes dades pel cas desitjat.
Per enregistrar només els valors desitjats, una primera solució menys eficient, que els alumnes haurien de ser capaços de trobar per sí sols amb els coneixements adquirits, és utilitzar una bifurcació associada amb el sensor de rotació intern del motor desitjat. És important deixar que els alumnes trobin aquesta solució, o al menys algunes parts de la mateixa.
Programa rastrejador amb estratègia d’eliminació de les rotacions nul·les, amb blocs d’accés a dades i bifurcació associada al sensor de rotació intern (NXT)
Programa rastrejador amb estratègia d’eliminació de les rotacions nul·les, amb blocs d’accés a dades i bifurcació associada al sensor de rotació intern (EV3)
Una estratègia més eficient per enregistrar només els valors significatius, és utilitzar la sortida lògica “Sí/No” o “Yes/No” del bloc del sensor de rotació intern especificant el llindar (“threshold” en anglès, “umbral” en castellà) de graus de rotació desitjat, per exemple superior a 3 graus, i connectar aquesta presa de sortida de dades a la entrada de dades d’una bifurcació lògica o “logic switch” per tal d’enregistrar en el fitxer només els valors que siguin superiors al llindar especificat. Finalment, per tal de connectar el text del bloc “File Access” d’accés a fitxers amb els graus de rotació del motor cal “travessar” la bifurcació, la qual cosa només es pot fer desactivant la “vista plana” o “Flat View” de la mateixa.
Suggeriment: Les bifurcacions o “Switch” es poden visualitzar amb la biga de seqüència desdoblada amb una “vista plana” o “Flat View” o en forma de fitxes o “Tabs”. Si una bifurcació està associada a un sensor o és de tipus lògic, aleshores té dos valors, però més endavant, veurem que una bifurcació pot tenir varis valors i aleshores en NXT, aquests només es poden visualitzar mitjançant la vista plana desactivada, amb la bifurcació en forma de fitxes. Es pot accedir a cada opció fent clic al “Tab” o “fitxa” adequada. Finalment, per tal de connectar l’atribut d’un bloc extern a la bifurcació amb l’atribut d’un altre bloc de dins la bifurcació, cal desactivar la “vista plana” o “Flat View” de la bifurcació per poder-la “travessar” amb un cable de dades o “data wire”.
Programa rastrejador amb blocs d’accés a dades, blocs del sensor de rotació intern i estratègia eficient d’eliminació de les rotacions no significatives (NXT)
Finestra d’atributs del bloc del sensor de rotació intern del motor “C” (NXT)
Programa rastrejador amb blocs d’accés a dades, blocs del sensor de rotació intern i estratègia eficient d’eliminació de les rotacions no significatives (EV3)
Però perquè aquesta estratègia de programació és més eficient que l’anterior? Aquest programa és més eficient que l’anterior perquè escriu en el fitxer al final de la branca del bucle després d’activar el motor contrari, perquè utilitza una bifurcació lògica més ràpida d’executar que una associada a un sensor, i perquè no duplica blocs innecessàriament.
Un cop el programa està acabat, compilat i executat pel robot, el fitxer “motor.txt”, corresponent al registre de dades, mostra només els graus de rotació efectuats per cada motor durant el seguiment de la línia.
Contingut del fitxer “motor.txt” o “motor.rtf” només
amb els graus de gir rellevants de cada motor
Què és el que crida l’atenció d’aquest fitxer? Perquè hi ha un punt on les rotacions són majors que en el cas general? Podem identificar aquest punt sobre el tauler? Aquest exemple, que s’ha efectuat sobre el tauler de l’exercici incremental, rastrejant per la part interior de la línia, i amb un temps de rastreig que permet sobrepassar la primera línia d’intersecció, il·lustra numèricament el punt on el robot sobrepassa aquesta línia d’intersecció. Aquest punt és el que correspon a les rotacions majors, és a dir, B=75 i C=172 per recuperar la línia de rastreig.
Per tant, acabem de dissenyar una estratègia per fer intel·ligent un rastrejador simple de dues passes amb un sol sensor de llum o de color, monitoritzant les rotacions de cada motor, per tal de que aquest sigui capaç de saber quan troba una intersecció de línia!
Per tal de completar l’exercici sobre registre de dades o “data logging”, podem tornar-lo a fer però utilitzant la funcionalitat del programari anomenada “Experiment” que permet enregistrar dades capturades pels sensors en funció del temps i visualitzar-les de forma gràfica i unitària en una interfície especialment dissenyada.
Tal com hem comentat anteriorment en altres unitats didàctiques, el registre de dades mitjançant el concepte d’experiment es pot realitzar bàsicament de dues formes: en temps real, des de la interfície del programari, o en diferit, de forma programàtica descarregant el programa en el maó intel·ligent i executant-lo per finalment estudiar el fitxer generat pel maó intel·ligent des de l’ordinador. Per veure les dades capturades del registre en temps real, cal que el maó intel·ligent estigui connectat a l’ordinador. Aleshores, a mida que avança l’experiment, l’usuari veu el procés de captura de dades en temps real i de forma gràfica. A més, el programari ofereix una segona opció que permet definir i executar el registre de dades o “data logging” des de dins de qualsevol programa, mitjançant dos blocs específics en NXT, el “Start Datalog” o “arrancar registre de dades” i el “Stop Datalog” o “aturar registre de dades”, i un sol bloc en EV3, “Data Logging”. L’avantatge d’aquesta segona opció és que permet realitzar diferents registres de dades dins d’un mateix programa i en funció de les necessitats. La configuració de l’experiment és idèntica en ambdós casos, dinàmic i programàtic.
Tot i que l’exercici es pot realitzar de forma dinàmica, en aquesta unitat el realitzarem de forma programàtica per simplicitat. Aquest exercici utilitza els blocs “Start Datalog” o “arrancar de registre de dades” i “Stop Datalog” o “aturar registre de dades” en NXT i el bloc “Data Logging” en EV3 per enregistrar en un fitxer de text amb extensió “.log” o “.rdf” les lectures dels sensors de llum o de color i de rotació intern associats als motors ”B” i “C”. La finalitat és observar de forma gràfica l’experiment realitzat en la finestra específica del programa per relacionar les corbes generades visualment.
Per començar la programació, crear un nou programa, per exemple “u6ex2.rbt”, copiar l’algoritme bàsic del rastrejador inicial de la unitat didàctica 5 i afegir els blocs de registre de dades o “data logging”, tal com es mostra a continuació.
Rastrejador amb blocs “Start Datalog” o arrancar registre de dades i “Stop Datalog” o aturar registre de dades (NXT)
Configuració del bloc “Start Datalog” o arrancar registre de dades (NXT)
Rastrejador amb blocs “Data Logging” per arrancar i aturar el registre de dades (EV3)
En la configuració del bloc per arrancar el registre de dades cal tenir en compte diferents aspectes. Cal donar-li un nom que s’utilitzarà després per aturar el registre de dades en el bloc corresponent, que generarà el fitxer amb l’experiment i amb l’extensió “.log” en NXT i “.rdf” en EV3, en el nostre exemple serà “motor.log” o “motor.rdf”. Cal definir la durada, que posarem a “Il·limitada” per passar el control del temps al bucle que es repetirà durant 9 segons –la qual cosa permet arrancar el registre de dades i immediatament després començar el rastreig del robot–, i la freqüència de mostreig o número de mostres per segon, on posarem 10.
Alternativament en NXT podem definir en segons la durada de l’experiment, 9 en el nostre cas. Però si ho fem, molt important, cal desactivar l’atribut d’espera o “Wait for Completion”, per tal de que el robot executi el programa de rastreig mentre que s’enregistren les lectures dels diferents sensors. De no fer-ho, el robot esperarà fins que s’acabi la captura de dades, per començar a rastrejar, amb la qual cosa el fitxer no contindrà les dades desitjades.
Finalment, configurarem la captura de dades dels sensors desitjats, fins un màxim de quatre en NXT. Primer posarem el sensor de llum o de color i després els sensors de rotació interns associats a cada motor. En NXT deixarem buida la quarta possibilitat de registre o captura de dades, en EV3 podem afegir sensors fent clic a la icona amb signe “+” de la part superior dreta del bloc. Cal observar que les unitats dels sensors de rotació interns són graus i no rotacions, més endavant veurem la diferència.
Un cop realitzada la configuració de l’experiment, connectem el robot a l’ordinador i compilem, descarreguem el programa al maó intel·ligent i l’executem amb el robot desconnectat de l’ordinador. Cal ubicar el robot en el mateix tauler de l’exercici incremental anterior per poder comparar els resultats. Un cop el robot ha realitzat l’exercici de rastreig, cal connectar el robot a l’ordinador, i des de la interfície d’experiments, obrim el fitxer de “.log” generat en NXT, “motor.log”, o el fitxer “.rdf” generat en EV3, “motor.rdf”, mitjançant la icona en forma de fletxa mirant amunt, en la part inferior dreta de l’aplicació, per fer un “Upload” del fitxer. Veurem que la finestra permet carregar el “.log” o el “.rdf” des de l’ordinador o directament des del maó intel·ligent, seleccionant-lo a la llista. En la part inferior, la finestra mostra els fitxers disponibles que podem seleccionar. En el nostre cas seleccionarem el fitxer “motor.log” en NXT o “motor.rdf” en EV3.
Suggeriment: En NXT, els fitxers “.log” són fitxers de text que a més de poder-los obrir i esborrar des de la interfície gràfica d’experiments, també els podem gestionar des de la finestra NXT o “NXT window”, tal com hem fet amb el fitxer de text en l’exercici anterior. Els fitxers de text “.log” s’ubiquen en l’apartat “Other” o “altres” de la memòria del maó intel·ligent i es poden obrir amb el bloc de notes de l’ordinador o un full electrònic. En EV3, els fitxers “.rdf” són fitxers binaris que només es poden obrir des de l’aplicació. Aquests fitxers compten amb una estructura determinada que permet fer una lectura “intel·ligent” dels mateixos.
Fitxer “.log” amb unitats dels sensors de rotació expressades en rotacions (NXT)
Fitxer “.rdf” amb unitats dels sensors de rotació expressades en graus (EV3)
Aquest primer fitxer de registre de dades mostra en vermell les dades enregistrades pel sensor de llum o de color i en lila les dels sensors de rotacions. Per llegir millor el graf, podem canviar el color d’un dels sensors de rotació pitjant el quadrat corresponent al color.
Si analitzem els resultats, veurem que en NXT costa una mica diferenciar les rotacions de cada motor. Seria millor utilitzar graus en comptes de rotacions per expressar el moviment dels motors i obtenir diferències més rellevants, però perquè? Doncs perquè 1 rotació és equivalent a 360 graus, és a dir, 360 unitats, per tant les diferències son més grans. En EV3 el sistema tria automàticament aquesta opció. Podem seleccionar les unitats, rotacions o graus, a l’esquerra de cada corba en NXT i a la pestanya “Dataset Table” en EV3. També podem seleccionar les unitats desitjades per defecte en la definició dels atributs del bloc “arrancar registre de dades”, tal com s’ha comentat anteriorment i com mostra la imatge anterior de definició d’atributs d’aquest bloc.
Pot ser interessant deixar que els alumnes facin diferents proves amb les unitats per ajustar millor la visualització de les corbes, i cal tenir en compte que en EV3 es pot fins i tot modificar els valors mínims i màxims dels eixos de coordenades afegint manualment el valor desitjat, la qual cosa no es pot fer en NXT.
Fitxer “.log” amb unitats dels sensors de rotació expressades en graus (NXT)
Aquest segon graf és més llegible que el primer. És important que els alumnes intentin interpretar i explicar el graf generat relacionant les diferents corbes. En primer lloc podem observar les lectures del sensor de llum o de color en vermell, que passen de negre a blanc (veure la intensitat de la llum reflectida en l’eix Y). Una primera pregunta és perquè les línies són inclinades o en “dent de serra” i no verticals? La resposta és que a prop del llindar entre els colors blanc i negre, el sensor de llum o de color detecta canvis progressius de la intensitat de la llum reflectida a mida que el robot avança d’un color a l’altre. La unitat didàctica sobre l’estudi del concepte de llindar explica en detall aquesta qüestió.
Respecte de les corbes dels motors, podem preguntar als alumnes perquè les corbes corresponents fan unes esses que tendeixen a pujar? La resposta és perquè per una banda quan un motor arrenca l’altre para i, per una altra banda, els sensors de rotació interns van acumulant les rotacions, i per tant, la línia té un pendent positiu.
Finalment, si observem la corba del sensor de llum o de color, podem veure que arribat un punt hi ha un pic més alt. A què correspon aquest pic? Aquest pic correspon a una intersecció en la línia de rastreig, que en el nostre cas, és la línia intermèdia del tauler de l’exercici incremental. Si ens fixem, encara que costa una mica, també podem veure que els graus de rotació dels motors, especialment els del “B” en color taronja, també semblen més grans en la vertical d’aquest mateix punt que correspon aproximadament al segon 4,5.
Per acabar l’exercici, què cal fer per obtenir només les rotacions que fa el robot en canviar de color en les iteracions del bucle? Per obtenir només les rotacions que realitza cada motor en cada fase de la bifurcació dins del bucle, només caldrà reinicialitzar els sensors de rotació interns després d’aturar-los dins de cada branca de la bifurcació, mitjançant el bloc del sensor de rotació intern corresponent.
Rastrejador amb blocs de registre de dades i reinicialització dels sensors de rotació interns de cada motor (NXT)
Rastrejador amb blocs de registre de dades i reinicialització dels sensors de rotació interns de cada motor (EV3)
Abans d’executar aquest exercici pot ser interessant demanar als alumnes quines creuen que seran les diferències entre aquest nou graf i l’anterior. Com podem observar seguidament, el graf corresponent a aquest nou programa permet interpretar molt millor els resultats obtinguts.
Fitxer “.log” reinicialitzant els sensors de rotació interns dels motors i amb unitats expressades en graus (NXT)
Fitxer “.rdf” reinicialitzant els sensors de rotació interns dels motors i amb unitats expressades en graus (EV3)
Donat que el gir dels motors es reinicialitza entre cada branca de la bifurcació del bucle del rastrejador, el graf anterior només mostra els graus de gir realitzats pels motors dins de cada branca, que és justament la informació que volem saber per esbrinar el punt del tauler on el robot es troba amb una intersecció de línia.
En aquest punt és interessant demanar als alumnes que interpretin els resultats. En el graf veiem que els graus de gir dels motors formen una corba també amb “dents de serra” i que les corbes de cada motor s’alternen, donat que quan un motor funciona l’altre roman aturat (o quasi, donat que pot relliscar), corresponent als cicles entre el color blanc del fons del tauler i el negre de la línia de rastreig. Finalment, podem observar que els pics dels sensors de rotació interns no es corresponen ben bé amb els pics del sensor de llum o de color, perquè? Doncs per la inèrcia del robot i la rapidesa d’execució del programa i de lectura dels sensors, quan es reinicialitza cada motor és justament quan canvia el color segons el llindar especificat entre el blanc i el negre. Per tant, els pics de les corbes del sensor de rotació intern de cada motor tendeixen a coincidir amb un punt anterior a la “pujada” o “baixada” de la corba de color, és a dir, amb el llindar del canvi de color entre blanc i negre. Si agaféssim moltes més mostres per segon aquest fet seria més evident i, de fet, si el programa fos molt ràpid, les corbes dels sensors de rotació interns mostrarien una baixada totalment vertical, donat que els motors s’aturen en aquest punt.
Un altre fet que podem observar en l’exemple és que sembla que el motor B fa una mica més de graus de gir que el motor C al llarg del recorregut. En EV3, cal assegurar que les rotacions màximes del graf de cada sensor són iguals, si són diferents, tal com he vist anteriorment, cal seleccionar manualment el valor màxim per ambdues corbes. Perquè un motor sembla girar una mica més que l’altre? Els motors haurien de girar el mateix i tot i que la diferència és molt petita pot passar que un motor giri més que l’altre degut a la pròpia geometria del robot, de si el sensor de llum o de color no estan ben situats al mig del robot, de si el pes del robot no està ben repartit, de si les rodes no estan ben construïdes i disposades a la mateixa distància de l’eix del robot, de si una roda rellisca més que l’altre sobre la superfície del tauler (tant la que es mou com la que hauria d’estar aturada, de fet hem vist que de vegades la roda aturada pot relliscar enrere...), de si la superfície del tauler no està ben neta o de si el tauler té alguna inclinació desapercebuda cap a un dels costats. Si les diferències son grans, es pot revisar la construcció del robot i tornar a repetir l’experiment, i segurament obtindrem un resultat una mica diferent amb rotacions molt similars entre ambdós motors. Aquest punt és molt important a tenir en compte, especialment de cara a les competicions o quan es requereix una gran precisió de moviments.
Finalment, la imatge d’aquest graf també mostra una eina interessant de la interfície que permet consultar els valors dels sensors en un punt determinat, en el nostre cas la posició corresponent al voltant del segon 4,5 on les rotacions del motor “B” són les més grans i que correspon a una intersecció en la línia de rastreig. S’accedeix a aquesta eina pel menú “Analysis Tools” o “eines d’anàlisi” en NXT o per la icona del menú “Analysis” en EV3, amb l’opció “Point Analysis” o “anàlisi de punt”. La línia corresponent al punt d’anàlisi en un temps concret es pot arrossegar fins el punt desitjat, en el nostre cas a prop del segon 4,5. També podem associar-li un nom, podem generar tants punts d’anàlisi com desitgem, i podem guardar tots aquest punts d’anàlisi amb l’experiment per a usos futurs.
La interfície d’experiments ofereix també altres eines com una eina d’anàlisi d’àrees, una lupa per augmentar la imatge en una àrea determinada i una eina de predicció, totes elles molt fàcils d’utilitzar i que poden ser molt útils.
Tal com hem vist anteriorment, en rastrejar, el robot va fent petits moviments a dreta i esquerra, però quan aquest troba una intersecció, aleshores, per tal de seguir la branca de la línia de rastreig, una de les rodes fa més rotacions que al seguir la línia recta, mentre l’altra roman parada. Per tal de controlar el moviment global del robot, podem detectar quan es produeix aquest increment de rotacions de la roda adequada, aturar el rastreig de la línia, girar el robot cap el costat adequat (el d’aquesta intersecció) i seguir rastrejant.
Per realitzar l’exercici incremental, només cal supervisar una roda. En el nostre cas, només cal controlar les rotacions del motor “B” de la dreta, ja que es rastreja la línia negra per l’esquerra, és a dir per la part interior del tauler, i al trobar la línia d’intersecció, que va cap a l’esquerra, la roda “C” s’atura i la roda “B” fa més rotacions que en el seguiment de la línia recta, per trobar el color “blanc”.
Tal com hem vist, per controlar els graus de gir o el número de rotacions d’un motor, el panell de control o finestra d’atributs del bloc del sensor de rotació intern facilita l’opció de comparar les rotacions amb un llindar específic, 60 graus en el nostre cas. Si les rotacions són superiors al valor d’activació o llindar, aleshores l’atribut o presa de sortida “Sí/No” del concentrador de dades retornarà el valor “veritat” (“True”), que podrem connectar a la presa d’entrada lògica del bucle, mitjançant un cable de dades, per així aturar el rastrejador sortint del bucle.
Suggeriment: Recordar que per tal de connectar un atribut lògic d’un bloc, que estigui dins d’una bifurcació, al connector lògic d’un bucle que contingui la bifurcació, cal desactivar la “vista plana” o “Flat View” de la bifurcació per poder-la “travessar”. En EV3 alternativament podem utilitzar el bloc d’interrupció de bucle “Loop Interrupt” per forçar la sortida d’un bucle il·limitat.
Panell de control del sensor de rotació del port B (NXT)
Tal com hem vist, cal observar que el sensor de rotació s’ha de reiniciar després de llegir les rotacions de la roda supervisada, per a cada cicle de rastreig. Per comptar les rotacions, el sensor de rotació s’ha d’ubicar tot just després de parar el motor supervisat i abans de començar les rotacions del motor oposat.
Rastrejador que s’atura en detectar un llindar de rotacions superiors a
60 graus en el sensor de rotació intern associat al motor “B” (NXT)
Rastrejador que s’atura en detectar un llindar de rotacions superiors a
60 graus en el sensor de rotació intern associat al motor “B” (EV3)
Alternativa del rastrejador que s’atura en detectar un llindar de rotacions superiors a
60 graus en el sensor de rotació intern associat al motor “B”, mitjançant un
interruptor de bucle (EV3)
A nivell global, per realitzar l’exercici incremental cal un rastrejador cada cop que hi ha un canvi de direcció o una intersecció de línia. Per tal de sobrepassar els punts de canvi de direcció només cal, o bé executar algunes rotacions de la roda adequada per girar el robot i començar un nou rastreig (fent un gir sobre punt amb una roda parada), o bé seguir recte per sobrepassar la intersecció (en aquest cas com que el robot haurà girat, només caldrà fer un petit gir cap a el costat contrari per recuperar la direcció del robot, sobrepassant la intersecció). També cal observar que, en funció del sentit de gir del robot, unes vegades cal supervisar la roda dreta i unes altres l’esquerra, tal com es mostra a continuació. Per aquest últim punt, podem demanar als alumnes què creuen que cal canviar en el programa per a que el robot rastregi la línia per l’altre costat.
Programació de l’exercici incremental mitjançant un rastrejador simple
amb control de rotacions per detectar cada intersecció de línia (NXT)
Programació de l’exercici incremental mitjançant un rastrejador simple
amb control de rotacions per detectar cada intersecció de línia (EV3)
Quines avantatges comporta la utilització del sensor de rotació en comptes del sensor de llum o de color, que hem utilitzat en la unitat didàctica anterior, per realitzar l’exercici incremental? Si bé amb el sensor de rotació el codi és menys compacte, el gran avantatge d’aquesta solució és que fins i tot funciona si modifiquem la mida del tauler o del punt de sortida del robot. Per tant, aquesta solució és més genèrica i més robusta que la de la unitat didàctica anterior.
Quin desavantatge podem veure en el programa anterior? El que podem observar és que el programa duplica el codi del rastrejador després de cada intersecció. Més endavant veurem la possibilitat d’encapsular aquest codi en un bloc d’usuari o subprograma per fer-lo molt més compacte i eficient.
Coneixements adquirits: El registre de dades o “data logging” en un fitxer o mitjançant la interfície del programa amb els blocs corresponents d’arrancar i aturar el registre, no tant sols permet enregistrar dades de forma dinàmica, mentre s’executa un programa, sinó que permet observar en detall, estudiar i entendre el funcionament d’un programa, i és un molt bon sistema de “debugging” o depuració informàtica d’un programa. A més, els alumnes aprenen a interpretar dades numèriques, a interpretar i relacionar corbes de grafs, a utilitzar bifurcacions lògiques, a passar informació entre els blocs del programa mitjançant cables de dades, a accedir i a gestionar la memòria del maó intel·ligent, i a posar en pràctica tots els coneixements adquirits en les unitats didàctiques anteriors.