ROBOTS DE LEGO MINDSTORMS NXT (en construcció)
 ESTRUCTURA CONTINGUTS: 2.1 Introducció al sistema de control 2.1.1 Definició dels elements d’un sistema de control 2.2 Tipus de sistemes de control 2.3 Generalitats sobre els controladors 2.3.1 Senyals analògics i senyals digitals 2.3.2 Tipus de controladors 3.1 El controlador 3.1.1 Què és i com és el controlador NXT? 3.1.2 Opcions del controlador NXT 3.1.3 Programació del controlador NXT i del robot 3.1.3.1 Metodologia de programació 3.1.3.2 Mindstorms NXT Educational 3.1.3.2.1 Funcionament general 3.1.3.3 Blocs del programa 3.1.3.3.1 Blocs bàsics3.1.3.3.2 Blocs avançats3.1.3.4 Llenguatges de programació 3.2 Estudi dels sensors3.2.1 Què és un sensor? 3.2.2.1 Sensor de contacte o polsador PROGRAMA 1 - Detecció d'una superfície PROGRAMA 2 - Avanç i retrocés3.2.2.2 Sensor de llum infraroigPROGRAMA 3 - Persecució d'una font de llum PROGRAMA 4 - Avançar i aturar-se segons la intensitat de llum PROGRAMA 5 - Robot seguidor de línia negra 3.2.2.3 Sensor de so 4. Els motors 5. First Lego League INTRODUCCIÓ Aquesta documentació ha esta elaborada amb l'objectiu de proporcionar una base d'informació sòlida per iniciar-nos amb els robots de LEGO, utilitzant el software Mindstorms NXT versió educativa com a mètode de programació. Deixant-la a l'abast de l'ús públic, pretenem que la informació sigui utilitzada per difondre aquest coneixement i animar al màxim nombre d'interessats possibles a construir i programar amb aquesta guia. Tots aquests apunts s'han anat elaborant durant el transcurs d'un curset de robòtica d'estiu destinat a un públic jove interessat a endinsar-se dins l'apassionant món de la robòtica. Esperem que sigui del vostre agrat. 1. PER QUÈ LA ROBÒTICA DE LEGO? Els punts més rellevants per animar a molts joves a treballar amb aquesta tecnologia són: - L'accessibilitat de la tecnologia LEGO, malgrat no tenir coneixements sobre robòtica. - La facilitat d’ús i de programació que ofereix el software “Mindstorms NXT”, és a dir, la facilitat amb què es pot manipular el programa si tenim en compte la complexitat d’accions que podem arribar a desenvolupar. - No cal disposar de coneixements previs sobre un llenguatge específic de programació: per tant, no cal ser un enginyer electrònic o conèixer a fons el tema de lògica per poder programar el robot. - La variabilitat de l’estructura de LEGO, que permet mitjançant l’acoblament i desacoblament de peces, muntar molt ràpidament un robot adaptat a una determinada necessitat d’acció. A més, tots els sensors i dispositius anàlegs que s’afegeixen, poden ser fixats i connectats al mateix controlador, sense haver de modificar absolutament res. - Tots els complements de la tecnologia Mindstorms poden ser utilitzats en altres sistemes més complexos. Per tant, l’estudi dels diferents sensors, dels motors i del controlador, ens serviran com una simple però eficaç introducció a la robòtica de més nivell en el futur. - L’experiència de milers de nois arreu del planeta que han tingut la possibilitat de treballar i alhora jugar aprenent amb aquesta tecnologia. - La possibilitat de competir amb aquest robot, construït i estudiat per nosaltres mateixos en una competició d'àmbit internacional com és la First Lego League, que presenta diferents reptes anualment. Els objectius d’aquesta guia són els següents: 1) Comprendre la funció d’un control programable. 2) Reconèixer un sistema de control. 3) Analitzar i estudiar els diferents components del robot de Lego. 4) Aprendre a programar el robot en les diferents possibilitats que ofereix el programa Mindstorms NXT. 5) Trobar aplicacions pràctiques útils en la vida cuotidiana. 6) Animar a formar equips per participar al Robolot’09 i a la First Lego League.
2. ANÀLISI DELS SISTEMES DE CONTROL En aquest apartat definiré què és un sitema de control, els elements que el conformen i també desglossaré una sèrie de generalitats sobre aspectes diversos. Tot això us permetrà entendre i exposar millor el funcionament de les diferents parts del nostre robot. 2.1 Introducció al Sistema de Control (SdC) Un sistema de control és un conjunt d’aparells electrònics que permeten controlar una determinada magnitud o unes determinades magnituds d’un sistema físic. Les parts d’un sistema de control són les que tenim a continuació en aquest esquema: 2.1.1 Definició dels elements d'un sistema de control 0 - El sistema físic és la part del món real que és capaç de controlar el sistema de control. Això vol dir que el sistema de control pot dominar l’evolució una o més magnituds del sistema físic; com ara la temperatura o la posició. 1 - Els sensors és la primera part del sistema de control. Aquests dispositius s’encarreguen de recollir informació d’una o més magnituds del sistema físic. Hi ha diversos tipus de sensor segons la magnitud de la qual es vulgui obtenir informació. 2 – De vegades el senyal que surt dels sensors no és adequat per fer-lo arribar al controlador (massa dèbil, informació amb un format incomprensible pel controlador, etc.) Per això, utilitzem un dispositiu anomenat adaptador. 3 - El controlador és la tercera part del sistema de control. La seva funció és encarregar-se de donar les ordres als actuadors, a partir dels senyals rebuts pels sensors i les ordres o programacions predeterminades d’origen humà. Realitza la funció similar al d’un cervell en una persona. 4 - Els preactuadors s’encarreguen d’adaptar els senyals elèctrics que surten dels controlador per tal que siguin prou potents per arribar a activar els actuadors. 5 - Els actuadors s’encarreguen de manipular una o més magnituds dels sistema físic a partir de les ordres obtingudes pel controlador. Els actuadors del nostre robot, per exemple, són els motors. 6 - Els visualitzadors són la part externa o interna del sistema de control que s’encarreguen d’informar a l’usuari del funcionament d’aquest. Alguns exemples de visualitzadors són: LEDs, LCD o pantalles. 2.2. Tipus de sistema de control: Existeixen bàsicament dos tipus bàsics de sistemes de control: Sistema de control de llaç obert: són els sistemes que no disposen de sensors i utilitzen com a mètode de funcionament diversos temporitzadors o taules. Un exemple d’aquest sistema són els semàfors. Sistema de control de llaç tancat: són els sistemes més usuals. Disposen de sensors i actuadors bàsics per al seu correcte funcionament. 2.3. Generalitats sobre els controladors: 2.3.1 Senyals analògics i senyals digitals Abans de definir els tipus de controladors cal saber el tipus de senyals elèctrics que podem trobar en un sistema de control: a) Senyals analògics: són aquells senyals que poden adquirir infinits valors, dins d’un interval determinat. El senyal que obtenim d’una sonda de temperatura és analògic,per exemple. b) Senyals digitals: és aquell senyal que pot adquirir un nombre determinat de valors (mai infinits) dins d’un interval o marge determinat.  Dins dels senyals digitals se solen utilitzar els senyals binaris, que només poden adquirir 2 valors dins d’un marge. 2.3.2. Tipus de controladors: Segons els senyals que poden rebre i generar els controladors poden ser: a) Controladors analògics: tots els senyals que entren i surten del controlador són analògics. b) Controladors digitals: tots els senyals que entren i surten són digitals. c) Controladors híbrids: tots els senyals que entren poden ser analògics o digitals, tot i que el controlador sempre sol ser digital. Per tant, aquest controlador necessita adaptadors i preactuados que converteixin el primer senyal d’analògic a digital i després a l’inversa.
Com més senyals entren en un Analogic Digital Converter (ADC) o en un Digital Analogic Converter (DAC) més precisos són. Els controladors també es poden classificar en funció de si són programables o cablats (no programables): a) Els controladors programables: el conjunt de circuits que el formen sempre és el mateix. Per canviar la forma d’actuar del controlador cal canviar el programa que va dins del controlador. b) Els controladors cablats: consisteixen en un conjunt de circuits que s’han muntat d’una manera determinada segons la funció que ha de fer el controlador. El desavantatge d’aquest controlador és que si volem canviar de funció del controlador haurem de tornar a muntar el circuit per a la nova funció. Fins aquí hem vist els sistemes de control i els controladors de forma genèrica. En els següents apartats veurem com són aquests elements en el cas concret del nostre robot de LEGO. Més tard, en l’apartat de programació, viurem en primera persona com és el sistema físic.
3. ESTUDI DEL CONTROLADOR NXT i DELS SEUS COMPONENTS 3.1 El controlador 3.1.1 Què és i com és el controlador NXT? Un controlador és un element imprescindible per a qualsevol robot i lògicament per a qualsevol sistema de control. Salvant les distàncies, el controlador realitza les mateixes funcions que desenvolupa el nostre cervell a escala humana, és a dir, rep i processa tots els senyals produïts pels sensors per acabar donant una resposta a tots ells en forma d’un ordre que executaran els actuadors. De fet, el controlador també disposa de diferents àrees de tractament d’informació, igual que nosaltres disposem de diferents hemisferis per analitzar-la. Com ja hem vist en l’apartat anterior d’ ”Anàlisi d’un sistema de control”, existeixen molts tipus diferents de controladors dividits en grups segons el tipus de senyal amb què treballen (digital, analògic o híbrid) o també segons la seva estructura i funcionament (cablats o programables). Nosaltres ens centrarem amb el controlador NXT de Lego, també conegut amb el nom de NXT Intelligent Brick desenvolupat l’any 2006. El controlador NXT (imatge inferior) és un controlador programable híbrid que disposa de convertidors ADC (d’analògic a digital), ja que el seu funcionament tant és vàlid per els nous sensors digitals, com també pels sensors analògics del sistema RCX, comercialitzats temps enrere. El seu disseny i el seu funcionament és molt versàtil, ja que tant una persona que s’iniciï en aquestes tecnologies com un professional en el camp de la robòtica hi poden treballar, gràcies a l’existència d’un software propi i també per la compatibilitat amb un gran nombre de llenguatges de programació (LabVIEW Toolkit, leJOS NXJ (Java), URBI, RobotC, MATLAB i Simulink). L’NXT, a més, és compatible amb els tres tipus de sistemes operatius majoritaris: Windows, Mac Os i Linux. La seva estructura externa es caracteritza per la presència de tres “output” ports (A, B i C), un connector USB de 12 Mbits/s i quatre “input” ports (1, 2, 3 i 4) on hi podem connectar, respectivament, els servo motors, l’ordinador i qualssevol dels sensors que esmentarem més tard. A més de tot això, disposa d’una pantalla LCD(40x32) i quatre botons imprescindibles per provar i conèixer a fons el menú principal. El botó taronja l’utilitzem per obrir el robot (On) i executar un arxiu o un programa (Enter/Run), mentre el botó rectangular gris s’usa per retrocedir o netejar pantalla. Finalment, els botons triangulars de color gris clar s’usen per a desplaçar-se pel menú. Encara que a simple vista pugui semblar que el robot no tingui més elements, també disposa d’un micròfon i d’un altaveu on podem grabar i emetre una gran quantitat de sons amb una qualitat de 8kHz i un receptor de Bluetooth. De fet, el robot pot arribar funcionar exclusivament amb la comunicació per xarxa Bluetooth Class II V2.0. La seva alimentació elèctrica prové de 6 piles AA (1,5V) o bé de la bateria de liti de sèrie, extraïble de la part posterior del controlador. Per a recarregar-la es necessita un carregador específic model A31070GC. Tot plegat, tant les piles com les bateries, concedeixen al robot una autonomia aproximada d’entre dos i tres hores de funcionament total (es considera total quan els motors estan en funcionament). Alternativament a la part electrònica, el controlador disposa d’orificis en tota la seva part lateral. En tots ells podem col·locar peces estàndards de LEGO per unir el ontrolador amb altres elements. Passem ara a enumerar els elements de la seva estructura interna on trobarem les característiques tècniques més importants del robot, és a dir, els detalls que configuren a seva electrònica i al capdavall, les seves possibilitats com a controlador. El robot disposa de dos microcontroladors: l’ARM7 de 32 bits amb una memòria FLASH de 256 Kbytes i una RAM de 64 Kbytes i l’ATmega48 de 8 bits amb una memòria FLASH de 4 Kbytes i una de RAM de 512 Bytes. Pel que fa als input ports, podem dir que cadascun disposa de sis xarxes d’entrada que s’organitzen amb 6 pins de la següent manera: El pin 1 (cable blanc) permet la connexió d’elements analògics com el sensors RCX de contacte, de llum o de so i el pin 2 (cable negre) actua com a cable terra d’aquests dispositius compatibles amb el sistema RCX. El pin 3 també actua de terra (cable vermell), mentre el pin 4 (cable verd) transmet un voltatge continu de 4.3V. El pin 5 (cable groc) i el pin 6 (cable blau) permeten la connexió directa de sensors digitals amb el microprocessador ARM7 mitjançant el protocol I2C. En aquesta situació, el pin1 pot actuar com a font de 9 V. A sota vegem, la col·locació dels pins. Cal remarcar que el cable de comunicació, tot i assemblar-se a l’adaptador telefònic, utilitza una connexió i un protocol diferent. Els tres output ports també disposen de sis pins amb connexió digital. El port USB és d’alta velocitat, ja que pot transmetre fins a 12 Mbits/s. 3.1.2 Opcions del controlador NXT El millor que podem fer per tractar aquest apartat, abans d’endinsar-nos en la programació del robot, és conèixer quines són les opcions i el funcionament del controlador NXT. Per fer-ho, no hi ha millor manera que donar un cop d’ull al menú principal del robot per veure quines possibilitats ens ofereix. Per accedir-hi simplement hem d’engegar el robot amb el botó taronja. Menú principal: a) My files En aquesta opció hi trobarem tots els arxius que hem anat guardant al robot, organitzats en les següent subcarpetes: - Software files: Aquí hi guardarem directament tots els programes que hem dissenyat amb el software NXT Mindstorms NXT. - NXT files: Aquest és el lloc on trobarem tots els programes NXT desenvolupats mitjançant un llenguatge de programació no estàndard. - Sound files: Aquí hi trobarem tots els arxius de so que enregistrem, a més d’algun de mostra que el controlador ja hi té per defecte. b) NXT Program Aquesta és una de les opcions més curioses que ens ofereix el controlador, ja que podem programar el robot sense necessitat de cap més element. Tot i que les accions a realitzar i les seves possibilitats són reduïdes ja que no podem fixar magnituds concretes, podem fer una seqüència de fins a cinc accions intercalant les següents opcions: . Avanç i retrocés (5 rotacions i il·limitadament), girar parabòlicament endavant cap a la dreta i a esquerra (2 rotacions i il·limitadament), girar parabòlicament endarrere cap a dreta i a esquerra (2 rotacions i il·limitadament), emetre sons diferents, esperar 2, 5 o 10 segons, detectar objectes (ultrasò), detectar sons, llum o foscor o esperar el polsament del sensor. En l’últim bloc podem elegir entre Stop o la funció cíclica Loop. En tot cas sempre hem de respectar el següent ordre de connexió: Al port 1 li correspon el polsador; al port 2, el sensor de so; al port 3, el sensor de llum i al port 4, el sensor d’ultrasò. El port B i el port C han d’anar connectats, respectivament, al motor esquerre i dret. c) View L’opció View ens permet mesurar una determinada magnitud de qualssevol dels sensors quan nosaltres vulguem i a on vulguem. Així podem mesurar els decibels de so i els decibels ajustats a la nostra oïda (sensor de so), el tant per cent de llum reflectida d’una superfície o d’un espai (sensor de llum NXT i RCX), la temperatura en C i ºF (sensor de calor RCX), el moviment dels motors, el nombre de rotacions i els graus recorreguts (sensor de rotació NXT i RCX), el contacte o no amb una superfície (polsador) i finalment la distància en polzades o centímetres (sensor d’ultrasò). Per més detalls sobre el seu funcionament, consulteu l’apartat de programació “3.2.3.2 - Sensor de llum”. d) Bluetooth La presència del Bluetooth és un dels avanços del controlador NXT respecte el seu predecessor RCX, ja que aquesta evolució pot arribar a funcionar íntegrament per control remot (mòbil, PDA, etc.) i fins i tot actuar com un sensor més o descarregar programes a partir d’aquesta via. A més, fins a quatre controladors NXT es poden connectar de forma simultània. En aquesta opció del menú hi trobarem altres subcarpetes com “Els meus contactes”, on podem observar un llistat d’altres elements receptors de Bluetooth, l’estat de les "Connexions” en quatre canals diferents, la possibilitat de mostrar-se visible o no a "Visibilitat”, engegar o aturar el Bluetooth a “On/Off” i finalment, l’opció de buscar altres l'elements propers a “Searching” per posteriorment connectar-s’hi, introduint un mateix codi en ambdós llocs. e) Settings Aquesta opció està centrada en la configuració dels elements del controlador. És aquí on podem augmentar o disminuir el volum de l’altaveu, el temps d’espera abans de suspendre’s i, fins i tot, consultar la versió, la ID o nombre identificatiu del robot. També podem suprimir arxius de l’apartat “My files”, si no ho fem directament des d’allà. f) Try me Amb l’opció “Try me”, prova’m en català, podem comprovar el correcte funcionament de tots els dispositius que connectem al controlador, tant dels motors com el dels sensors. Per poder fer-ho, simplement hem de connectar el sensor o el motor al port que ens demana el controlador i seguir les instruccions de pantalla. Això es deu el fet que mentre en algun sensor s’emeten sons per comprovar el seu funcionament i calibració, d’altres es mouen els motors o fins i tot es mostren diferents rostres a la pantalla. Per saber què succeeix en cada sensor individualment consulteu aquest bloc. 3.1.3. Programació del controlador NXT i del robot Entrem ja dins la part pràctica del treball després d’haver fet un breu estudi sobre el funcionament i les característiques del robot. D’entrada podem dir que el controlador NXT es pot programar de moltes maneres diferents. A grans trets podem distingir tres mètodes principals: - Programació pel menú principal. Aquest mètode explicat anteriorment només permet realitzar cinc accions i tot i ser molt fàcil i ràpid, és extremadament simple. La gran majoria dels programes que vulguem dissenyar no es podran fer amb aquest mètode, que és més aviat per mostres. - Disseny dels programes amb el software NXT-G amb descàrrega via USB. Aquest és un software de programació basat en diagrames de flux* i molt visual, creat per la companyia National Instruments LabView, on es poden dissenyar programes en seqüències de blocs d’accions diverses. En adquirir tot el conjunt NXT, una còpia del programa per a PC sol venir inclosa amb la versió 1.1. Per aconseguir les noves, cal descarregar-se-les directament d’Internet. - Llenguatges de programació específics. Gràcies a l’alta compatibilitat del microprocessador, es pot arribar a donar ordres al robot mitjançant més de 20 llenguatges diferents, alguns de molt coneguts com el JAVA i d’altres no tant extesos però igual d’efectius com el RobotC. L’apartat de programació, com veureu a continuació, està estructurat primer en una part introductòria on s’exposa la metodologia per programar. Tot seguit entrarem en una anàlisi del software Mindstorms NXT-G i una descripció dels llenguatges que també fan possible aquesta acció. Finalment acabarem la programació, ja en l’apartat "3.2 – Els sensors”, on dissenyarem fins a 10 programes diferents. 3.1.3.1. Metodologia de programació a) Que haurà de fer el robot? Visualització de les accions de forma general b) Amb tots els ets i uts (Mirar-se cada gest amb detall) c) Disseny del programa amb el mètode adequat d) Primeres proves i primers retocs (assaig i error) Considerem que un programa funciona correctament, un 95% de les vegades.
3.1.3.2. Mindstorms NXT Educational 1.1 (NXT-G) Una de les maneres més senzilles i ràpides per a programar el controlador NXT és mitjançant el software NXT-G (icona superior). Diem senzilla perquè ens permet dominar un controlador programable sense necessitat de conèixer cap tipus de llenguatge de programació. A més, disposa d’una instal·lació senzilla i un funcionament molt visual, gràcies sobretot als diagrames de flux i les imatges que la companyia LabView, conjuntament amb els gràfics de Toolkit, han aconseguit establir. A aquests avantatges, s’ afegeix la gratuïtat del software si s’adquireix amb el kit complet i l’útil transferència dels programes al controlador mitjançant un cable USB o via Bluetooth. El programa es caracteritza per la facilitat d’ús en dissenyar programes de nivell bàsic, que es poden complementar amb d’altres de major dificultat arran de la introducció dels cables de xarxa o “data wires”. De fet, ni en un cas ni en l’altre, hem d’arribar a fer grans invents o càlculs complicats. L’últim punt a destacar del NXT-G és la facilitat de transferència dels programes al controlador, ja sigui per cable USB o Bluetooth. En les següents pàgines farem un estudi del software. Primer explicarem el seu funcionament general i les estructures que segueix. Més tard, ens endinsarem dins dels blocs de programació on estudiarem els blocs o funcions més bàsics, per més endavant presentar els més avançats. Aquest apartats ens serviran d’introducció de l’apartat de sensors, on posarem en pràctica aquestes mateixes funcions. Algunes d’elles, fins i tot, estaran més detallades en aquest apartat. 3.1.3.2.1 – Funcionament general El programa està dissenyat per a un públic molt ampli, per això presenta un funcionament molt simple. De fet, cada vegada que l’obrim ens ofereix un breu tutorial que ens indica quines són les bases a seguir del programa i en tot moment ens ofereix il·lustracions molt gràfiques en l’apartat d’ “Ajuda”. És molt recomanable que donem na ullada a aquest tutorial la primera vegada que l’obrim. Per poder simular programes al nostre aire, simplement hem d’obrir una nova fulla de treball clicant a la icona “New Program” de l’extrem superior esquerre. Se’ns obrirà una finestra com la imatge de sota anomenada inicialment “Untitled-1” on podrem començar a treballar. Abans de començar a simular res i a analitzar els blocs i l’estructura dels programes, donem un cop d’ull a totes les opcions que ens ofereix el programa. Des de les opcions de menú, fins a l’ “Ajuda”. Opcions menú principal NXT-G*: a) File (Carpeta) En aquesta opció no trobarem res específic sobre programació, sinó més aviat simples configuracions. Des d’aquí podrem obrir una nova fulla de treball (New), tancar-la (Close) o obrir algun programa ja desat (Open). També podrem realitzar accions de guardar (Save) i guardar amb un nom concret (Save as), de la mateixa manera que imprimir (Print) amb les preferències pertinents. Lògicament també es pot tancar tot el programa (Exit). b) Edit (Edició) A edició podem realitzar des de les comunes accions de desfer (Undo) i refer (Redo) o bé de retallar (Cut), copiar (Copy) i enganxar (Paste) els diferents blocs. Per altra banda, també podrem treballar amb els blocs de creació pròpia anomenats "My block”. Aquest blocs, com veurem més endavant, es caracteritzen per la personalització, ja que nosaltres els dissenyem incloent-hi un nombre indeterminat de blocs ja existents. Per exemple, podem establir que en un sol bloc* hi hagi el programa perquè el robot segueixi una línia blanca. De fet, podem realitzar diverses accions: des de fer-ne un de nou (Make a New My Block), a editar-ne d’altres (Edit Selected My Block) o també modificar la icona d’alguns ja existents (Edit My Block Icon). Però tot això no s’acaba aquí, ja que amb l’opció (Manage Custom Palette) podem controlar i dirigir tots els nous blocs, tant els dissenyats per nosaltres com els descarregats per Internet, que se’ns guarden automàticament dins la carpeta Blocks. Més enllà d’aquestes accions, a Edit es poden crear nous perfils d’usuari a més del ja creat per defecte (Default) amb el qual se’ns obrirà la primera vegada. Només és recomanable l’edició de molts perfils quan el programa l’utilitzin diferents personesamb simulacions diverses, ja que sinó això pot alentir-lo. També cal fer esment de l’última opció (Define Variables), molt útil quan hem d’utilitzar el bloc Variable, que ens serveix per guardar diferents dades dins del controlador en el mateix desenvolupament del programa. En l’opció definim amb quin tipus de variable (lògic, numèric o textual) volem treballar i després l’hem de crear. Més tard, la utilitzarem quan inserim el bloc. c) Tools (Eines) A eines podem realitzar quatre accions força importants pensades perquè els programes esdevinguin més precisos: - Calibració del sensors: des d’aquí podem enviar un fitxer que es desa automàticament al controlador i que ens permet fixar mitjançant la mesura directa, el nou interval concret (màxim i mínim) amb el qual treballarà els sensors NXT de llum i so i els RCX de llum. Abans, haurem de determinar el port a què estan connectats i després de tot el procediment és recomanable comprovar que els intervals absoluts 0 i 1023 han variat. - Actualitzar la versió del software NXT-G: en aquesta opció podem accedir a totes les noves versions que vagin sorgint del programa creat per LabView – Toolkit. A més de poder fer una visualització de la llista de les noves versions, també es poden buscar directament a una pàgina oficial de Lego (l’enllaç ja està fet) o al disc dur del nostre ordinador. Al final podem decidir si ens descarreguem la versió o no, ja que la seva instal·lació no sempre suposa una millora. - Importació i exportació de blocs: el programa ens dóna la possibilitat, mitjançant aquesta opció, de buscar nous i millors blocs pel nostre software, de la mateixa manera que podem exportar-ne d’altres a la xarxa. Tot això es realitza mitjançant dues pestanyes: la d’importació, on fins i tot, podem decidir en quina plantilla del conjunt de blocs l’adjuntem i la de direcció (Manage). - Descàrrega a més d’un NXT: amb aquest menú podem controlar quants NXT han estat connectats a l’ordinador i el seu estat de connexió. També podem descarregar-hi els programes quan i allà on vulguem, seleccionant o desseleccionant del menú. d) Help (Ajuda) L’opció d’ajuda ens ofereix, primer de tot, un enllaç amb un manual virtual del programa on se’ns mostren totes les característiques i possibilitats de programació, des del tòpic general fins a tots els blocs ordenats per la seva funció. (Contents and Index). L’apartat també ens ofereix ajuda i suport pel que fa a productes i actualitzacions amb enllaços directes a la xarxa: (Online Support) i (Online Updates), on trobarem ordenat de més antic a menys, tots els productes relacionats disponibles per descarregar amb una breu descripció tècnica. A més a més, podem registrar el producte a una pàgina de Lego, fet que ens permetrà accedir a actualitzacions i a informació sobre els nous productes. Finalment, podem accedir a un breu sobre el producte, on se’ns revela a qui pertanyen les llicències i es dóna informació sobre la versió del software de cara a noves instal·lacions. (About Lego Mindstorms Education NXT). Barra horitzontal superior En aquesta barra trobarem les icones més utilitzades per a programar, moltes de les quals ja apareixen en el menú principal superior. Es tracta de les següents icones:  (D’esquerra a dreta) - New program: Obre una nova fulla de treball. - Open program: Obrir una fulla de treball ja desada amb el programa. - Save: Guardar automàticament. - Cut: Talla tota l’àrea seleccionada. - Copy: Copia tota l’àrea seleccionada. - Paste: Enganxa tota l’àrea seleccionada prèviament copiada o tallada. - Undo/Redo: Desfà i refà totes les accions que realitzem. - Pointer tool: Aquesta eina ens serveix per seleccionar i deseleccionar objectes, ja siguin els diferents blocs o creant noves seqüències. - Pan tool: És l’eina de desplaçament. Ens serveix per moure’ns autònomament per l’espai on vulguem de forma molt precisa mantenint premut el ratolí. - Comment tool: Aquesta és l’eina de text que ens permet deixar comentaris allà on vulguem de la fulla de treball. - Create my block: Si seleccionem un o més blocs, podrem crear-ne un de nou que agrupi tots els que hàgim escollit. També haurem d’assignar un nom propi, una breu descripció opcional i dissenyarem la nova icona que utilitzem. - Perfil d’usuari: aquí podem elegir entre els diferents usuaris registrats amb el programa. En obrir-lo, sempre trobarem el creat per defecte (Default). * Cal anar en compte a guardar abans de canviar de perfil, ja que es tanquen totes les fulles de treballes obertes. Més enllà dels menús superiors, el programa també disposa a la part lateral dreta de dues pestanyes molt útils de cara a programar per primera vegada. Es tracta de les següents: Aquesta és una opció del NXT-G que ens ofereix la possibilitat de consultar fins a 39 programes diferents, de dificultat creixent i a on intervenen quasi tots els blocs existents, repartits entre el conjunt “Common Palette” i “Complete Palette”. A part d’ensenyar-nos a programar (Programming guide), l’opció també ens presenta una visualització gràfica de les accions del robot (Challenge Brief), acompanyada d’altres guies com ara la de construcció d’estructures estandaritzades (Building Guide) on podrem veure pas per pas la col·locació de les peces de Lego. A tot això, cal afegir l’utilitat d’un submenú on podem trobar programes específics d’exemple, per separat i classificat en següents grups: els motors, l’altaveu, la pantalla, la làmpada i els sensors (polsador, sensor de llum, sensor de so i ultrasò) i tot junt alhora també. Una llista dels cinc programes més útils i curiosos d’aquesta opció són: 06. Curve turn (Com fer un gir) 10. Parking bay (Aparcar el robot) 17. Follow a line (Seguir una línia) 20. Hit red ball (Jugar a golf amb una pilota vermella) 26. Reaction time (Temps de reacció) 2 - “My portal” – Altres enllaços Aquest és un espai del programa al qual només podem accedir quan disposem de connexió a Internet, ja que està format bàsicament per enllaços a altres pàgines. "El nostre portal", així es denomina, està dividit en dos grans blocs i només es troba en nglès: - Legoengineering.com: aquest és el web destinat a la última informació i les millors innovacions de la tecnologia de LEGO. L’espai es presenta com un portal on els experts deixen oberta una biblioteca de consulta, on trobem resums de conferència, codis de programació, música, manuals i presentacions per descarregar gratuïtament. Allí mateix trobarem una guia sobre com compatibilitzar el canvi dels controladors RCX a l’NXT i finalment veurem, també, una carpeta de Podcasts amb tutorials i documents diversos, juntament amb un enllaç titulat “Base del coneixement”, que dóna resposta a tot tipus de preguntes relacionades amb el robot. - Lego Education School: aquesta pàgina presenta el conjunt de productes de robòtica de LEGO i tot el que suposa entrar en aquest món. El lloc disposa d’un menú amb blocs tant pel sistema RCX com l’NXT. Aquí trobem un apartat per “Les preguntes més freqüents” o per les “Descàrregues d’instruccions de muntatge”. També hi trobarem un breu resum sobre programació. Com fem els programes? Blocs i seqüències Deixat a banda totes les opcions que presenta el software, molt útils en la simulació de programes, centrem-nos en els blocs que configuren la part bàsica del programa. L’NXT-G disposa sempre d’una fulla de treball amb una icona immòbil, (C3) que marca ’inici de qualsevol programa. Aquesta icona disposa de tres braços, anomenades seqüències en programació, que no deixen de ser la fila d’indicacions que rep el controlador simultàniament perquè acabin sent ordres en el desenvolupament d’un programa. En molts dels programes simples, però, només arribem a utilitzar fins a una d’aquestes seqüències d’accions. També és important saber que podem crear altres seqüències paral·leles a qualssevol d’aquestes tres primeres, clicant Shift just a l’àrea on volem que en surti una altra.   C3 Lògicament, les indicacions a realitzar en el programa les insertem nosaltres mitjançant els blocs, unes estructures de forma quadrada que no són res més que les accions que fa el robot i que enllacem encadenades (una darrera l’altra) en l’espai de les seqüències. Per altra banda, també podem connectar els blocs entre ells mitjançant cables de xarxa (data wires) dels quals parlarem més endavant, a l’apartat “3.2 – Els sensors”. On trobem els blocs? Els blocs els trobem agrupats en tres grups segons diversos criteris en el lateral esquerre de la pantalla del programa: El primer grup (pestanya Common palette) inclou tots els blocs que realitzen accions força comunes en la programació com la de moure els motors, memorització i execució de moviments, emissió de sons, temporitzador o funció cíclica. També podem escriure text a la pantalla o iniciar una funció interruptor. Aquest grup no deixa de ser un menú ràpid de les accions més utilitzades. El segon grup mostra tots els blocs existents que vénen amb el programa. Per aquest motiu, la pestanya s’anomena Complete palette (C4). En aquest grup hi trobem els blocs agrupats segons la seva freqüència d’ús o funció: Common (grup més utilitzat), Action (produeixen moviment i accions al robot), Sensor (transmeten el senyal d’aquests dispositius), Flow (conté funcions que modifiquen el flux del programa), Data (transmeten o produeixen dades en la seqüència) i finalment Advanced (conté els blocs més avançats i que desenvolupen accions més complexes com calibrar sensors, guardar dades o text i a més posar a zero els motors. C4 L’últim i tercer grup (Custom palette*) està format per tots els blocs que de manera autònoma creem i dissenyem a partir dels blocs dels quals ja disposem (My blocks). Per fer-ho hem d’accedir al menú principal a l’opció Edit, seleccionar el o els blocs desitjats per crear el nou i finalment dissenyar la nova icona identificativa que trobarem amb la resta de blocs. En aquest grup també hi són presents els blocs que importem descarregats des de la xarxa (Web Downloads). A tots ells els veurem un per un en el proper apartat. Preguntes freqüents: a) Com col·loquem els blocs en una seqüència? En aquest aspecte l’NXT-G és un programa molt eficient, ja que simplement hem de seleccionar el bloc que utilitzem a la barra lateral i arrossegar-lo cap on vulguem fins trobar l’espai de la seqüència desitjat. Per saber si realment el col·loquem en el lloc indicat, el programa ombreja les caselles pròximes al punt on deixem el bloc. Quan el programa no ens deixa col·locar-lo és degut a un possible error en la seva situació.
b) Com guardem les seqüències dels blocs al robot? Per guardar dins del controlador totes les seqüències que anem fent amb el programa, simplement hem de connectar aquesta part del robot a l’ordinador, ja sigui per cable USB o via Bluetooth. Un cop connectats, hem d’assegurar-nos de disposar una memòria suficient dins del controlador. Després d’aquests passos ja podem enviar el programa amb el botó Download que trobem a l’extrem inferior esquerre de la fulla de treball. Per a més informació, consulteu l’exemple del programa nº1 de l’apartat que vindrà tot seguit de sensors, ja que aquesta acció és igual amb qualsevol dels programes. 3.1.3.3 – Els blocs del programa: funció i característiques
Per explicar cadascun dels blocs els he classificat en dos grans grups: un de nivell bàsic, és a dir, blocs senzills i sovint utilitzats per programar i un altre de nivell avançat, on hi trobarem els blocs més complexes i originals que, en alguns casos, gairebé no s’utilitzen. Hem de tenir en compte, també, que cada bloc té el seu propi Data Hub, una pestanya per treballar amb cables de xarxa que ja analitzarem més endavant amb els programes per a sensors. 3.1.3.3.1 – Blocs de programació “Bàsics” (Common, Action, Sensor i Flow) L’adjectiu “comú” fa referència a l’alta freqüència amb què s’utilitzen els següents blocs que detallem a continuació: a) Move Block Aquest és de ben segur el bloc més utilitzat en programes relativament senzills. Sense entrar en detalls, ja que l’expliquem moltes vegades en programes posteriors, el bloc “Moviment” s’utilitza per activar qualsevol dels tres motors NXT, conjuntament o per separat. A més, podem determinar la direcció (que el robot avanci, retrocedeixi o es pari), el tipus de gir parabòlic que volem, la potència, la duració o l’estat dels motors en la següent acció.  b) Record/Play Block  El segon bloc Common de la llista és un bloc per a grabar i reproduir accions dels motors, és a dir, primer et dóna la possibilitat de simular manualment les accions que vulguem del motor (comptant el nombre de girs), per després repetir-les automàticament en iniciar el programa ja grabat, sense que nosaltres interactuem. Per grabar l’acció, però, hem de seguir uns passos previs. Primer hem de col·locar el bloc en una seqüència i dintre les seves opcions, determinar l’acció de “grabar”, assignar un nom al programa i fixar un temps aproximat de duració de l’acció. També haurem de dir amb quins dels motors treballarem (A, B o C), com veiem a continuació:  Tot seguit, descarreguem el programa al controlador per primera vegada. A continuació, realitzem les accions que vulguem. Un cop gravades (poden no ser sempre exactes a les que hem fet), haurem de tornar a connectar el controlador al programa i canviar l’acció de gravar per la de reproduir, a fi de que el programa repeteixi les nostres accions i no les borri per unes altres. En el mateix procés, haurem de donar el mateix nom del programa que hem assignat abans.  Finalment, descarreguem el bloc de nou i en accionar el programa, el robot repetirà, amb més o menys fortuna, les nostres accions. c) Sound Block  Aquest bloc ens permet emetre un so o un to en els programes. A més, si unim diferents blocs del mateix tipus, podem arribar a compondre breus melodies. Les opcions que ens ofereix són nombroses, ja que podem reproduir un so d’arxiu del llistat que incorpora de sèrie l’NXT-G o bé, emetre notes diferents de l’escala musical. De la mateixa manera, podem reproduir o aturar els sons, controlar el volum, repetir de forma indefinida un to o seleccionar l’opció “Wait for Completion”, que ens permet aturar el programa fins que no es reprodueixin tots els sons.  Per a més detalls sobre el bloc, consulteu el programa nº7 del següent apartat de sensors. c) Display Block
Si els blocs anteriors ens permetien moure els motors o grabar un so, aquest bloc ens permet mostrar un text, una imatge o una forma qualsevol a la pantalla del controlador (100 x 64 píxels) durant el programa. Igual que en el bloc de so, si utilitzem diversos blocs de pantalla seguits, podrem crear formes i imatges més complexes. El programa ens ofereix diferents opcions segons si el que mostrem és una imatge, un text, un dibuix o un reset: - En el primer cas, podem escollir una imatge d’una llista amb un centenar d’il·lustracions diferents i tot seguit determinar-ne la seva posició. - En el segon cas, escrivim el text que vulguem (hem de tenir en compte que si és molt llarg no es mostraran tots els caràcters) i també configurem la seva posició a la pantalla amb les coordenades i les línies.
En el cas del dibuix, podem escollir entre utilitzar diferents formes: un punt, una línia, na circumferència i lògicament determinar-ne la seva posició, línia o radi. Finalment, també podem fer un reset per deixar la pantalla en blanc. En tots els casos podem fer una neteja de pantalla per esborrar tots els continguts anteriors al del bloc, com ara la icona del programa. Wait Block/ Loop Block / Switch Block Tots aquests blocs que també pertanyen al bloc Common, els he encabit dins el grup Flow que trobarem més avall. Si tenim en compte la seva funció, és més adient fer-ho així.
El sustantiu “acció” és el mot genèric per als següents blocs, ja que en tots ells s’hi duu a terme un moviment, un enviament d’informació i inclús l’encesa d’un petit llum. a) Lamp* Block Com molt bé indica el seu nom, aquest bloc ens servirà per controlar la petita làmpada que ve juntament amb el pack Mindstorms NXT i que necessita un adaptador especial per connectar-se al controlador. De fet, aquest bloc s’ha d’entendre com un conjunt de blocs, ja que en necessitarem un mínim de dos per encendre i apagar la làmpada.
L’opció més important que ens ofereix és la modificar l’intensitat de llum de la làmpada en un interval que va de 0 a 100. Pel seu correcte funcionament, hem de seleccionar el port corresponent (A, B o C) i determinar si engeguem o apaguem la làmpada. L’ús d’aquest bloc sol solapar-se amb l’ús del sensor de llum, que detectarà variacions en la intensitat si col·loquem la làmpada prop del sensor. Aquest fet ens pot servir com a senyal dins del programa per fer una altra acció. b) Motor Block Aquesta és una segona manera per activar un motor connectat al controlador. A diferència del bloc Move, sovint s’utilitza més per a braços adjunts que no pas per a les rodes del robot. Les diferències més importants que presenta amb l’anterior bloc és el control dels següents paràmetres: - L’acció: podem elegir entre una acció constant o una acció amb acceleració (que augmenta progressivament la velocitat “Ramp up” o bé que la disminueix "Ramp down”). - Control de potència del motor: aquesta opció ens permetrà mantenir la potència del motor assignada, tot i la fricció o la resistència d’algun element extern. - “Wait for completion”: Seleccionant aquesta opció, podrem establir una prioritat pel bloc que no permet avançar el programa fins que les accions del mateix bloc s’acabin.
Per contra, el “Motor Block” no té el control sobre els girs parabòlics ja que no disposa de l’opció per dirigir el robot “Steering”. De fet, només pot actuar sobre un motor i no pas sobre els tres simultàniament. No entrem en més detalls, ja que aquest bloc està descrit en nombrosos programes per a sensors. c) Motor* Block Aquest bloc ens permet controlar de manera concreta la velocitat de treball d’un motor que no pertanyi a la sèrie NXT, com ara l’RCX. Per aquest motiu, necessitem un cable adaptador per connectar-lo al controlador NXT. La simplicitat del bloc es tradueix amb les dues opcions que ofereix: controlar la potència, és a dir, regular el voltatge del motor i determinar la direcció amb què actua (endavant, endarrere o atura). d) Send Message Block Com molt bé indica el seu nom, aquest bloc permet enviar missatges d’un controlador NXT a un altre via Bluetooth. 1) Com podem enviar els missatges? Perquè la comunicació entre dos o més NXT funcioni, hem d’activar el Bluetooth en tots ells (trobarem aquesta opció al menú principal) i, seguidament, iniciem una recerca dels altres dispositius de la xarxa. Un cop trobats, hem de triar el canal (1,2 o 3) pel qual enviarem la informació. En la primera connexió, a més, haurem d’introduir una clau d’accés acceptada per tots els robots. Després del procés, ja coneixerem el nom del robot i simplement l’hem de seleccionar per iniciar l’enviament del missatge. En el cas d’enviaments de missatges a més d’un robot (només es pot fer a un màxim de tres) haurem de repetir el procés descrit.
 2) On es guarden els missatges? Els missatges es guarden dins de les anomenades “bústies” o Mailbox. Cada robot disposa de deu bústies on s’arxiven tots els missatges que es reben, amb una capacitat màxima per a cinc missatges. Si està omplert i n’enviem un altre, el robot borrarà automàticament el missatge arxivat més vell. Les opcions del bloc són tres: primer hem d’elegir el nº de la targeta de connexió NXT, després en quin dels tres formats (text, número o lògic) enviarem el missatge i finalment, escollirem en quin mailbox o bústia es guardarà. Com veurem més endavant, el procediment per a rebre el missatge és molt similar.  Aquest grup està conformat per tots els blocs que tenen una relació directa amb els sensors. Molts d’ells són els encarregats de fixar un valor llindar que el sensor transmet al controlador i que provoca una determinada acció al robot. Perquè aquest moment es pugui utilitzar en el programa per fer accions, fem servir la sortida o output de tipus lògic, de la qual disposen tots els blocs “Sensor” i la connectem (via Data Wire) amb d’altres de compatibles. a) Light Sensor Block El bloc de sensor de llum fixa un valor d’intensitat lumínica (conegut com a Trigger Point), a partir del qual el controlador farà una acció determinada o la deixarà de fer, segons els valors detectats constantment pel sensor de llum.

Perquè aquest bloc funcioni correctament, hem d’obrir el DataHub (una pestanya situada a la part inferior del bloc) i utilitzar l’output de senyal lògic (Yes/No) per enviar la informació a un nou bloc, que ha de disposar lògicament d’una entrada o input del mateix tipus. A més d’aquesta sortida, en trobarem d’altres com la d’intensitat o el "Raw Value” (valor constant). Les opcions del bloc, a part de l’elecció del port de connexió, són dues: - Compare: Fixem el valor d’intensitat de llum (Trigger Point) a partir del qual tindrem un senyal lògic en la seqüència. - Function: El sensor pot generar llum de forma autònoma si seleccionem aquesta opció. Per a més detalls sobre el bloc, consulteu el programa nº5 del següent apartat de sensors. b) NXT Buttons Block Aquest bloc permet activar una acció prement qualssevol dels tres botons taronges que hi ha al controlador (el botó Enter, el botó dret o el botó esquerre). Per fer-ho també hem d’utilitzar l’output de senyal lògic i connectar-lo en algun altre bloc amb un input lògic. Trobarem dos outputs més en aquest Data Hub: Action i Button. 
Les dues opcions que ofereix aquest bloc són: - Button: El senyal lògic s’enviarà només quan es premi el botó que haguem seleccionat dels tres. - Action: Cada botó es pot activar de tres maneres diferents en prémer-lo: pressionant (Pressed), alliberant (Released) o colpejant (Bumped). És necessari escollir-ne una. c) Receive Message Block Aquest bloc permet utilitzar l’acció de rebre un missatge com a senyal d’inici per altres accions en el programa. Per fer-ho hem d’utilitzar els output del bloc, que poden ser de tipus numèric, lògic o de text i connectar-los amb l’entrada d’altres blocs pertinents. 
Les opcions el bloc són les següents: - Message: Aquí hem d’escollir en quin dels tres formats rebrem el missatge (text, número o lògic). A més, podem comparar el missatge rebut amb un missatge de prova, escrivint a la segona finestra el text o els números corresponents o utilitzant els botons del controlador. - Mailbox: Escollim el correu (de 1 a 10) on el missatge es guardarà com arxiu del controlador. Posteriorment, doncs, el podrem consultar. A tenir en compte: 1) Abans d’enviar qualsevol missatge, hem d’activar la connexió Wireless dels NXT que participin en la comunicació i buscar els altres dispositius receptors de Bluetooth en el menú del controlador, a més d’establir el canal de connexió (1,2,3 o 4). En el primer enviament, haurem d’escriure una contrasenya igual tant en l’emissor com en el receptor. A partir de llavors, tots dos dispositius ja apareixeran com a coneguts i podrem iniciar l’enviament quan vulguem. Si un controlador vol enviar el missatge a altres controladors de forma instantània, haurà de repetir el procés descrit. De forma simultània, només se’n pot enviar un màxim de tres. 2) Cal vigilar amb el Data Hub d’aquest bloc, ja que segons quin dels tres formats de missatge escollim, l’input del missatge es convertirà automàticament en un output de text, d’imatge o lògic, que s’enviarà per cable de xarxa de la manera corresponent. Si no ho fem, el senyal del missatge no arribarà mai al programa. d) (Built-in) Rotation Sensor Block (explicat a motors) Aquest bloc està íntegrament explicat en la part de programació de motors, en l’apartat 3.3. e) Sound Sensor Block El bloc del sensor de so ens permet establir un valor de dB, expressat en %, a partir del qual el robot pot fer una acció diferent de la que estava fent. Com la resta de blocs “Sensors”, és necessari utilitzar la sortida lògica per provocar alguna acció en el programa. Si el so detectat compleix amb les premisses establertes, el robot rebrà un senyal True i procedirà a fer l’acció del bloc amb el qual l’hàgim connectat (per exemple, la direcció d’un motor). En cas contrari, en rebre un senyal False, continuarà en el mateix estat anterior. 
En les opcions del bloc, a banda d’escollir el port on està connectat el sensor, també podem establir a Compare, el valor de so i l’interval que considerem com a senyal verdader. Aquest valor no ha de correspondre amb els més grans i pot ser qualsevol entre el 0 i el 100 i anirà fins el 0 o 100. Per fer-nos una idea de quina és l’equivalència d’aquest percentatge amb l’intensitat de so consulteu la introducció del sensor de so (apartat 3.2.3.3). Malgrat tot, és sempre millor utilitzar l’opció View que és més precisa i inclou altres factors d’error. f) Timer Block Tot i que a ser possible sempre és millor evitar l’utilització de temporitzadors en els programes per evitar desajustaments entre les accions, també disposem d’un bloc de temps. Amb aquest bloc podem utilitzar qualssevol dels tres temporitzadors del robot (1, 2 i 3) i a més realitzar dues accions diferents: fer una lectura real de temps des de l’inici del programa o bé reiniciar-lo des de zero (Reset). Perquè el bloc funcioni, també utilitzem l’output lògic per enviar la senyal de lectura de temps real, que serà real o falsa, segons si es supera o no el valor llindar (Trigger point) que haguem establert en les opcions del bloc que veiem a sota. El bloc també disposa d’un cable de tipus numèric en el Data Hub. 
Com es pot observar, hem d’elegir quin dels temporitzadors utilitzem. A part d’això, hem d’introduir el temps d’espera, que serà en un instant diferent segons si hem triat Read or Reset. El senyal lògic s’enviarà quan es superi (>) el temps establert, o bé, per sota si el signe és (<). g) Touch Sensor Block Aquest bloc ens permet enviar un output lògic quan es produeix alguna de les tres accions en el sensor de contacte (pressió “Pressed”, colpeig “Released” o alliberament "Bumped”). El senyal serà True quan es compleixin les condicions que haguem determinat a Action, sempre i quan haguem assignat el port corresponent.  En el Data Hub, trobarem altres outputs com el de Raw Value* o el d’Action. h) Ultrasonic Sensor Block El bloc d’ultrasò realitza la mateixa funció que els que hem explica fins ara. El seu funcionament es basa en detectar una distància inferior o superior a la que nosaltres assignem en el programa coneguda com a Trigger point (punt de canvi). Això sí, el límit d’abast del sensor és de 250 cm com a màxim i comença a ser precís a partir de 5 cm. 
Podem utilitzar com a unitat de mesura les polzades (inch) o els metres (m), tenint sempre en compte la conversió: 1 polzada = 2,54 · 10-2 metres. En aquests quatre blocs, hi ha un “flow” flux continu d’accions que desenvolupen diferents funcions que tenen un paper molt important en el programa, ja sigui dividint la seqüència o repetint-la de forma indefinida fins a un moment determinat. Per veure’ls en més detall, cal adreçant-nos en els següents programes de l’apartat “3.2 – Els sensors”, tot i que els trobarem en molts dels altres deu. a) Loop Block (programa nº2) b) Stop Block (programa nº1 – bloc E) c) Switch Block (programa nº3) d) Wait Block (programa nº1 – bloc C) 3.1.3.3.2 – Blocs de programació “Avançats” (Data, Advanced, My Block i Downloads) En aquest segon grup de blocs farem un breu anàlisi de les funcions més avançades que ens presenta el programa. Ho farem de forma breu, sense endinsar-nos massa en la seva complexitat. De fet, molts d’ells no els arribarem a utilitzar mai.
En aquest primer grup de blocs avançats hi trobarem un conjunt de blocs que treballen exclusivament amb dades, ja sigui creant-les, modificant-les o bé emmagatzemant-les. En el primer bloc, els Data, treballarem amb blocs que modifiquen o generen variables i que funcionen amb l’ajuda íntegra del Data Hub*. a) Compare Block Aquest bloc ens determina tres condicions sobre un valor numèric d’entrada A: si és més gran (>), si és més petit (<) o si és igual (=) respecte d’un altre del programa (per exemple d’un sensor) o d’un que haguem introduït nosaltres (B). Funciona íntegrament amb el Data Hub i per això, disposa de dos ports d’entrada (A,B) que han d’estar obligatòriament connectats si no hem introduït un valor nosaltres mateixos en un d’ells. El resultat de la “comparació” l’obtenim amb l’output lògic (cercle blau). 
b) Logic Block Com indica el seu nom, aquest bloc treballa amb senyals lògics True (V) o False (X). La seva característica més destacable és que pot fer la funció de quatre portes lògiques diferents, ja que realitza les següents operacions: negació (Not), suma (Or), multiplicació (And) i la funció booleana* (Xor). Funciona també amb el Data Hub i les entrades A i B vénen donades per un cable de xarxa amb dades de tipus lògic. També podem seleccionar manualment un valor arbitrari. El resultat de l’operació de la porta lògica seleccionada estarà en l’output o sortida lògica del bloc. Per més informació, consulteu el bloc C i D del programa 5 del sensor de llum, on es mostra el funcionament d’una porta NOT i OR.

c) Math Block Aquest bloc es caracteritza per a fer operacions matemàtiques senzilles, com ara la suma, la resta, la multiplicació o la divisió dels valors d’entrada A i B, el resultat del qual serà l’output simbolitzat amb (# - Raw Value). Igual que en els casos anteriors, podem introduir un valor de forma manual que substitueixi un cable de connexió.
 d) Random Block Aquest bloc ens permet generar un valor numèric de forma aleatòria. Per més informació, consulteu el bloc E del programa 10. e) Range Block Amb aquest bloc podem determinar si un valor està dins o fora un interval i per tant transmetre un senyal lògic, segons la condició que haguem establert: (Inside range) o (Outside range). Aquest interval el podem crear a partir de valors A o B procedents de cables de xarxa de tipus numèric o bé introduint-los manualment. Podem comprovar el seu funcionament introduint un nombre a Test Value (#).
f) Variable Block Aquest bloc ens permet guardar variables de tipus lògic, numèric o textual en la memòria del controlador per tal que després altres blocs en facin una lectura i actuïn d’acord amb ells. El seu funcionament es basa amb el Data Hub, igual que la resta de blocs Data. Malgrat això, aquest bloc requereix un passos previs abans de connectar l’output de sortida a un altre input. Primer s’ha de definir el tipus de variable amb què treballarem en l’opció Editar del menú i seguidament, assignar-li un nom, que serà el mateix que utilitzarem en les opcions del bloc. La variable que obtinguem pot venir d’un cable de xarxa i per tant esdevenir un valor dinàmic* per escriure (Write), o bé, introduir-lo manualment, valor estàtic* (Read). Aquest bloc també es pot utilitzar per guardar un valor i després llegir-lo en el programa. Qualsevol modificació sobre la variable, implica iniciar tot el procés. 
 En aquests dos grups hi trobarem tots els blocs que creem i dissenyem nosaltres de forma autònoma amb l’aportació de blocs del programa, o bé importats de la xarxa, sovint degut al desenvolupament de nous sensors. De fet, amb aquesta opció, podem encabir un programa en un mateix bloc si no ens interessa mostrar-lo a ningú més. El procés està explicat en l'apartat "b)Edit" del funcionament general del programa (3.1.3.2.1). 3.1.3.4 – Llenguatges de programació Si bé el software que acabem de presentar pot representar un element de gran ajuda, també és cert que pot ser insuficient per esprémer fins a l’última gota totes les possibilitats que ens ofereixen tant el controlador com els sensors. A part d’aquest fet, la programació amb NXT-G pot representar un problema en diverses situacions, ja que molts dels programes dissenyats per aquest mètode ocupen molt més espai en la memòria (de tres a sis vegades més) que els compilats per altres llenguatges.
Altres inconvenients són la lentitud del sistema, que obliga a invertir més temps en processos com ara la càrrega d’un programa al controlador o el disseny dels mateixos a l’ordinador. La generació automàtica d’errors en programes molt extensos també representa un problema. Per tots aquests motiu, molts experts han explotat la compatibilititat d’alguns dels llenguatges de programació més coneguts amb el controlador Mindstorms NXT, creant nous programes o adaptant-se al sistema d’aquest. A continuació, vegem una llista dels llenguatges més utilitzats: Robot C NXJ Lejos (Java) URBI MATLAB RoboRealm Phyton 3.2. ESTUDI DELS SENSORS En aquest apartat, analitzarem, estudiarem i programarem cadascun dels sensors compatibles amb el controlador NXT descrit en les pàgines anteriors. Passem a veure, doncs, què és un sensor i què cal tenir en compte. Tot seguit, presentarem els sensors un per un, endinsant-nos també en l’entorn de programació. 3.2.1. Què és un sensor?
Un sensor és un element que actua de dispositiu sensible a determinats estímuls de l’entorn. Aquests senyals que el sensor capta s’anomenen variables de treball, que poden ser entre moltes d’altres magnituds, la intensitat lumínica, la distància, el pH, la humitat, la pressió o la mateixa temperatura. El funcionament del sensor consisteix en captar aquests estímuls per produir un senyal, sovint elèctric i transmetre’l a un altre dispositiu del circuit elèctric de manera que aquest sigui quantificable i manipulable. 3.2.2. Sensors NXT Mindstorms Aquesta és una de les imatges més importants del treball, ja que podem observar-hi tots els sensors acoblables al controlador NXT amb els quals treballarem i dissenyarem programes amb diferent grau de dificultat. Començarem amb el sensor de contacte o final de cursa (2), continuarem amb el sensor de llum (4) i el sensor de so (3), per acabar amb el sensor d’ultrasò (5). En altres parts del treball, també estudiarem amb els motors (6). 3.2.2.1. Sensor de contacte o polsador
a) Definició, possibilitats d’ús i connexió amb el robot Aquest sensor també es coneix amb el nom de final de cursa. Es tracta d’un dispositiu que permet donar diferents informacions al robot, com ara saber on hi ha un objecte, gràcies el polsament directe d’una part del sensor. És un exemple clar de funcionament digital (ja que o bé està polsat – posició 1 – o bé no ho està – posició 2.) i mecànic (necessita un contacte directe). Forma part del grup de sensors electrònics de posició, ja que gràcies al polsador un robot es pot orientar en l’espai. La seva utilització està molt estesa en robots de sistemes industrials per indicar la fi o l’inici d’una acció, però també els podem trobar en estris tan quotidians com el ratolí de l’ordinador o en els botons de “Play” o “Stop” de qualsevol walkman o MP3. En anglès, el polsador es coneix com a “touch sensor o bumper”. El sensor de contacte amb què treballem permet tres situacions d’ús diferents: (D’esquerra a dreta): En la primera el sensor transmet la informació al controlador quan el polsador és pressionat, la segona la transmet quan el polsador ja es deixa de pressionar (alliberament) i en la tercera, quan s’efectua tot el procés de pressió i alliberament (colpeig). La connexió del polsador amb el controlador és senzilla. Simplement hem de disposar d’un cable compatible amb el sistema Mindstorms ® NXT que connecti el sensor amb qualsevol dels ports del controlador (1,2,3,4), i assignant-li el corresponent port més tard en el programa. Per comprovar el correcte funcionament d’un polsador, aquest s’ha de connectar al port 1 i anar a la funció “Try me” (Prova’m) del menú principal. Si el sensor funciona correctament obtindrem un so i una expressió alegre en la pantalla cada vegada que premem el polsador.  En el disseny de l’estructura del nostre robot de Lego vam arribar a col·locar dos sensors de contacte (un a la part davantera i un altre a la posterior) com es veu en la imatge anterior. A davant vam dissenyar un mecanisme perquè fos més fàcil la pressió del polsador:
Entorn de programació del polsador  El fet que hàgim col·locat els sensors en aquestes posicions es deu a les possibilitats de programació que ens permeten desenvolupar. D’aquesta manera disposem d’un dispositiu al davant i al darrera que permeten que robot s’orienti millor. A continuació, presentem dues situacions en què necessitarem aquest sensor. Programa 1 – Detecció d’una superfícieVolem que el robot s’allunyi una distància d’uns 20 centímetres d’un objecte d’una paret o de qualsevol altre obstacle) després de topar-hi. En altres paraules, deixarem que el robot avanci indefinidament fins que xoqui amb algun bjecte, del qual immediatament es separarà 20 cm. L’ordre que rebrà per separar-se’n es donarà a partir del xoc del polsador davanter.
Seqüència d’accions: El procés més important abans de programar és tenir molt clares quines són les accions a realitzar. Per això, vegem quines són les ordres que haurem d’executar i en quin ordre:
A) Bloqueig del braç En la primera acció hem de bloquejar el braç del robot on hi ha el polsador, en una posició més o menys perpendicular amb la vertical del robot. Això es fa per tal de facilitar el bon funcionament del mecanisme del sensor. Atenció: L’acció de bloquejar l’efectua el mateix motor A (situat a la part esquerra del robot i unit al braç de forma mòbil). Vegeu la imatge S3. Per altra banda, l’acció de col·locar el braç en un angle de 90º és una tasca manual, ja que com que el braç és mòbil està constantment canviant de posició. En l’execució del programa no caldrà tocar-lo, però. Dins del programa:
 
 B) Avanç il·limitat Ara afegim la segona ordre al programa que és la d’avanç il·limitat. Per fer-ho hem d’afegir al programa la icona de la imatge S6 que l’extraiem de la barra lateral anant a "Complete palette” / “Common” cercle verd / “Move”. De la mateixa manera que abans, ens apareix a la part inferior de la pantalla diferents opcions per aquest moviment (imatge S7). El més important que haurem de fer aquí és activar els motor C i B per igual (motors de les rodes) per anar en línia recta i posar-lo com a moviment il·limitat.  
C) Activació polsador - Xoc La tercera ordre que hem de donar al robot és introduir el senyal del sensor de contacte dins del programa, perquè quan sigui polsat en el xoc contra una superfície, aquest deixi de fer un avanç il·limitat per retrocedir 20 cm. Per fer-ho hem d’afegir la icona de la imatge (S8) que l’extraiem anant a “Complete palette”/ “Flow”/ “Wait”. Per defecte ja se’ns selecciona el sensor de contacte. Vegem, però, quines són les opcions que també se’ns donen a escollir (S9).  D) Separació de l’obstacle La penúltima ordre a executar en el programa diu que ens separem 20 centímetres de l’objecte amb el qual hem topat. Perquè això sigui possible, però, hem de calcular quantes rotacions enrere haurà de fer la roda basant-los amb la seva longitud, que és de 16,9 cm. (16,9 cm = 2 ·π ·radi.) Hem de tenir en compte també que la durada d’un moviment, a més d’expressar-se en rotacions, també es pot expressar en graus i en segons. En el programa fa aquesta equivalència d’unitats per a qualsevol potència. 1 rotació = gir 360º = 1 segon girant Fent aquests càlculs podem saber que per retrocedir 20 cm hem de fer girar en sentit invers 1,18 rotacions en línia recta els motors B i C. 16,9 cm = L = longitud de la roda 20 cm / 16,9 cm = 1,18 rotacions 1,18 rotacions = 425º = 1,18 segons girant  ** El robot també té una opció anomenada “View me”, utilitzada tant en sensors específics com en els motors que ens permet calcular i calibrar dades diverses, des de la quantitat de decibels (db en el sensor de so) a la llum reflectida (en %) en el sensor de llum. En els motors ens és molt útil ja que ens diu quantes rotacions exactes fa el robot en una simulació sense necessitat de cap càlcul matemàtic. Per passar aquest ordre al programa hem d’extreure la mateixa icona que en l’apartat "B – Avanç il·limitat”. Hem d’anar a “Complete palette”/ “Flow”/ “Wait”. 
E) Aturar el programa Per aturar totes les accions que es duen a terme en el programa hem de col·locar com a última peça del programa la icona de la imatge S13. Per fer-ho hem d’anar a "Complete palette”/ “Flow”/ “Stop”, extreure-la i afegir-la a la cadena d’ordres. Aquesta opció consisteix simplement en aturar el programa i no té cap més opció.  Un cop tinguem el programa complet amb totes les ordres i abans de passar-lo al robot, cal guardar-lo anant a File / Save as / escriure el nom amb què vulguem guardar-lo (per exemple polsador1) i finalment clicar a Save. Per guardar el programa dins del robot hem d’anar a la part inferior de la pantalla on trobarem aquest conjunt d’opcions. La que utilitzem més sovint i recomanem perqu ès la més segura i menys perillosa, sobretot si el programa es passa per cable i no per Bluetooth és la següent: Perquè quedi guardat dins la memòria del controlador haurem d’anar a “Download” (descarregar) i esperar que el programa es guardi i es compili. En aquest procés el robot ha d’estar obert i connectat a l’ordinador per un cable USB compatible amb el sistema Mindstorms NXT . Un cop finalitzi, trobarem el programa a punt de fer-lo servir dins la carpeta “Software files” (arxiu de programes) que es troba en l’opció “My files” (els meus arxius) del menú principal.
Programa 2 – Avanç i retrocésVolem que el robot sigui capaç de canviar el sentit de direcció cada vegada que topi amb un obstacle, de tal manera que vagi endavant i endarrere alternativament. A més, volem que aquest procés es repeteixi cinc vegades.
En aquest programa actuaran tots els polsadors de què disposa el nostre robot, tant el davanter com el posterior (vegeu S1). Com ja els hem utilitzat de forma anàloga en el programa 1, els polsadors ens serviran per donar un senyal al robot per a realitzar un moviment d’avanç i de retrocés al colpejar contra un objecte o una superfície que obstrueix el seu pas, de tal manera que anirà variant el seu sentit de direcció (avanç i retrocés).
Seqüència d'accions:
Funció LOOP o funció “cicle / repetició” : Després de l’estudi del controlador hem pogut observar que hi ha moltes funcions diferents disponibles dins del software Mindstorms NXT, des d’esperar a un temps fins a aturar un programa. Una altra de les funcions possibles és la funció “Loop”, que consisteix bàsicament en repetir de forma cíclica un conjunt determinat d’accions. En aquest segon programa, l’utilitzarem. Per aquest motiu caldria analitzar abans la manera com s’utilitza i quines opcions de treball té. Perquè les accions es repeteixin de forma contínua, com en un cicle, hem d’introduir totes les que vulguem que es repeteixin a l’interior de la icona de la funció Loop (S13), la qual s’afegeix al programa anant a la barra lateral / “Complete palette”/ “Flow” / . D’aquesta manera, exceptuant l’acció A i F, tota la resta d’accions del programa 2 s’afegiran a l’interior del Loop (imatge S14), ja que volem que el robot avanci i retrocedeixi, repetint aquest procés 5 vegades. La funció “Loop” dóna lloc a cinc opcions diferents segons el control que en fem: 1) Forever. Ens permet mantenir indefinidament (∞) la seva actuació sobre el programa. 2) Sensor. Ens permet realitzar un cicle d’accions de forma continuada fins que un determinat canvi en l’exterior captat per un sensor ordena l’activació de la següent part del programa. Per exemple, podem dir que el robot avanci i retrocedeixi il·limitadament fins que en detectar una variació en l’intensitat de llum, aquest s’aturi. (S15) 3)Time. Les accions es realitzen de forma cíclica fins que es compleix un temps determinat de duració del “Loop”, que nosaltres assignem en el programa.
4)Count. Amb aquesta opció podrem determinar el nombre de vegades, mitjançant el “comptador”, que volem que es repeteixi el cicle. És la que utilitzarem en aquest programa 2, perquè el programa no es perllongui de forma indefinida i gasti bateria. 5)Logic. La última opció que ens ofereix el “Loop” és la de finalitzar la repetició del cicle amb l’arribada d’un senyal lògic d’1 o en cas contrari de 0, és a dir, de True (cert) o Fals (fals). És una opció complicada, ja que inclou xarxa de dades (vegeu programa 5) entre els diferents blocs d’un mateix programa. 
E) Activació polsador posterior (port 2) – XocAquest bloc és exactament igual al de l’acció B d’aquest mateix programa. La única diferència que hem de tenir en compte a l’hora de programar és que hem d’assignar un nou port de connexió a aquest sensor situat a la part posterior del robot i que s’activa marxa enrere en ser polsat per alguna superfície. En aquest cas, li assignem el port 2, com es pot veure en la imatge S16. És una ordre “Wait” com en el primer programa. Escollim l’opció “Pressed” per evitar possibles bloqueigs del sensor a l’hora de ser premut. Així, a la mínima pressió, el programa podrà seguir fent l’acció descrita en el bloc següent. Reinici del loop (x 5)Abans no deixi d’actuar el loop, aquest reiniciarà un total de cinc vegades el cicle d’accions que conté en l’interior. Així es continuarà repetint l’avanç i el retrocés del robot fins que el comptador no arribi a aquesta quantitat fixada.
Després de fer 5 vegades la funció “Loop”, donem un ordre per aturar totes les accions del programa, inclosa la de bloquejar el braç. Aquí finalitza aquest programa 2.
Guardem el programa amb el nom de “polsador2” i a continuació descarreguem el programa al controlador via USB amb l’opció Download de la part inferior esquerra. Per a més detalls consulteu el programa 1.
3.2.2.2. Sensor de llum infraroig a) Definició, possibilitats d’ús, connexió amb el robot, opció “View” i calibració. Un sensor de llum és un dispositiu fotoelèctric de posició que permet captar el grau d’intensitat lumínica de l’ambient, ja sigui per rebot d’una llum generada per un LED del propi sensor o per barrera, degut a una interferència de l’objecte en el senyal lluminós normal. (S18) El sensor de llum de LEGO (S17) pot detectar la intensitat de llum per qualsevol de les dues maneres, ja que disposa d’un emissor de llum infraroig del qual es pot prescindir per calcular el grau de llum d’un espai. No obstant això, la funció d’aquest LED esdevé imprescindible quan s’enfoca cap a una superfície i es pretén seguir una línia. El seu funcionament es basa en els fototransistors situats al seu interior que transmeten un senyal elèctric al circuit a partir de la intensitat de llum que reben. Això permet donar visió al robot, que capta alhora el grau de llum d’un espai i té la capacitat de distingir la intensitat de llum de qualsevol superfície acolorida. Aquest procés el realitza traslladant la intensitat de reflexió a una escala de grisos molt gran que es mou en un rang de valors expressats en tan per cent. El comportament d’aquest sensor, doncs, és analògic, tot i que mitjançant la funció “Switch” que estudiarem més endavant a l’entorn de programació, podem donar-li una utilitat digital (del tot o del res) a les dades aportades pel detector. Aquest és el símil entre l’ull humà i el sensor de llum. Mitjançant aquest sensor, el robot pot realitzar accions tan diferents com ara aproparse a una font de llum i fer sonar una alarma, ordenar diferents objectes pel color o seguir una línia que ressalti respecte l’entorn, a més d’una infinitat d’altres utilitats associades. Podem accedir a la opció "Try me" del menú principal per tal de comprovar el correcte funcionament del sensors, tinguent en compte sempre el port en què el connectem. També podem obtenir el valor de la intensitat de llum a partir e la opció "View", expresat en forma de tant per cent. Haurem de tenir en compte sobretot si treballem amb la llum ambient ambient light" o amb la llum emesa per el propi robot "reflected light". Mitjançant el suport que uneix els sensors (també fet de peces de Lego) amb el controlador vam crear un giny que en ermet col·locar els sensors en dues posicions reversibles i immòbils, de tal manera que puguin detectar de la mateixa manera la intensitat de llum de l’ambient o la d’un color d’una superfície. Això ho aconseguim col·locant els sensors en posició horitzontal o en posició vertical, com es veu en la imatge S20:  Calibració : El procés de calibració ens permet ajustar al màxim la resolució del sensor de, és a dir, es pot reduir l’interval de funcionament per defecte (valor mínim 0 i valor màxim 1023) de manera que podem distingir entre intensitats de llum molt més properes que en situació normal el sensor podria no diferenciar. Per fer-ho, es modifica aquest valor mínim o màxim entrant les magnituds mesurades corresponents que volem que actuïn en el programa, per exemple 130 i 800. El procediment per calibrar es basa en els següents passos:
- Engeguem el robot i el connectem via USB a l’ordinador amb el programa LEGO Mindstorms. - Anem a l’opció Tools/Calibrate del programa i se’ns obrirà un menú on seleccionarem el sensor, en el nostre cas el de llum, i clicant sobre “calibrate” (vegeu la imatge S21) es guardarà un programa anomenat així dins el controlador que se’ns activarà sol. - El següent pas, ja dins el programa automàtic, consisteix en mesurar sobre la superfície colorejada o en l’ambient determinat els nous valors màxims i mínims de treball del sensor, que posteriorment confirmarem amb el botó Enter (botó quadrat de color taronja). Les noves dades queden guardades automàticament i el sensor ja està calibrat.
En conclusió, l’acció de calibrar permet al robot treballar en un àmbit molt més concret i ajustat a les magnituds amb què ha de funcionar i evitar així treballar en un camp massa ampli. A més, sempre podem tornar als valors absoluts per defecte del sensor (0 i 1023) anant a l’opció “Refresh”.
Programa 3 – Persecució d’una font de llum (llanterna)Volem que el robot sigui capaç de seguir durant un minut una font de llum, com ara una llanterna, amb la qual l’apuntarem frontalment. També, procurarem que el robot es mogui en cercle sobre el seu propi eix (com si d’un radar es tractés) quan aquesta llanterna estigui apagada.
Seqüència d’accions: En aquest tercer programa només actuarà un sensor, el dret, que estarà connectat al port 3. D’aquesta manera, veurem de manera senzilla quina aplicació pot tenir un sol sensor captant la llum d’un ambient determinat (posició horitzontal). De fet, com que la llum s’aplica frontalment, és absurd activar aquest programa amb dos sensors, ja que o bé tots dos la detecten, o bé no. En el bloc de programació, per aconseguir que el robot avanci cap a la font de llum o bé es quedi girant, haurem d’introduir una nova funció a part del “Loop – time”, coneguda amb el nom de “Switch” (interruptor en català). El seu funcionament s’apropa molt al concepte de portes lògiques i es caracteritza per passar una informació analògica a una ordre digital, ON/OFF o 0/1.

Pel correcte funcionament del programa serà necessari una ambient fosc inferior al 5% de llum (es pot mesurar amb l’opció View del robot) ja que el 20% és la dada estipulada perquè el sensor deixi de voltar i vagi cap a la llanterna. Tot i que la dada es pot canviar fins a valors més alts, el fet de treballar en una habitació il·luminada pot fer que el programa no funcioni o bé, que haguem d’apropar la llanterna fins a escassos centímetres del sensor (entre 5 a 20). Abans de posar-nos a veure quins són els blocs concrets que haurem de col·locar en ell programa, vegem en què consisteix la funció SWITCH, que necessitarem. Funció SWITCH o funció “interruptor” : Aquesta funció es coneix amb el nom d’interruptor, ja que escull entre dues seqüències de codi diferents segons en quina posició es trobi (ON o OFF). La seva característica més peculiar és la d’adaptar un senyal analògic (sovint entre un interval de valors), ja sigui de llum, so o ultrasò i passar-lo a una ordre digital, que segons quin codi assenyali duu al programa a fer una acció determinada o una altra. La funció "Switch” s’utilitza amb un munt de sensors, com veurem més endavant. Aquest bloc o funció del programa s’extreu anant a “Complete palette”/ “Flow” / “Switch” i es pot simplificar per separat en cadascun dels dos codis. (S22)
Aquesta simplificació es duu a terme desseleccionant l’opció “Flat View” (S23) i es sol utilitzar en programes molt llargs, on hi ha funcions interruptors dins d’altres funcions anàlogues. D’aquesta manera s’aconsegueix treballar amb un programa que ocupa menys espai a la pantalla i és més fàcil de comprendre. Per introduir diferents blocs de programa dins de la funció “Switch”, hem de fer el mateix que en la funció Loop, és a dir, simplement hem de seleccionar i introduir les accions que triem a la seqüència de codi corresponent (True o Fals). La funció Switch dóna lloc a dos tipus de control general, un sobre els sensors i l’altre sobre el valor. Alhora, si el control es realitza sobre els sensors es pot triar entre dotze tipus diferents d’aquest dispositiu (sensor de llum, so, contacte i d’ultrasò ...) i si es fa sobre el valor, el senyal pot ser tractat com una informació lògica, numèrica o de text que s’uniran al bloc de la funció mitjançant els respectius cables de dades (data wires). Vegeu l’esquema S24.  A continuació, explicarem breument com es programa cadascun dels tipus de sensors Mindstorms NXT en el bloc Switch i també com es tracten els diferents tipus de valors: Control: els sensors + En el sensor de llum que utilitzarem en el programa 3, hem de seleccionar el control de sensor i òbviament hem d’agafar el sensor de llum. A més, haurem d’assignar un port al sensor (en el nostre cas el port 3) i determinar l’ interval d’intensitat de llum mitjançant la qual bifurquem el codi amb dues seqüències. En la imatge S25 veiem que el fet que el sensor detectés una intensitat de llum superior o igual a 50 faria que el programa realitzés totes les accions que col·loquéssim a la seqüència (1) i el fet que detectés una intensitat inferior a 50 duria lloc a les accions col·locades en la seqüència (2). A més, tenim l’opció d’activar el “Flat View” i la de "generació de llum”, tot i que si el que volem és detectar llum ambient de poc ens servirà la detecció per rebot.
+ En el sensor de contacte, podem determinar quin circuit (o seqüència) farà la funció iinterruptor segons si el polsador està essent pressionat o no. És a dir, podem construir una seqüència dient que si el robot és polsat farà “x” acció i sinó ho està en faci una altra “y”. Lògicament també haurem d’assignar un port al sensor i seleccionar-lo, de la mateixa manera que podrem seleccionar o no l’opció “Flat View”. + En el sensor de so, haurem de seguir un procediment semblant. Seleccionem aquest tipus de sensor i a continuació li assignem el port i activem o no l’opció “Flat View”. Com hem fet en el sensor de llum, haurem de determinar a partir de quin interval de so (en nivell de decibels i en %) volem que el robot faci una acció o una altra. + En el sensor d’ultrasò, farem exactament el mateix que en el sensor de so, amb la única diferència que enlloc de fixar l’interval de decibels, haurem de determinar l’interval de distància (en centímetres o en polzades) que volem quedar-nos respecte a un objecte, donant una magnitud “x” i seleccionant l’opció (Més a prop de – “Nearer than” o més lluny de “Further than”). Segons en quin interval estigui el valor detectat farà un codi d’accions o un altre. + En el dispositiu “Timer” o rellotge, nosaltres assignem un temps “x” a l’opció “compare”. Segons hagi passat o no el temps a l’arribar al bloc “Switch”, aquest actuarà en un dels dos codis establerts. A més, podem escollir quin dels tres temporitzadors del controlador NXT volem que calculi aquest temps (1, 2 o 3). L’opció “Timer” porta incorporada la selecció de “Read” o “Reset”. En el primer, el robot simplement llegirà el temps, mentre que en el segon el llegirà i actualitzarà el valor a 0 automàticament. 
Altres dispositius amb un funcionament i programació semblant als sensors són: + El botons NXT + El receptor de missatges + El sensor de rotació També podem trobar sensors que són compatibles amb aquesta funció i que pertanyen a la tecnologia RCX, com ara el sensor de temperatura i altres tipus de sensors específics: el de llum, el de contacte i el de rotació. Control: el valor Cal recordar que per comprendre correctament aquest fragment és recomanable haver llegit el funcionament dels cables de dades (data wires) de l’apartat “3.1 – El controlador”. En aquest altre control de la funció Switch podem establir tres tipus de tractament d’informació: + Inf. Lògica + Inf. Numèrica + Text Si establim aquesta funció centrant-nos amb el valor, podrem treballar tant amb valors numèrics, lògics com amb text. Això ho farem unint qualsevol cable de xarxa (amb contingut numèric o lògic) de color groc o verd amb un tipus d’endoll que es troba en la part inferior de la icona de la funció Switch (vegeu S26).
2) En lògica, d’altra banda, podem determinar quin dels senyals rebuts ha de ser considerat com a cert o fals. Segons el què hàgim fixat, el programa actuarà en un sentit o en un altre. Si l’opció “Flat View” està activada, el programa farà actuar la seqüència superior si rep un senyal “True” o cert. Si és fals, en canvi, actuarà la inferior. D’altra banda, si l’opció “Flat View” està desactivada, l’opció nº1 serà la que representa les condicions perquè funcioni la seqüència del nivell superior i la nº2, la inferior. Per canviar això, hem d’anar a l’espai sota “Conditions” i escollir quin dels diferents grups ha de ser activat amb un senyal “True”. 3) D’altra banda, a “Text” podem escriure la paraula que vulguem que activi una seqüència o una altra. Ara bé, perquè això succeeixi, es necessiten altres blocs del programa que reconeguin tot allò escrit i que donin el senyal a través d’un cable de dades. Forma part de la programació d’alt nivell i no ens hi endinsarem. Blocs programa 3: A) Bloqueig del braç (igual que en el programa 1 i 2) Nota: Aquest cop hem d’iniciar el programa amb el braç perpendicular al terra i no formant un angle de 90º. Així no s’interfereix amb el que detecta el sensor de llum.
B) Introduir funció LOOP - Time
Com que no volem que el programa s’allargui innecessàriament i així estalviar bateria, limitem la durada de les accions que col·loquem a l’interior del cicle a un màxim de 90 segons. Així, el robot deixarà de girar sobre el seu eix o de seguir una font de llum després d’aquest temps i no l’haurem d’aturar manualment. Per aconseguir que aquest bloc del programa faci això, simplement hem de seleccionar l’opció “time” a Control, fixar els 90 segons en l’opció “until” i desactivar l’opció “mostra comptador” que no necessitem. C) Funció SWITCH o interruptor (amb sensor de llum) Aquesta funció l’introduirem dins la funció LOOP.
D.1) Què fa el robot si detecta una font de llum? El robot detecta una font de llum, com ara una llanterna, quan el sensor detecta una intensitat igual o superior al 20% (>20), que és la que hem fixat. En aquest cas diem el robot que avanci il·limitadament, per tant, seleccionem el següent bloc de programa: Avanç il·limitat La col·locarem a dins la funció Switch dins la seqüència superior, que és el que el programa duu a terme quan hi ha una intensitat major al 20%. De les opcions, com ja hem fet en el programa 1 i 2, només haurem de tenir en compte d’activar els motor B i C per igual (direcció o steering equitatiu) i mantenir una direcció recta i cap endavant (fletxa recta cap endavant). La potència a desenvolupar és recomanable que sigui d’un 75%. És important que l’acció duri il·limitadament, tot i que per les condicions que imposa la funció interruptor aquesta es deixarà de fer quan la intensitat no sigui l’assenyalada en la seqüència superior. L’opció “Next Action” es bloqueja en il·limitar la duració del moviment. D.2) Què fa el robot si no hi ha font de llum? El sensor de llum, si no detecta una intensitat superior al 20%, continuarà girant sobre el seu propi eix i consumint segons de la funció Loop-time. Perquè això succeeixi, el robot ha de trobar-se en un ambient fosc (una habitació amb les persianes baixades té una intensitat de llum del 5%) i no l’hem d’enfocar amb la llanterna. Vegem com es programa aquest bloc: Gir sobre el propi eix Amb aquest programa es poden fer tres tipus de gir diferent: un gir parabòlic que s’activa amb l’opció Steering d’avançar i en el qual tots dos motors estan més o menys activats, un gir o viratge d’obertura concreta (a partir dels graus de gir es determina les rotacions, els segons o els graus que ha de fer un dels dos motors mentre l’altre està aturat) o el gir sobre el propi eix, que consisteix en un moviment il·limitat en el qual es manté engegat un motor a una determinada potència i un altre completament aturat. Tots aquests tipus de gir tenen en comú, en aquest casos, que el motor B(dret) i el motor C(esquerre) no estan activats equitativament i així el robot varia el seu rumb recte, ja sigui girant per graus, descrivint un gir en forma de paràbola més o menys tancada o descrivint una circumferència. Això es deu el fet que el motor dret treballa més que l’esquerre, de tal manera que el robot té una tendència a traçar un gir cap a l’esquerre i en cas invers, a virar cap a la dreta. És amb aquest fet, amb el qual podem jugar. PROGRAMA 3 COMPLET Programa 4 - Avançar i aturar-se segons la intensitat de llum El que pretenem en aquest quart programa és simplement fer avançar o aturar al robot a partir d’una variació de la intensitat de llum d’un ambient provocada per un flash. En aquest programa, a partir d’un simple canvi en la intensitat de llum, podem donar diferents ordres al robot com ara avançar, aturar-se, girar o retrocedir. Per fer-ho utilitzarem un bloc del programa que ja hem utilitzat anteriorment com és el bloc Wait, en aquest cas, centrat en el sensor de llum. Seqüència d’accions: A – Inici del programa. El robot es manté sense moviment i amb el braç bloquejat perpendicularment tot esperant un augment sobtat de la intensitat de la llum, superior al 50%, que activa l’opció “Wait – sensor de llum”. B – Després de rebre el senyal a través del sensor, el robot realitza l’acció d’avançar indefinidament. C – Col·loquem un temporitzador de 5” per separar la següent opció en espera del sensor de llum, per tal d’evitar que el mateix senyal inicial es solapi i aturi el robot immediatament després de rebre l’ordre d’avançar. (Si tenim la seguretat que no augmentarà aquesta intensitat de llum, no cal col·locar aquest bloc en el programa). D – Tornem a posar un bloc en espera del sensor de llum, igual que a B. E – Després d’un altre augment d’intensitat de llum superior també al 50%, el robot s’aturarà. PROGRAMA 4 COMPLET Programa 5 – Robot seguidor de línia negra i blancaEn aquest programa, volem que el robot sigui capaç de seguir una línia negra sobre fons blanc o bé, una línia blanca sobre fons negre. Totes dues línies seguiran trajectòries rectes i curvilínies; per aquest motiu necessitarem l’actuació dels dos sensors de llum que seguiran la línia blanca o negra (segons el grau d’intensitat de llum per rebot que fixem en el programa). * Pel correcte funcionament del robot, la línia ha de tenir un mínim de 3 centímetres d’amplada, ja que la distància entre els fototransistors dels dos sensors és de 2,5. Per conèixer i entendre la seqüència d’accions que hi haurà en aquest programa, primer hem de comprendre el mecanisme de la detecció per rebot de les línies i tenir una petita noció sobre les taules de la veritat i portes lògiques. De fet, aquest programa ens ofereix dues possibilitats per aconseguir seguir les línies, una primera que consisteix en subordinar el senyal d’un sensor al resultat de l’altre i una altra forma que utilitza directament les portes lògiques. Vegem primer, però, quines són les quatre situacions amb les quals es pot trobar el robot. Llegenda: MOTOR // SENSOR Estat (0) - Parat // No detecta
Estat (1) - Accionat // Detecta Quan diem que el sensor “no detecta” volem dir que, en el cas de la línia negra, rep una intensitat lumínica de rebot superior al 20% i en el cas de la blanca, inferior al 50%. Situació 1: Els dos sensors detecten la línia negra o blanca, per tant hem d’entendre que el tram és recte i en conseqüència hem d’activar els dos motors, tant el dret com l’esquerre. Situació 2: El robot ha de virar cap a l’esquerra ja que el sensor dret detecta línia i, en canvi, el sensor esquerre no. Per fer-ho, hem d’aturar el motor dret i deixar només activat el motor esquerre. Situació 3: Aquest cas és justament el contrari de l’anterior. La línia gira ara cap a l’esquerra i per tant, hem d’aturar el motor esquerre i deixar activat el dret. D’aquesta manera el robot podrà seguir la línia.
Situació 4: Aquesta situació es dóna quan cap dels sensors detecta la línia, ja que el robot es surt de la seva trajectòria. Quan passa això es poden fer dues coses, o aturar al robot o fer-lo girar sobre el propi eix per intentar trobar la línia (que sol estar a prop després d’una sortida). Hem optat per aquesta darrera opció.
Taula de la veritat: A partir de les dades de la taula de la veritat que hem recollit en cada cas i mitjançant la subordinació de les dades dels sensors podem dissenyar una seqüència d’accions en el programa. Si fem un pas més, mitjançant la simplificació a partir de l’àlgebra de Boole i el mètode Karnaugh, també podem construir un circuit lògic amb el mateix programa Mindstorms NXT. Blocs programa 5.2 - SUBORDINACIÓ DE SENSORS (seguidor línia negra)Primer de tot afegim una funció LOOP – forever (A), perquè el programa es repeteixi contínuament i així el robot segueixi la línia fins que aturem manualment el programa amb el botó rectangular gris del controlador. Quan parlem de subordinació de sensors ens referim a posposar l’acció d’un sensor sobre un altre. En aquest cas, per fer la subordinació elegim un sensor de llum, per exemple el connectat al port 3, que actua en un bloc de la funció Switch i a partir dels dos codis lògics a què dóna lloc (0 i 1), introduïm dos funcions Switch més dins de cada codi que pertanyen el sensor de llum connectat al port 4. D’aquesta manera tenim definides les quatre situacions que corresponen a una acció concreta i que estan escrites en la taula de la veritat: 00, 01,10 i 11: 
A continuació, vegem per ordre quins són els diferents blocs que formen part del programa: A) Inici funció LOOP - forever Volem que l’acció es repeteixi contínuament, per tant, necessitem introduir tots els blocs del programa dins la funció LOOP. Per aquest motiu, haurem d’aturar manualment el programa amb el botó NXT rectangular gris. Perquè funcioni correctament, simplement hem de deixar l’opció Control a “Forever”. B) Funció Switch – Sensor llum dret – port 3 Aquesta funció interruptor, que ja hem comentat anteriorment, és la que marca amb quin sensor de llum el robot es guiarà principalment per seguir la línia, en aquest cas negra, donant un valor de 0 o 1 segons el reflex de la intensitat lumínica. En aquest cas, hem elegit el sensor de llum del port 3. Aquest és el bloc que hem de col·locar dins la funció Loop i el que indica com han d’estar les diferents opcions: 
C) Funció Switch – Sensor llum esquerre – port 4 Aquesta funció va col·locada a l’interior de la funció Switch anterior, concretament al codi de seqüència superior (1 = <20%). Vegeu cercle vermell (S30). D’aquesta manera i amb les dues noves entrades que ens proporciona aquesta funció interruptor (1 i 0), podem definir les situacions en què els sensors dret i esquerre detecten 11 (línia recta) i 10 (gir a la dreta). El bloc del programa que hem d’agafar és exactament igual al pas B, amb la única diferència que enlloc de seleccionar el port 3, hem de seleccionar el port 4 que pertany al sensor esquerre. D) Funció Switch – Sensor llum esquerre – port 4 Aquesta funció també va col·locada a l’interior de la funció Switch del pas B, però en aquest cas a la seqüència inferior (0 = >20%). Vegeu cercle blau (S30). La combinació de seqüències del sensor dret i del sensor esquerre gràcies a la subordinació de la funció Switch dóna lloc a les situacions 01(gir a l’esquerra) i 00 (no detecta línia, gir cap a la dreta sobre el propi eix). El bloc i les opcions d’aquest bloc del programa són exactament iguals al pas C. Un cop feta aquesta subordinació que ens permet arribar a les quatre situacions que es donen en seguir una línia, ja podem posar dins dels codis corresponents (de dalt a baix) els blocs que determinaran les accions a seguir: E) Avançar (11) Com que els dos sensors detecten una intensitat de llum inferior al 20%, això vol dir que tots dos es troben sobre la línia negra, per tant, el traçat és recte i el robot ha de seguir aquesta trajectòria. Es tracta d’un avanç il·limitat que es col·loca a la part superior dels dos codis de la funció Switch. Vegeu “Programa complet” per comprendre-ho millor. F) Girar a la dreta (10) Per girar a la dreta (ja que només detecta línia el sensor de la dreta) utilitzarem dos blocs Move, un que bloquegi el moviment al motor dret (B) i l’altre que accioni el motor esquerre (C). D’aquesta manera, el robot tindrà tendència a dirigir-se cap a l’esquerra. F.1) Bloqueig motor B // F.2) Accionar motor C G) Girar a l’esquerra (01) Com que en aquest cas només detecta línia el sensor de l’esquerra, haurem de virar cap aquest costat. Per fer-ho haurem de fer just al contrari que en l’apartat F, és a dir, bloquejar el motor C i accionar el motor B. També utilitzarem blocs Move. G.1) Bloqueig motor C // G.2) Accionar motor B H) Girar sobre el propi eix cap a la dreta (00) Per aconseguir que el robot faci aquesta acció, simplement hem de posar dins la seqüència corresponent els dos blocs (H.1 i H.2) ja utilitzats en els apartats (F.1 i F.2). D’aquesta manera, el robot girarà sobre el seu propi eix en sentit antihorari, tot buscant la línia. PROGRAMA 5 COMPLET
3.2.3.3. Sensor de soa) Definició, possibilitats d’ús, connexió amb el robot, opció “View” i calibració. Un sensor de so és un dispositiu de posició que capta diferents intensitats de so d’un espai proper. El sensor, en si, és un captador d’esforços, ja que a partir de diferents components és capaç de mesurar la pressió (força per unitat de superfície) del so, que origina una variació en una resistència elèctrica. Per aquest motiu té un comportament analògic, ja que pot detectar infinitats de valors en una escala força àmplia. La unitat amb què es mesura la intensitat del so és el decibel (dB), una unitat relativa i logarítmica utilitzada en acústica. No obstant, el robot per fer més fàcil la comprensió de les diferents mesures utilitza el tant per cent (%), que augmenta com més intens i potent és un so.  En teoria, el sensor ha de donar els següents valors:  El fet que l’oïda humana percebi de diferent manera un so degut a la seva freqüència, provoca que diferenciem entre dBA i dB: + Els dBA (decibels ajustats), és l’interval de sons que pot percebre la nostra oïda. Per mesurar aquesta unitat de nivell de so es col·loca un filtre per impedir el pas de les freqüències molt altes o molt baixes. + Els dB mesuren totes les intensitats de so amb la mateixa sensibilitat i inclouen tant els que percep la nostra oïda com els que no (freqüència molt altes i molt baixes). El sensor de so Mindstorms NXT pot mesurar pressions de sons màximes de l’ordre de 90 dB. 0 dB correspon a una intensitat de 20 micropascals (mPa). Aquesta és una dada de referència que correspon al llindar d’audició que inicia una escala de decibels que acaba amb el llindar de dolor (140 dB). La connexió del sensor de so amb el controlador és senzilla i es realitza de la mateixa forma que el polsador o el sensor de llum. Simplement hem de disposar d’un cable compatible amb el sistema Mindstorms ® NXT que connecti el sensor amb qualsevol dels ports del controlador (1,2,3,4), assignant-li el corresponent port més tard en el programa. Nosaltres solem connectar el sensor de so amb el port 2. 
Per comprovar el correcte funcionament d’un sensor de so, aquest s’ha de connectar al port 2 i anar a la funció “Try me” (Prova’m) del menú principal. Si el sensor funciona correctament els motors B i C s’activaran simultàniament, en major o menor potència en consonància amb la intensitat del so que emetem. És un prova recomanable abans d’endinsar-nos en la calibració d’un sensor o en l’inici d’un programa en què intervingui un sensor de so. En el disseny de l’estructura del robot vam creure oportú situar el sensor de so, conjuntament amb el sensor d’ultrasò, en la posició més enlairada del robot (S31), de manera que s’hi mantingués unit per un giny amb peces de Lego (S32). La situació del sensors no és aleatòria, ja que hem intentat situar-los en una posició que no alterés el seu funcionament normal. Per exemple, si posem el sensor de so pròxim els motors, aquest detectarà un intensitat de so produïda pel seu gir motriu i ja no serà tan precís a l’hora de detectar sons febles inferiors al 20%. La seva col·locació vertical cap amunt evita altres interferències en la mesura, com ara la fricció amb la superfície. Amb tot, aconseguim treure el màxim rendiment i precisió del sensor. 
El robot té moltes possibilitats d’ús com veurem en els dos tipus de programa que observarem. Ara bé, també presenta una sèrie d’inconvenients que en disminueixen la seva eficàcia. Alguns dels més importants són els següents: - El so captat pel sensor ha de ser força proper i situar-se entre 0 i 90 dB.
- La intensitat del so captada en % varia amb el moviment i també amb la velocitat, l’espai i la potència dels motors.
- Els sons que es processen han de ser continus i amb la mateixa intensitat si volem que el sensor doni un senyal útil pel programa. Aquest fet, però, és força complicat.
- El so ha de dirigir-se frontalment al sensor. Si les ones incideixen de forma lateral o obliqua, no es mesura amb tanta precisió el seu valor.
- En programació, els sons han de tenir intensitats molt diferents per ser controlables. Opció “View” del robot: La pantalla del menú principal del robot ens ofereix diferents possibilitats. Una de les que ja hem comentat és l’opció “View”, que permet donar magnituds numèriques concretes. En el sensor de so s’ofereix la possibilitat de captar per separat les dues magnituds amb què treballa el sensor de so: el so amb dB generals i el so amb dBA (ajustats a l’oïda humana). Totes dues variables es mesuren en tan per cent (%) i el valor obtingut ens serveix d’orientació a l’hora de programar. Per aquesta acció, haurem de concretar el port (1, 2, 3 o 4) al qual hem connectat el sensor. Amb aquest procés podrem ajustar al màxim la intensitat d’un so que repetirem més tard en el desenvolupament del programa i així establir-ho al bloc corresponent. També ens és útil per concretar els valors amb els quals haurem de calibrar el sensor. Haurem de tenir en compte l’espai on mesurem el so, ja que hi ha molts ambients amb sorolls externs que poden modificar el valor de les mesures, com també els inconvenients ja desglossats en l’ús d’aquest sensor, a vegades poc precís per dissenyar programes. 
Amb aquest procés, a més, podrem arribar a conèixer dades tan curioses com saber qui té els veïns més sorollosos o qui viu a la casa amb més contaminació acústica. Calibració : El sensor de so, igual que el sensor de llum, es pot calibrar, ja que podem modificar els llindars d’intensitat màxim i mínim de so que pot captar el robot, de manera que podem distingir entre dos valors que en situació normal són molt propers. Si no fem ús de la calibració, el robot treballarà sempre amb aquests valors absoluts, màxim 1023 i mínim 0, per defecte. Mitjançant aquest procés podem ajustar el sensor de so a treballar en un àmbit de treball més específic i més precís, entre sons més propers. Per saber com es duu a terme tot el procés, consulteu la introducció del sensor de llum on s’explica tot el procés per calibrar un sensor qualsevol. Programa 6 – Atura el robot amb un so externVolem que el robot avanci en línia recta lliurement fins que en detectar un so extern amb una intensitat relativament alta aturi tots els seus moviments, també el bloqueig del braç. Seqüència d’accions: En aquest programa actuarà el sensor de so, que serà el dispositiu encarregat de transmetre el senyal pel qual l’ordre en espera “Wait” aturi el programa. Abans d’aquest instant, el braç mòbil estarà bloquejat i els motors activats, permeten el gir de les rodes i impulsant el robot cap endavant.

A) Bloqueig del braç. Aquest bloc ens servirà per veure més clar en quin moment el sensor capta el so que mitjançant un ordre en espera atura totes les accions del programa, ja que llavors el braç caurà pel seu propi pes en deixar de ser bloquejat. B) Avanç il·limitat C) Activació sensor de so - Wait (en espera) Aquest tercer bloc consisteix en col·locar una opció en espera del sensor de so, que en rebre un senyal (so superior al 50% en l’escala de dB), passarà a la següent opció del programa que és aturar-lo.
D) Aturar el programa. Per aturar totes les accions que es duen a terme en el programa hem de col·locar un bloc STOP. Com ja hem dit en programes anteriors, per extreure aquest bloc hem d’anar a “Complete palette”/ “Flow”/ “Stop”. Aquest bloc consisteix simplement en marcar la fi de totes les accions del programa i no té cap més opció. Fi del programa PROGRAMA 6 COMPLET 
Programa 7 – Atura el robot amb un so propi Ara també volem que el robot avanci en línia recta i s’aturi quan detecti un so, però en aquest programa pretenem que el so provingui del mateix robot i que vingui donat pel xoc amb alguna superfície, per tant, també utilitzarem el sensor de contacte. Seqüència d’accions: Per poder dissenyar aquest programa haurem de col·locar la mateixa sèrie de blocs de l’exercici anterior i a més haurem d’afegir una seqüència paral·lela que inclogui una opció en espera d’un sensor de contacte que donarà l’ordre d’emetre un so, que alhora serà rebut pel sensor de so i aturarà el programa. Vegem l’esquema:
Què passarà mentre funcioni el programa? El robot avançarà de forma il·limitada fins que xoqui contra alguna superfície. En aquest moment, s’activarà el sensor de contacte que donarà el senyal perquè el robot emeti un so, que alhora activarà l’ordre en espera del sensor de so. D’aquesta manera, s’acabarà aturant el programa. Blocs programa 7: Els blocs A, B, C i D són idèntics al programa 6. Veiem ara les de la seqüència paral·lela. E) Activació polsador - Wait (en espera) Aquest és un bloc en espera (el programa no duu a terme cap més acció fins que succeeixi el què es descriu en el bloc), en el qual es prem el polsador. Això succeirà quan l’avanç il·limitat que ordena la seqüència paral·lela es vegi interromput pel xoc contra alguna superfície o obstacle. La pressió del polsador és el senyal, doncs, que ens serà útil per poder passar al següent bloc del programa, en aquest cas emetre un so. La icona l’extraiem anant a “Complete palette”/ “Flow”/ “Wait”. F) Emissió d’un so Un cop el robot hagi xocat contra una superfície i el polsador n’hagi donat el senyal, es passarà a realitzar el següent bloc del programa que consisteix en emetre un so d’intensitat fixa que realitza el mateix robot. El so produït s’escull d’una àmplia gamma de paraules i frases diferents i inclús de notes musicals, com veurem en les opcions d’aquest bloc. Fi del programa La única diferència respecte el programa anterior és que el so que atura el programa ve emès pel propi robot en xocar contra alguna superfície.
PROGRAMA 7 COMPLET 3.2.3.4. Sensor d’ultrasò
a) Definició, possibilitats d’ús, connexió amb el robot i opció “View”. Un sensor d’ultrasò és un dispositiu que permet orientar el robot en un espai. La seva funció principal és la de mesurar la distància a què es troba amb un objecte o un obstacle frontal. A més, pot detectar moviment i dóna sensibilitat al conjunt del robot. El mecanisme de funcionament amb què es basa és semblant al sonar d’un submarí, ja que és a partir de l’emissió d’ultrasons (inaudibles per l’oïda humana degut a la seva altra freqüència que supera de llarg els 20.000 Hz) que topen amb un objecte i reboten. Llavors, les ones són captades de nou pel receptor del sensor. Per calcular la distància respecte aquest objecte, el controlador mesura l’interval temps entre l’emissió i la recepció de l’eco dels impulsos emesos, sent coneixedor de la longitud de l’ona de so enviada. El sensor amb el qual treballarem mesura distàncies de 5 fins a 250 centímetres amb un marge d’error que ronda els 3-5 centímetres, tot i que aquest pot ser més gran com més alta és la velocitat a què es desplaça el robot. Diagrama del funcionament d’un sensor d’ultrasò: El dispositiu ens ofereix la possibilitat de mesurar les distàncies en dues magnituds, tant amb centímetres (cm) com en polzades (inch). La relació entre aquesta magnitud del SI (Sistema Internacional) i la del SIB (Sistema Imperial Britànic) és la següent: 1 polzada = 2,54 cm. Cal tenir en compte que el sensor d’ultrasò també té limitacions, ja que només detecta objectes que es troben frontalment i que no presenten superfícies massa primes, esfèriques o bé que tenen unes dimensions especialment reduïdes. A part, cal assegurar-se de no tenir dos sensors d’aquest tipus operant en un mateix espai, ja que es produeixen interferències entre les seves ràfegues sòniques. Les possibilitats d’ús d’aquest sensor poden ser molt diverses, ja que gràcies a ell, el robot pot esquivar tots els objectes que es troba per davant i si es dissenya el programa correcte, fins i tot pot guiar-se per un laberint d’estructura rectangular on la distància entre les parets no sigui inferior a la llargada del robot (23 centímetres). En l’annex veurem aplicacions prou curioses utilitzant aquest sensor, com ara fer jugar el robot a golf. Per tot plegat, la tecnologia Mindstorms NXT presenta el sensor d’ultrasò com si fos el sentit de la vista pel robot. La connexió del sensor d’ultrasò amb el controlador és senzilla i es realitza de la mateixa forma que el polsador o el sensor de llum. Simplement hem de disposar d’un cable compatible amb el sistema Mindstorms ® NXT que connecti el sensor amb qualsevol dels ports del controlador (1,2,3,4), assignant-li el corresponent port més tard en el programa. Nosaltres solem connectar el sensor d’ultrasò amb el port 4. 
Per comprovar el correcte funcionament d’un sensor d’ultrasò, aquest s’ha de connectar al port 4 i anar a la funció “Try me” (Prova’m) del menú principal. Si el sensor funciona correctament, el robot produirà un so més o menys agut i intens Segons la distància a què col·loquem un objecte respecte del sensor, per exemple, la mà. És recomanable seguir aquest procés abans d’iniciar qualsevol programa en què intervingui aquest sensor. En l’elaboració de l’estructura, vam situar el sensor d’ultrasò en una de les posicions més elevades i dominants del robot (S33). Com ja hem explicat anteriorment, això és per evitar possibles interferències amb altres elements del robot que si bé en el cas del sensor de so era principalment pel soroll dels motors, en el cas de l’ultrasò és per tenir una visió horitzontal neta, en el qual no trobem cap objecte sortint que entorpeixi la seva funció de detectar objectes i calcular distàncies. Per descomptat, el sensor està encarat cap el sentit d’avanç del robot i està unit conjuntament amb el sensor de so al controlador, gràcies a un giny (S34) propi dissenyat amb peces de LEGO molt fàcil de manipular. 
Opció “View” del robot: Dins el menú principal del robot hi trobem l’opció View, que ens facilita totes les magnituds numèriques instantànies d’allò que mesuren els sensors. El sensor d’ultrasò no n’és una excepció. Aquesta opció ens ofereix la possibilitat de calcular la distància respecte qualsevol objecte, tant en centímetres (Ultrasonic cm) com en polzades (Ultrasonic inch). Això sí, hem de tenir sempre en compte les limitacions del sensor ja comentades anteriorment. Els resultats de les mesures instantànies ens apareixen en la mateixa pantalla o display del controlador dins d’un requadre. Per conèixer-les simplement hem de seleccionar la magnitud escollida (inch o cm), connectar el sensor amb qualsevol dels quatre ports i confirmar-li l’assignat al robot. Amb això, podrem evitar repetir nombroses operacions durant la programació ja que no haurem de procedir pel mètode d’assaig i error per tenir totes les variables controlades. Programa 8 – El guardaespatlles linealVolem que el robot ens segueixi en línia recta, és a dir, que acompanyi el nostre pas durant 90 segons, mantenint-se sempre a 25 cm de nosaltres com si fos un guardaespatlles. Els seus moviments, doncs, consistiran en un avanç constant o en aturar-se, segons la distància que detecti el sensor d’ultrasò sobre nosaltres. Per això haurem d’utilitzar una funció LOOP time i una SWITCH. Seqüència d’accions: Els blocs hauran de col·locar-se en el següent ordre: A) Funció Loop-time, que repetirà cíclicament fins els 90 segons totes les accions que contingui durant un minut. B) Funció Switch o interruptor (< 25 cm). C) Si el senyal és 1, per tant el robot ja està a 25 centímetres o menys, el robot s’aturarà. D) Per altra banda, si el senyal és 0 (> 20cm), el robot avançarà fins assolir almenys els 20 cm d’aproximació vers l’objecte frontal, en aquest cas, les nostres cames. 
A) Funció LOOP-time La funció Loop-time s’utilitza per repetir cíclicament una seqüència d’accions en el transcurs d’un temps determinat, com ja hem vist en programes anteriors. D’aquesta manera, un cop el robot ens hagi fet de guardaespatlles durant 90 segons, aquest s’aturarà, sense haver-ho de fer manualment i estalviant bateria. Per aconseguir que aquest bloc del programa realitzi tot això, simplement hem de seleccionar l’opció “time” a Control, fixar els 90 segons en l’opció “until” i desactivar l’opció “mostra comptador” que no necessitem. Per més informació d’aquesta funció, consulteu el programa 2.
B) Funció* SWITCH o interruptor ( amb sensor d’ultrasò)Aquest bloc ens permet donar una ordre digital al circuit malgrat el caràcter analògic del sensor d’ultrasò, que amb una resolució d’1cm mesura totes les distàncies entre 5 i 250 cm. De fet, la seva funció és la d’un interruptor. Interval 1 – Nearer than (cercle blau): 0 a 25 cm Com que el robot es situa dins d’aquesta distància de protecció el que fa és aturar-se indefinidament fins que nosaltres ens movem de nou. Com a “guardaespatlles” si nosaltres estem parats ell també. Interval 2 – Further than (cercle vermell): 25 a 250 cm Si el sensor detecta que estem a més de 25 cm, ràpidament dóna l’ordre d’avançar fins que arribi aproximadament a aquesta distància on es tornarà a aturar. Com a “guardaespatlles” si nosaltres ens movem ell també. Així sempre estar a prop i a una distància prudencial. C) Aturar-se a 25 cm. Aquest bloc el situarem dins la primera seqüència de la funció Switch i, en conseqüència, actuarà sempre que el robot es trobi entre 0 i 25 centímetres (interval 1– Nearer than) de nosaltres. Una distància que obligarà el robot a aturar-se, ja que aquesta és l’acció fixada en aquest bloc Move. D) Avança fins els 25 cm. Aquest bloc Move el situarem dins la segona seqüència de la funció Switch que engloba l’interval 2 (Further than). Per tant, quan el robot es trobi entre 25 i 250 centímetres es mourà avançant indefinidament fins que torni a situar-se en una distància dins l’interval 1. ** Per provar el programa és recomanable un espai obert sense obstacles, ja que el sensor d’ultrasò no diferencia entre el nostre cos i qualsevol altre superfície. Quan hagin passat 90 segons, la funció Loop deixarà de repetir totes les accions que contingui i com que aquest és el primer bloc coincidirà amb la fi del programa i de la protecció del guardaespatlles lineal. Fi del programa PROGRAMA 8 COMPLET 
Programa 9 – Guiar-se per un laberint simpleEn aquest programa volem que el robot sigui capaç de guiar-se autònomament per un laberint d’estructura rectangular amb passadissos més amples de 25 centímetres (longitud del robot). El seu funcionament es basarà en el càlcul de distàncies del sensor d’ultrasò, que prèviament rep l’ordre d’analitzar la possibilitat d’avançar o no, per descart, en les diferents direccions i sentits. Seqüència d’accions: És evident que hi ha diferents mètodes de programació per aconseguir que el robot es guiï dins un laberint, però nosaltres hem elegit el que mostrarem tot seguit, que si bé és força extens mostra d’una manera molt clara el procediment que utilitzem. El bloc A, el primer, pertany a la funció Loop – Forever que repetirà de forma il·limitada totes els blocs o accions que situem al seu interior. El següent bloc B serà una funció Switch, la qual ens permetrà diferenciar les situacions en què podem avançar (obstacle a més de 20 cm) o bé hem de virar cap a un altre costat (obstacle a menys de 20 cm). Serà a partit d’aquest mètode i del solapament d’aquestes mateixes funcions Switch amb la qual construirem el programa. En el programa es donaran aquestes quatre situacions. Analitzem-les una per una: Situació 1 – Avança Quan no trobem cap obstacle davant del robot i per tant es troba a més de 20 cm d’una paret del laberint, li diem que avanci de forma indefinida fins que no es compleixi aquesta condició. Situació 2 – Gira 90º a l’esquerra Quan el sentit d’avanç es veu estroncat per la detecció d’una paret a menys de 20 cm, ordenem el robot que faci un gir de 90º cap a l’esquerra i que torni a calcular la distància respecte la paret amb el nou rumb. Si aquesta és més gran de 20 cm torna a la situació 1 i el programa comença de nou. En cas contrari, es passa a la situació 3. 
Situació 3 – Gira 180º a l’esquerra Un cop el robot ja ha realitzat un gir cap a l’esquerra de 90º i s’ha trobat novament que no té cap sortida degut a una proximitat de la paret inferior als 20 cm, només li queda observar una altra possible via per avançar. Aquesta es correspon justament amb el sentit contrari de la direcció en què es troba el robot en la situació 2; per tant, ordenem al robot que faci un gir de 180º, preferiblement cap a l’esquerra que és on disposa d’espai per virar. En aquest moment, si el robot pot avançar perquè no hi ha obstacles el programa torna a començar i el robot torna a la situació 1. En cas contrari, passa a la situació 4.  Situació 4 – Gira 90º a la dreta (retorn) Quan arribem a aquesta situació, ens trobem que el robot s’ha desplaçat per un passadís sense sortida. El millor que podem fer llavors és fer girar cua al robot i fer-lo tornar per allà on ha vingut en sentit contrari a la situació 1. Per tant, si en la situació 3 ens tornem a trobar que la paret està a menys de 20 cm, el robot gira automàticament 90º cap a la dreta. Arribats a aquest punt, el robot torna a iniciar el programa a la situació 1, preparat per afrontar un nou cicle de situacions així.
Com ho fem per girar? Per girar 90º o 180º cap a l’esquerra o cap a la dreta, simplement hem d’activar el bloc Move del motor que vulguem utilitzar (B o C), que es corresponen a la roda dreta o a la roda esquerra, respectivament. A més, hem de tenir en compte que mentre una roda es mou la distància o els graus que hem determinat, l’altre s’ha de bloquejar, aturant el motor. L’equivalència entre graus girats i rotacions a 75% de potència és la següent: 90º gir = 1 rotació. Per tant, per girar a l’esquerra 180º, per exemple, activarem el motor dret durant 2 rotacions i bloquejarem el motor esquerre. Com que aquest és un programa extraordinàriament llarg veiem simbòlicament en aquest esquema S35 on aniran col·locats els diferents blocs, expressats per lletres, que utilitzarem.
Blocs programa 9: A – Funció LOOP – repetició d’un cicle Situació 1: B – Funció SWITCH o interruptor: (<20 cm o >20 cm) avançar o girar? B.1 i B.2 (<20 cm) – Per girar 90º a l’esquerre, bloquegem el motor esquerre mentrestant (B.1) i fem avançar en línia recta el motor dret durant 1 rotació (B.2) B.3 (>20 cm) – Avanç il·limitat Situació 2: C – Funció SWITCH o interruptor: (<20 cm o >20 cm) avançar o girar? C.1 i C.2 (<20 cm) – Per girar 180º a l’esquerre, fem avançar en línia recta el motor dret durant 2 rotacions (C.1) i bloquegem el motor dret mentrestant (C.2) (>20 cm) – Torna a la situació 1 (anirà al bloc B.3) Situació 3: D - Funció SWITCH o interruptor: (<20 cm o >20 cm) avançar o girar? D.1 i D.2 (<20 cm) – Per girar 90º a la dreta, fem avançar en línia recta el motor esquerre durant 1 rotació (B.1) i bloquegem el motor dret mentrestant (B.2) (>20 cm) – Torna a la situació 1. (anirà al bloc B.3) Reinici del programa (ens porta de nou a la situació 1). PROGRAMA 9 COMPLET A més dels quatre sensors que hem vist, la companyia LEGO va llançar al mercat fa relativament poc, una sèrie de nous sensors per a la robòtica Mindstorms. Són els següents: - Sensor de color (MS1038-1 Color Sensor) 2007 - Sensor d’acceleració i inclinació (MS1040-1 NXT Acceleration / Tilt Sensor) 2007 - Sensor d’orientació - brúixola (MS1034-1 NXT Compass Sensor) 2007 - Sensor específic de gir (MS1044-1 NXT Gyro Sensor) 2007 - Sensor de relació - IRLINK (MS1046-1 NXT IRLink Sensor) 2007 - Sensor detector d’infrarojos (MS1042-1 NXT IRSeeker Sensor) 2007
|