Difference between revisions of "Seguidor de línies virtual"

From Edutec Wiki
Jump to: navigation, search
m
Line 8: Line 8:
  
 
Els sensors són els encarregats de fer el treball de detecció, en aquest cas de la línia, mitjançant la informació que interpreten de les ordres que els hi indiquem.
 
Els sensors són els encarregats de fer el treball de detecció, en aquest cas de la línia, mitjançant la informació que interpreten de les ordres que els hi indiquem.
 +
  
 
== '''Descripció del procés''' ==
 
== '''Descripció del procés''' ==
  
El present exercici es presenta mitjançant la programació amb ''Scratch'' i ''Snap!''. L'objectiu és experimentar que un mateix programa pot ser creat en ambdos entorns de programació i observar les diferències per aprendre així a realitzar el mateix procés amb eines diferents. 
+
El present exercici es presenta mitjançant la programació amb ''Snap!''. El mateix exercici es pot seguir amb Scratch a [[Seguidor_de_línies_virtual_amb_Scratch|Seguidor de línies virtual amb Scratch. ]]També enim la opció d’importar el projecte creat amb ''Scratch'' a l’''Snap! ''i aconseguir així exactament el mateix programa traduït amb el software d’''Snap!'' a través del següent [http://djdolphin.github.io/Snapin8r2/ enllaç].
 
+
 
+
 
+
=== '''Amb Scratch...''' ===
+
 
+
'''[[File:Seg60.PNG|200px|Seg60.PNG]]'''
+
 
+
L’exemple que seguirem el podem en [https://scratch.mit.edu/projects/177984214/ aquest enllaç]
+
 
+
==== '''[[File:Núm 1.png|20px|Núm 1.png]]  Elements del programa''' ====
+
 
+
<u>Disseny del fons:</u>
+
 
+
Dibuixem un circuit que determina la línia a seguir. Ens dirigim a &nbsp;la pestanya fons &nbsp;i premem el pinzell d’edició.&nbsp;Dibuixem un circuit tancat que contingui corbes i &nbsp;pintem el fons d’un color.
+
 
+
[[File:Seg1.png|RTENOTITLE]]
+
 
+
<u>'''Disseny de l’objecte'''</u>
+
 
+
Dibuixem l’objecte amb l’editor gràfic. Simulem un cotxe i remarquem amb diferents colors les parts del cotxe que faran la funció de sensors (en aquest cas treballem amb 3 sensors).
+
 
+
[[File:Seg2.png|RTENOTITLE]]
+
 
+
&nbsp;
+
 
+
==== '''&nbsp; [[File:Núm 2.PNG|25px|Núm 2.PNG]]&nbsp; '''Moviment del cotxe ====
+
 
+
En primer lloc és necessari programar el cotxe perquè es mogui amb la següents línies de codi:
+
 
+
'''[[File:Seg3.PNG|RTENOTITLE]]'''
+
 
+
{| border="1" cellpadding="1" cellspacing="1" style="width: 700px;"
+
|-
+
|
+
&nbsp; &nbsp;''&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;'''''&nbsp; &nbsp; Desenvolupem aquí detalladament la construcció del codi:'''
+
<p dir="ltr" style="text-align: justify;">Primerament creem un bloc nou que anomenem “caminar”, el qual definirà el moviment del cotxe.</p>
+
*<p dir="ltr" style="text-align: justify;">Seleccionem el bloc [[File:Seg4.png|RTENOTITLE]]&nbsp;</p> 
+
*<p dir="ltr" style="text-align: justify;">Creem una variable que defineixi la velocitat en que es mourà el cotxe.</p> 
+
<p dir="ltr" style="text-align: justify;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[[File:Seg5.png|270px|Seg5.png]] &nbsp;=&nbsp; &nbsp;&nbsp;[[File:Seg6.png|RTENOTITLE]]</p>
+
*<p dir="ltr" style="text-align: justify;">Indiquem que al iniciar el programa la velocitat sigui 3.</p> 
+
<p dir="ltr" style="text-align: justify;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[[File:Seg7.png|RTENOTITLE]]</p>
+
*<p dir="ltr" style="text-align: justify;">Recuperem el bloc de moviment i &nbsp;li assignem la velocitat a la que s’ha de moure.</p> 
+
 
+
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[[File:Seg8.png|RTENOTITLE]]
+
 
+
*<p dir="ltr" style="text-align: justify;">Fins aquí tenim definida la velocitat del cotxe, ara ens falta el moviment. Responent a l’objectiu, seguir la línia negre, fem ús dels sensors. Indiquem mitjançant un condicional que, si el color turquesa es troba sobre el color negre, es mogui.</p> 
+
<p dir="ltr" style="text-align: justify;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;[[File:Seg9.png|RTENOTITLE]] &nbsp; &nbsp; &nbsp;&nbsp;</p>
+
*<p dir="ltr" style="text-align: justify;">Fem que aquest programa esdevingui un bloc. Creem un bloc nou que anomenem “camina” i encaixem el programa que hem elaborat anteriorment amb el bloc que se’ns crea per defecte “defineix camina”.&nbsp;&nbsp;</p> 
+
<p dir="ltr" style="text-align: justify;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[[File:Seg10.png|RTENOTITLE]]</p>
+
Per últim, assignem que &nbsp;“camina” &nbsp;s’executi per sempre.
+
 
+
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[[File:Seg11.png|RTENOTITLE]]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
+
 
+
Creem un altre bloc nou que anomenem “recorregut” i &nbsp;hi encaixem el programa anterior:
+
 
+
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;[[File:Seg12.png|RTENOTITLE]]
+
 
+
Per acabar col·loquem el bloc “recorregut” sota el bloc d’inici, de manera que al iniciar l’acció s’executi “recorregut”.
+
 
+
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[[File:Seg13.PNG|RTENOTITLE]]
+
 
+
|}
+
 
+
&nbsp;
+
 
+
'''[[File:Núm 3.png|RTENOTITLE]]&nbsp;Reconducció del moviment'''
+
 
+
Fins aquí &nbsp;hem aconseguit que el cotxe es mogui mentre el sensor turquesa es troba sobre la línia negre, però quant aquest arriba a una corba i el sensor turquesa deixi de detectar el color negre observem que s’atura. Així que modifiquem el programa, tot incloent dos condicionals nous que fan referència als dos sensors restants, perquè això no passi.
+
 
+
[[File:Seg14.PNG|RTENOTITLE]]
+
 
+
{| border="1" cellpadding="1" cellspacing="1" style="width: 700px;"
+
|-
+
| <p style="text-align: center;">'''Detallem el codi que hem afegit per programar els sensors de color groc i el blau:'''</p>
+
*Indiquem que si el color groc detecta el negre giri 6 graus a l’esquerre.
+
 
+
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[[File:Seg14,5.png|RTENOTITLE]]'''&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'''
+
 
+
*Afegim un operador que ens permet, realitzar el gir a la &nbsp;mateixa velocitat que li hem indicat al cotxe que es mogui. &nbsp;
+
 
+
'''&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;[[File:Seg15.png|RTENOTITLE]]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;'''
+
 
+
*Fem el mateix amb el sensor blau, però el gir el senyalitzem cap a la dreta.
+
 
+
'''&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[[File:Seg16.png|RTENOTITLE]]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;'''
+
 
+
*Afegim el bloc&nbsp; &nbsp; [[File:17.png|RTENOTITLE]]&nbsp; &nbsp;&nbsp;en ambdós condicionals perquè un cop el sensor turquesa del cotxe torni a detectar de nou el color negre segueixi caminant.
+
 
+
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[[File:Seg46.png|RTENOTITLE]]
+
 
+
*Unim els dos condicionals al bloc &nbsp;d’inici i provem d’executar el programa. Ràpidament ens adonem que si el cotxe es troba sobre el color negre els 3 sensors són capaços de recorre el circuit correctament respectant les respectives corbes. No obstant, si per contra iniciem el programa amb el cotxe fora de la línia negre, aquest no executa cap moviment per anar a trobar el recorregut.
+
 
+
'''&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;[[File:Seg17.png|RTENOTITLE]]'''
+
 
+
|}
+
 
+
Aconseguim que el cotxe es mantingui seguint la línia durant tot el trajecte, No obstant, tenim un altre repte a resoldre, aconseguir que quant el cotxe es trobi fora del reocrregut, aquest retornant a ell. Per fer-ho creem un nou bloc anomenat "retorna" i li indiquem la següent línia de codi;
+
 
+
'''&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[[File:Seg18.png|RTENOTITLE]]'''
+
 
+
D'aquesta forma el cotxe es mantindrà en moviment fins a retorbar la línia negra.&nbsp;
+
 
+
Fem ús d’un nou condicional que indiqui que quant el color turquesa NO estigui sobre negre, llavors s’executin les condicions que hem encomanat al bloc&nbsp;&nbsp;[[File:Seg47.png|RTENOTITLE]]perquè es mogui fins trobar-la.&nbsp;
+
 
+
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;[[File:Seg48.PNG|300px|Seg48.PNG]]
+
 
+
Finalment l’àrea de treball ens ha de quedar amb la següent programació definida;
+
 
+
[[File:Seg20.png|RTENOTITLE]]
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
==== [[File:Núm 5.PNG|25px|Núm 5.PNG]]&nbsp;Tancament del joc ====
+
 
+
A més, podem fer més atractiu el joc tot afegint més pantalles amb diferents circuits. Observem l’exemple dels diferents dibuixos i també de la programació per tal que canvi d’un fons a un altre.
+
 
+
[[File:Seg21.png|RTENOTITLE]]&nbsp; &nbsp; &nbsp; &nbsp;[[File:Seg22.png|RTENOTITLE]]
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
=== '''Amb ''Snap!''...''' ===
+
 
+
Repliquem el seguidor de línies amb''Snap!''
+
 
+
Tenim la opció d’importar el projecte creat amb ''Scratch'' a l’''Snap! ''i aconseguir així exactament el mateix programa traduït amb el software d’''Snap!'' a través del següent [http://djdolphin.github.io/Snapin8r2/ enllaç].
+
  
Tot i així, ''Snap!'' disposa de la possibilitat de crear el mateix joc segui línies aprofitant algunes de les seves caracteristiques avançades. El codi resultant utilitzant menys línies de codi. Malgrat semblar aparentment més senzill, la complexitat de la programació dels blocs és més complexa.
+
== '''Seguidor de línies virtual amb Snap''!''''' ==
  
L’exemple que seguirem serà PathFollower que es pot &nbsp;trobar en [http://snap.berkeley.edu/snapsource/snap.html#cloud:Username=jens&ProjectName=PathFollower aquest enllaç]
+
L’exemple que seguirem serà el Seguidor de línies que es pot &nbsp;trobar en [https://snap.berkeley.edu/snapsource/snap.html#present:Username=edutec&ProjectName=Seguidor%20línies aquest enllaç]
  
&nbsp;&nbsp;[[File:Seg23.png|300px|RTENOTITLE]]
+
&nbsp; [[File:Seguidor1.png]]
<p style="text-align: justify;">Si observem amb deteniment el projecte es compon del robot "Bot" i 2 sensors "Right Sensor" i "Left Sensor" vinculats al robot. L'exemple aprofita la vinculació d'objectes de l'''Snap!''. Per veure com es vinculem consulteu la introducció a ''Snap!''.</p> <p style="text-align: justify;">Aquesta aproximació té molt a veure amb la realitat, un robot té incorporats una sèrie de sensors, que van a sobre d'ell i que són els que saben detectar els paràmetres físics, en aquest cas un canvi de color o un canvi de contrast.</p>  
+
<p style="text-align: justify">L'aproximació a la realització del seguidor de línies amb <span class="hiddenSpellError" onkeypress="MORFOLOGIK_RULE_CA_ES---#---undefined---#---Possible error ortogràfic---#---Sap#Nap#Anap#Esnap#Nep---#---Snap">Snap</span>! és més semblant a un robot físic que la mateixa versió amb <span class="hiddenSpellError" onkeypress="MORFOLOGIK_RULE_CA_ES---#---undefined---#---Possible error ortogràfic---#---Escreix#Sceaux#Acreix#Sketch---#---Scratch">Scratch</span>. Per fer-ho s'aprofiten dues característiques úniques <span class="hiddenGrammarError" onkeypress="DE_SCHOLA---#---3---#---No s'apostrofa.---#---de ---#---d'">d'</span><span class="hiddenSpellError" onkeypress="MORFOLOGIK_RULE_CA_ES---#---undefined---#---Possible error ortogràfic---#---Sap#Nap#Anap#Esnap#Nep---#---Snap">Snap</span>!, com són la possibilitat de vincular objectes i la comunicació entre ells.</p> <p style="text-align: justify">Si observem amb deteniment el projecte es compon del robot "Robot" i 2 sensors "Sensor Dret" i "Sensor Esquerra" vinculats al robot. Per veure com es vinculem consulteu la introducció a ''Snap!''.</p> <p style="text-align: justify">El&nbsp; robot té incorporats una sèrie de sensors, que van a sobre d'ell i que són els que saben detectar els paràmetres físics, en aquest cas un canvi de color o un canvi de contrast.</p>  
=== Opció 1: ===
+
L'altre caracterisitica és la posibilitat de preguntar a un altre objecte, per exemple poden preguntar si el sensor esta tocant a altre objecte. Per fer-ho es fa servir el bloc "pregunta ... per ..." que es pot trobar a control i que demana&nbsp;un sprite (objecte) i una expressió lambda (una funció a la qual poden cridar).'''&nbsp; '''La icona de ''Snap! ''ve d'aquesta característica i fent una mica de recerca sobre expressió lambda a Internet es pot esbrinar perquè el personatge de l'''Scratch'' es diu Alonzo.
<p style="text-align: justify;">Un possible codi del projecte seria el següent:</p> <p style="text-align: justify;">'''&nbsp;[[File:Seg50.PNG|RTENOTITLE]]'''</p> <p style="text-align: justify;">El robot es mou, que és el que sap fer, i va preguntant als sensors si està&nbsp;tocant la linea, que és el que saben fer. Quan el sensor esquerra la toca, el robot &nbsp;gira una mica en aquesta direcció, quan toca el dret fa el contrari. Darrere d’aquesta aparent simplicitat s’amaguen uns quants conceptes interessants:</p> <p style="text-align: justify;">En primer lloc l’ús dels blocs “Quan” que simplifica&nbsp;molt la realització del programa. Serveixen per definir una resposta provocada per una condició.</p> <p style="text-align: justify;">L’altre concepte important és el bloc “ask” (pregunta) que mostra la potencia de l’Snap! per definir blocs. Es tracta d’un bloc que té per paràmetre un objecte i que retorna el resultat d’un codi que executarà aquest objecte. Això és possible pel disseny de l’''Snap!'' on els objectes i el codi tenen la mateixa entitat que un nombre o un text i es poden fer servir amb la mateixa facilitat que aquests.</p>  
+
<p style="text-align: justify">[[File:Seguidor3.png]]</p> <p style="text-align: justify">Així el següent blocs retornarà veritat o fals depenent si el sensor tocva el camí o no:</p> <p style="text-align: justify">&nbsp;</p> <p style="text-align: justify">&nbsp;</p> <p style="text-align: justify">Un possible codi del projecte seria el següent:</p> <p style="text-align: justify">'''&nbsp;[[File:Seguidor2.png]]'''</p> <p style="text-align: justify">El robot es mou, que és el que sap fer, i va preguntant als sensors si està&nbsp;tocant la linea, que és el que saben fer. Quan el sensor esquerra la toca, el robot &nbsp;gira una mica en aquesta direcció, quan toca el dret fa el contrari. Darrere d’aquesta aparent simplicitat s’amaguen uns quants conceptes interessants:</p> <p style="text-align: justify">En primer lloc l’ús dels blocs “Quan” que simplifica&nbsp;molt la realització del programa. Serveixen per definir una resposta provocada per una condició.</p> <p style="text-align: justify">L’altre concepte important és el bloc “ask” (pregunta) que mostra la potencia de l’Snap! per definir blocs. Es tracta d’un bloc que té per paràmetre un objecte i que retorna el resultat d’un codi que executarà aquest objecte. Això és possible pel disseny de l’''Snap!'' on els objectes i el codi tenen la mateixa entitat que un nombre o un text i es poden fer servir amb la mateixa facilitat que aquests.</p>  
{| border="1" cellpadding="1" cellspacing="1" style="width: 700px;"
+
{| style="width: 700px" cellspacing="1" cellpadding="1" border="1"
 
|-
 
|-
| <p style="text-align: center;">'''Veiem com està construït el bloc “ask”:'''</p> <p style="text-align: justify;">'''&nbsp;&nbsp;[[File:Seg51.png|RTENOTITLE]]'''</p>  
+
| <p style="text-align: center">'''Veiem com està construït el bloc “ask”:'''</p> <p style="text-align: justify">'''&nbsp;&nbsp;[[File:Seg51.png|RTENOTITLE]]'''</p>  
 
Els paràmetres de "ask" (pregunta a) són un sprite (objecte) i una expressió lambda (una funció a la qual poden cridar). La clau està en poder cridar qualsevol codi d'un altre objecte i es marca escollint&nbsp;la següent opció a la definició del bloc''':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;'''[[File:Seg52.png|RTENOTITLE]]
 
Els paràmetres de "ask" (pregunta a) són un sprite (objecte) i una expressió lambda (una funció a la qual poden cridar). La clau està en poder cridar qualsevol codi d'un altre objecte i es marca escollint&nbsp;la següent opció a la definició del bloc''':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;'''[[File:Seg52.png|RTENOTITLE]]
  
Line 188: Line 58:
  
 
|}
 
|}
<p style="text-align: justify;">&nbsp;</p>  
+
<p style="text-align: justify">&nbsp;</p>  
 
=== Opció 2: ===
 
=== Opció 2: ===
  

Revision as of 12:44, 3 December 2018


Què és un seguidor de línies?

Un seguidor de línies és un rastrejador que té com a objectiu com el mateix nom indica, seguir una línia d’un color més fosc situada sobre un fons d’un color més clar. El rastrejador funciona mitjançant els sensors. En funció de la complexitat del recorregut, són necessaris més o menys sensors. Distingim entre seguidors de línies virtuals i reals. En l’exemple que durem a terme, treballem un seguidor de línies virtual. Aquest exercici permet introduir els conceptes bàsics de robòtica, com són els sensors, la presa de decisions amb un mecanisme de control oi la resposta per modificar el comportament del sistema.

Els sensors

Els sensors són els encarregats de fer el treball de detecció, en aquest cas de la línia, mitjançant la informació que interpreten de les ordres que els hi indiquem.


Descripció del procés

El present exercici es presenta mitjançant la programació amb Snap!. El mateix exercici es pot seguir amb Scratch a Seguidor de línies virtual amb Scratch. També enim la opció d’importar el projecte creat amb Scratch a l’Snap! i aconseguir així exactament el mateix programa traduït amb el software d’Snap! a través del següent enllaç.

Seguidor de línies virtual amb Snap!

L’exemple que seguirem serà el Seguidor de línies que es pot  trobar en aquest enllaç

  Seguidor1.png

L'aproximació a la realització del seguidor de línies amb Snap! és més semblant a un robot físic que la mateixa versió amb Scratch. Per fer-ho s'aprofiten dues característiques úniques d'Snap!, com són la possibilitat de vincular objectes i la comunicació entre ells.

Si observem amb deteniment el projecte es compon del robot "Robot" i 2 sensors "Sensor Dret" i "Sensor Esquerra" vinculats al robot. Per veure com es vinculem consulteu la introducció a Snap!.

El  robot té incorporats una sèrie de sensors, que van a sobre d'ell i que són els que saben detectar els paràmetres físics, en aquest cas un canvi de color o un canvi de contrast.

L'altre caracterisitica és la posibilitat de preguntar a un altre objecte, per exemple poden preguntar si el sensor esta tocant a altre objecte. Per fer-ho es fa servir el bloc "pregunta ... per ..." que es pot trobar a control i que demana un sprite (objecte) i una expressió lambda (una funció a la qual poden cridar).  La icona de Snap! ve d'aquesta característica i fent una mica de recerca sobre expressió lambda a Internet es pot esbrinar perquè el personatge de l'Scratch es diu Alonzo.

Seguidor3.png

Així el següent blocs retornarà veritat o fals depenent si el sensor tocva el camí o no:

 

 

Un possible codi del projecte seria el següent:

 Seguidor2.png

El robot es mou, que és el que sap fer, i va preguntant als sensors si està tocant la linea, que és el que saben fer. Quan el sensor esquerra la toca, el robot  gira una mica en aquesta direcció, quan toca el dret fa el contrari. Darrere d’aquesta aparent simplicitat s’amaguen uns quants conceptes interessants:

En primer lloc l’ús dels blocs “Quan” que simplifica molt la realització del programa. Serveixen per definir una resposta provocada per una condició.

L’altre concepte important és el bloc “ask” (pregunta) que mostra la potencia de l’Snap! per definir blocs. Es tracta d’un bloc que té per paràmetre un objecte i que retorna el resultat d’un codi que executarà aquest objecte. Això és possible pel disseny de l’Snap! on els objectes i el codi tenen la mateixa entitat que un nombre o un text i es poden fer servir amb la mateixa facilitat que aquests.

Veiem com està construït el bloc “ask”:

  RTENOTITLE

Els paràmetres de "ask" (pregunta a) són un sprite (objecte) i una expressió lambda (una funció a la qual poden cridar). La clau està en poder cridar qualsevol codi d'un altre objecte i es marca escollint la següent opció a la definició del bloc:                              RTENOTITLE

La icona de Snap! ve d'aquesta característica i fent una mica de recerca sobre expressió lambda a Internet es pot esbrinar perquè el personatge de l'Scratch es diu Alonzo.

Veiem com està plantejada aquesta definició. Comencen per el bloc bàsic, “tocant”:

  RTENOTITLE RTENOTITLE

Si cridem a aquest bloc del “bot” retorna cert, com era d’esperar: Ara ho compliquem una mica:

RTENOTITLE

Estem fent una crida a la funció “tocant”, el resultat és el mateix, però es podria generalitzar per qualsevol bloc, del “bot” o de qualsevol altre. Per exemple, mirarem de fer-lo amb el sensor esquerre: busquem el següent bloc a Sensors i seleccionarem l'objecte corresponent:

RTENOTITLE

Fiquem el bloc de <tocant Path?> en el primer camp i encapsul·lem tot el bloc fent clic dret i seleccionant la opció corresponent: 

RTENOTITLE

Ara fiquem aquest bloc en un de crida i el des-encapulem fent també clic dret en ell mateix (això últim és important, si no no funcionarà):

RTENOTITLE

I ho provem:

 RTENOTITLE

En aquest cas estem cridant al codi d’altres objectes, els sensors. El bloc “ask” va un pas més enllà fent general aquesta idea.

 RTENOTITLE

 

Opció 2:

A partir de la versió 4.1 de l'Snap, ja disposem d'un bloc que fa la mateixa funció que el bloc "ask" que hem creat abans:

RTENOTITLE

Ho podem provar per veure si funciona:

RTENOTITLE

I ara ja ho podem incorporar en el nostre codi:

RTENOTITLE