Práctica 2: El buscador de luz

37 

(1)Práctica 1: Comprobación de luces y sonido En esta práctica vamos a ejecutar un programa (preinstalado) que comprueba que funcionan el zumbador y las tres luces verdes de la parte posterior. 1. Coloca el robot en el suelo en un lugar suficientemente iluminado 2. Enciéndelo poniendo el interruptor I/O en posición “I”. 3. El robot hará sonar una breve melodía y se iluminarán los tres LEDs de su parte trasera. 4. Si no ocurre lo anterior, mantén pulsado en botón rojo (de reset) hasta que suene un pitido breve. Entonces debería ocurrir lo dicho en el paso anterior. 5. Apaga el robot. Si no ha funcionado nada, no te preocupes: puede ser que las pilas estén gastadas (la luz roja de la parte trasera parpadea) o mal colocadas o también que se haya borrado el programa que el robot lleva preinstalado (se llama Scribbler_Demo.bs2). Si fuera esto último, pídele a tu profesor que te lo recargue.. Práctica 2: El buscador de luz En la parte frontal superior el Scribbler tiene tres agujeros en cuyos fondos hay otros tantos sensores de luz. Gracias a ellos no sólo puede detectar el grado de iluminación de su entorno sino también “saber” de qué lado hay más luz. 1. Coloca el robot en el suelo en un lugar con iluminación desigual 2. Enciéndelo poniendo el interruptor I/O en posición “I”. 3. Coge el robot con una mano y ponlo boca arriba con el interruptor I/O a tu derecha. Pulsa el botón rojo a la vez que tapas con un dedo el sensor de luz derecho. Mantenlo así hasta que suene un pitido breve. 4. Pon el robot en el suelo. Verás que suena un pitido más largo y comienza a moverse buscando la luz más intensa. Si lo enfocas con una linterna verás que irá hacia ella aunque tú la muevas. 5. Apaga el robot..

(2) Práctica 3: El detector de obstáculos Además de los tres sensores de luz visible, el Scribbler contiene un detector de rayos infrarrojos (IR) en la parte central de su morro y dos emisores del mismo tipo a ambos lados de aquel. Estos tres elementos constituyen una especie de radar con el que el robot puede detectar obstáculos a su alrededor con bastante precisión. Vamos a comprobarlo: 1. Coloca el robot en el suelo y enciéndelo poniendo el interruptor I/O en posición “I”. 2. Coge el robot con una mano y ponlo boca arriba con el interruptor I/O a tu derecha. Pulsa el botón rojo a la vez que cubres con un dedo el sensor de luz central. Mantenlo así hasta que suene un pitido breve. 3. Pon el robot sobre una mesa y coloca a unos 20 cm delante de él cualquier objeto (sirve con una mano, por ejemplo). Verás que se activa al menos una de las luces verdes de su parte trasera y que suena una nota musical. 4. Mueve el objeto a ambos lados del robot y comprueba cómo cambian las luces activadas y el tono de la nota que emite, según cuál sea el emisor que envía la señal IR. Aleja y acerca el objeto y comprueba en qué rango de distancias el detector IR es capaz de percibir la presencia de un obstáculo. 5. Repite los pasos anteriores con otros objetos más grandes o más pequeños, más rugosos o más lisos, más o menos brillantes y extrae conclusiones sobre su capacidad de detección en cada caso. 6. Cuando hayas terminado apaga el robot.. Práctica 4: El seguidor de líneas El robot Scribbler tiene otro detector formado por de un emisor y dos sensores de infrarrojos en su parte inferior. El conjunto está diseñado para que el robot sea capaz de detectar la existencia y la posición de una línea oscura sobre un fondo claro. Para comprobarlo toma una hoja blanca de papel grueso o cartulina de tamaño A3 y con un rotulador negro de unos 2 cm de ancho dibuja sobre ella una línea continua (no necesariamente recta). Cuando lo hayas hecho coge el Scribbler y realiza las siguientes operaciones: 1. Coloca el robot en el suelo y enciéndelo poniendo el interruptor I/O en posición “I”. 2. Coge el robot con una mano y ponlo boca arriba con el interruptor I/O a tu derecha. Pulsa el botón rojo a la vez que cubres con un dedo el sensor de luz derecho y con otro dedo el sensor izquierdo, dejando libre el central. Mantenlo así hasta que suene un pitido breve. 3. Pon la hoja en el suelo y sitúa el Scribbler sobre ella, preferiblemente al comienzo de la línea negra. Verás que el robot comienza a moverse buscando la línea y cuando la encuentra intentará seguirla. 4. En ocasiones, sobre todo en curvas muy cerradas el robot perderá la línea, pero si todo funciona correctamente, volverá a moverse de un lado para otro hasta volverla a encontrar. 5. Si ves que ha funcionado, coge el robot y apágalo enseguida porque el sistema detector de líneas consume bastante energía y se podrían agotar las pilas..

(3) Práctica 5: El selector de programas de demostración En las prácticas anteriores hemos estado ejecutando varios módulos de un programa de demostración que el Scribbler trae cargado de la fábrica. El programa tiene ocho módulos distintos que, como ya sabes, se seleccionan tapando (o destapando) con los dedos los tres sensores de luz frontales a la vez que se pulsa el botón de reset. Si representamos un sensor tapado con un 1 y uno destapado con un 0, podemos identificar cada módulo con un número binario de tres cifras que representa a la combinación de sensores tapados o destapados que lo activa. Así por ejemplo, el módulo buscador de luz (práctica 2) se activa tapando sólo el sensor derecho, por lo que le corresponde el número 001, el módulo detector de línea (práctica 4) tapando los sensores derecho e izquierdo, pero no el central, por lo que se identifica con el número 101, etc. En esta práctica vas a ejecutar uno por uno los cuatro restantes módulos de demostración y describir lo más brevemente que puedas qué es lo que hacen: Ident 000 001 010 011 100 101 110 111. Descripción Comprueba el altavoz y las luces El robot se mueve buscando la luz Comprueba el detector de obstáculos. El robot se mueve siguiendo una línea. Recuerda que para hacer correctamente la selección debes tapar o destapar totalmente los sensores con la parte trasera del robot hacia ti o, lo que es lo mismo, con el interruptor I/O a tu derecha..

(4) Práctica 6: Carga y ejecución de un programa Para realizar esta práctica, además del robot necesitas un ordenador con la aplicación Basic Stamp Editor y un cable COM/COM o bien COM/USB que comunique a ambos. 1. Enciende el ordenador, apaga el Scribbler y conéctalos con el cable serie. 2. En el ordenador abre la aplicación Basic Stamp Editor y en el Scribbler pulsa el botón de encendido. Comprueba que tiene conexión con el ordenador pulsando Run > Identify (ó Ctrl+I); si la conexión está correctamente establecida aparecerá un mensaje como este. En caso contrario, comprueba el cable y las baterías y vuelve a intentarlo. 3. Desde el menú File > Open busca y abre el programa ScribblerSaluda.bs2. 4. Para cargar y ejecutar el programa en el Scribbler pulsa Run > Run (ó Ctrl+R). Tras un breve mensaje que indica que el programa se está cargando, verás que el robot abre en la pantalla de tu ordenador una ventana como esta. 5. El proceso ha terminado. Si no vas a hacer más prácticas, debes apagar primero el robot y después desconectarlo del ordenador. Si vas a hacer otra práctica, puedes dejarlo todo como estaba. Ciertamente no ha sido un resultado muy espectacular, pero lo que se trata en esta práctica es que aprendáis de memoria el proceso de carga y ejecución de programas, porque lo vais a realizar muchas veces..

(5) Práctica 7: Edición y ejecución de un programa interactivo En esta práctica vamos a modificar un programa ya hecho. Al ejecutarlo el robot nos pedirá un número y nos devolverá su cuadrado. Además comenzaremos a ver qué significan las órdenes de PBASIC que aparecen en los programas. 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca y abre el programa CalculaConScribbler.bs2. Como puedes ver, el programa no es más que un archivo con 40 líneas de texto. La mayor parte de ellas no contienen órdenes de PBASIC sino comentarios para que los usuarios humanos entiendan lo que se está haciendo. Los reconocerás porque están escritos en fuente de color verde y porque tienen un apóstrofe ( ' ) al comienzo de la línea. Cuando el intérprete ve un apóstrofe sencillamente ignora lo que haya desde él hasta el final de la línea y no se lo envía a la controladora del Scribbler. ' Esto es un comentario --- Da igual lo que pongas porque no te va a hacer caso. Sin embargo hay dos excepciones a esta regla: en los comentarios iniciales de cualquier programa hay siempre dos líneas como estas ' {$STAMP BS2} ' {$PBASIC 2.5}. Esas dos líneas no son comentarios ni tampoco órdenes para la controladora, sino informaciones para el intérprete con los que se le indican el modelo de controlador que va a recibir el programa y la versión de PBASIC en que está escrito. Visto esto, continuamos con la práctica: 3. Vuelve al editor e inserta una línea en blanco entre la octava y la novena. Escribe en ella el siguiente comentario ' REALIZADO POR:. y añade tu nombre y el de tus compañeros de grupo. Cuando lo hayas hecho pulsa File > Save ó Ctrl+S.

(6) 4. Ejecuta el programa con Run > Run ó Ctrl+S y espera a que el robot abra una ventana llamada Debug Terminal. Después de saludarte, el Scribbler te pedirá que escribas un número entero; hazlo y pulsa <Enter>, verás que te devuelve el cuadrado de dicho número.. 5. Rellena la Memoria de Prácticas. En el apartado de comentarios debes indicar qué se podría mejorar en el programa porque no hace mal o porque no lo hace (por ejemplo ¿Qué ocurre con los números negativos? ¿Y con los muy grandes? ¿Y si le introducimos un texto en vez de un número?). 6. Hemos terminado la práctica. Si no vas a hacer más apaga el robot desconéctalo del ordenador. Si vas a hacer otra, puedes dejarlo todo como estaba. Como ves, el proceso de carga y ejecución de un programa desde el ordenador al Scribbler es sencillo y directo. En los siguientes apartados iremos aprendiendo poco a poco cómo se elaboran los programas en lenguaje PBASIC.. 6 de 38.

(7) Práctica 8: Comprobación de las luces LED Las luces del Scribbler se encienden y apagan con dos órdenes muy sencillas: HIGH y LOW. La primera manda una señal eléctrica alta y la segunda una señal eléctrica baja a un puerto de entrada en la controladora. En electrónica digital una señal (eléctrica o de otro tipo) sólo puede tomar dos valores: alto y bajo. Si su valor es mayor que cierto valor superior de referencia, prefijado de antemano, entonces se considera alta, sin importar que lo supere por mucho o por poco; si, por el contrario es inferior a otra referencia inferior entonces se considera baja. En particular, la controladora BS2 del Scribbler considera que una señal eléctrica es baja si su valor no supera los +1,39 Volt y alta si es mayor de +1,41 Volt. Idealmente, una señal alta debería valer +1,5 V y una señal baja +0,0 V, pero basta con que estén por encima o por debajo de 1,40 V para que la controladora las considere alta o baja, respectivamente. En cuanto a los puertos, son sencillamente patillas numeradas del circuito por donde la controladora envía o recibe señales eléctricas. En concreto, las luces del Scribbler están conectadas a las patillas 8, 9 y 10 de la controladora. Así pues, una orden como HIGH 8. indica que se le está enviando una señal de al menos +1,41 V a lo que esté conectado a la patilla 8 de la controladora, que en este caso el LED central. Por tanto, el LED se encenderá. Para apagarlo bastará con escribir después LOW 8. Para que a quien lea el programa le resulte más sencillo saber qué hay conectado a cada patilla, se suele poner al principio una lista de abreviaturas en las que a cada puerto numérico se le asigna un nombre que elige el usuario, por ejemplo: LedCentro PIN 8. ' En la patilla 8 esta conectado el LED central. De esta forma la orden HIGH LedCentro. es idéntica a la primera, pero más sencilla de recordar. Por otra parte, en esta práctica utilizaremos la orden PAUSE, que lo único que hace es mantener a la controladora y a los dispositivo conectados a ella en la situación en que se encuentren durante un tiempo especificado en milisegundos. Es decir, PAUSE 2000. introduce un tiempo de espera de 2000 milisegundos, o sea, 2 segundos. Para terminar, fíjate en que no es necesario escribir los comentarios en una línea aparte, sino que también se puede poner tras una orden al final de la línea. Con esto ya podemos comenzar la práctica. 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca y abre el programa PruebaLeds.bs2 que, por cierto, tienes al principio del apartado 22.3. 3. Ejecuta el programa con Run > Run ó Ctrl+S y comprueba cómo se van encendiendo las tres luces en intervalos de medio segundo y cómo al final se apagan todas a la vez..

(8) 4. Modifica el programa para que encienda primero la luz izquierda durante un segundo y luego la apague, encienda después la luz central durante otro segundo y la apague y haga lo mismo con la luz derecha. Guárdalo como PruebaLeds1.bs2 ( menú File > Save as ) y ejecútalo para comprobar que funciona como se pide. 5. Modifica el programa para que encienda la luz izquierda, tras 1,5 segundos la luz central, en el instante 3,0 seg la luz derecha y al llegar a 4,0 seg apague las tres. Guárdalo como PruebaLeds2.bs2 y ejecútalo para comprobar que funciona como se pide. 6. Apaga el robot y desconéctalo del ordenador. Vuelve a encenderlo y comprueba si ejecuta algún programa. Explica qué ha ocurrido. 7. Explica qué sucede cada vez que se pulsa el botón rojo que está situado en la parte trasera izquierda. 8. Hemos terminado la práctica. Si no vas a hacer más apaga el robot. Si vas a hacer otra, vuelve a conectarlo al ordenador.. 8 de 38.

(9) Práctica 9: Verificación del altavoz y uso de bucles El altavoz del Scribbler no se activa con la orden HIGH porque para que produzca sonidos es necesario activarlo y desactivarlo muchas veces por segundo, más cuanto más agudo sea el sonido. Para hacer esto el lenguaje PBASIC tiene una orden que se llama FREQOUT y que vamos a aprender a usar en esta práctica. 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca ScribblerReset.bs2. y. abre. los. programas. PruebaAltavoz.bs2. y. 3. Ejecuta el programa PruebaAltavoz.bs2 con Run > Run ó Ctrl+S y comprueba cómo suenan repetidamente en intervalos de 4×0,5 = 2 segundos dos notas sencillas, una doble y un silencio. 4. Para que deje de sonar puedes hacer dos cosas: apagar el robot o cargar otro programa. Si apagas el robot, al volver a encenderlo seguirá sonando, así que lo mejor es que cargues otro programa. Te recomiendo que cargues o bien el programa inicial de demostración ( Scribbler Demo.bs2 ) o bien el programa de reinicio ( ScribblerReset.bs2 ), que precisamente abriste en el segundo paso. No hemos acabado la práctica, pero conviene detenerse para ver unas cuantas cosas interesantes que hay en el programa PruebaAltavoz.bs2. En las primeras líneas hay unos comentarios iniciales que identifican al programa y explican lo que hace. Debes habituarte a ponerlas en todos los programas que hagas porque con el paso del tiempo se olvida fácilmente lo que hemos hecho. Después (líneas 18 y 19) están esos comentarios especiales que indican al Basic Stamp Editor qué controladora y lenguaje estamos usando. En la línea 25 usamos la orden PIN emAltavoz PIN 11. ' Altavoz.

(10) para indicar que lo que hay conectado en la patilla 11 se va a llamar emAltavoz de ahí en adelante (le he puesto el em al principio para recordar que es un emisor, o sea, un puerto de salida de datos, pero puedo llamarle como quiera). Para saber el número que corresponde a cada dispositivo se puede mirar dentro del robot dónde está conectado o, mucho más fácil, buscarlo en la documentación que lo acompaña. Después tenemos cuatro líneas de reserva y asignación de variables. En las dos primeras La4 VAR Word Mi3 VAR Word. se reserva espacio en la memoria para dos datos variables que se llamarán La4 y Mi3 . Ambos son de tipo Word , lo que significa que ocupan 2 bytes cada uno. En las dos líneas siguientes La4 = 1760 Mi3 = 1319. se introducen valores numéricos en las variables recién creadas. De ahí en adelante, cada vez que se use la expresión La4 el intérprete la sustituirá por el número 1760. El programa comienza verdaderamente a partir de la línea 40. En la 42 LOW emAltavoz. se apaga el altavoz por si acaso permaneciera encendido de antes. En la 44 DEBUG “Escucha como suena!”. el robot abre la ventana Debug Terminal y manda el mensaje entrecomillado. Entre las líneas 46 y 54 se desarrolla una construcción llamada bucle indefinido. Básicamente consiste en que el robot repetirá todo lo que haya entre las órdenes DO y LOOP una y otra vez hasta que algo externo lo detenga. En este caso se repiten tres órdenes FREQOUT y una PAUSE. Esta última ya sabes lo que hace; en cuanto a las otras, la primera (línea 48) FREQOUT emAltavoz, 500, La4. equivale a FREQOUT 11, 500, 1760. y eso conecta y desconecta lo que haya en el puerto 11, es decir, el altavoz, durante 500 milisegundos con una frecuencia de 1760 veces por segundo. En definitiva, el altavoz emite durante medio segundo un sonido de 1760 Hz, que corresponde con bastante aproximación a la cuarta nota La (empezando por la izquierda) de un teclado musical, de ahí su nombre. En la línea 50 la orden FREQOUT emAltavoz, 500, La4, Mi3. hace sonar esas dos notas a la vez. Por último, al encontrar la orden LOOP (línea 54) la controladora regresa al comienzo del bucle y vuelve a repetirlo indefinidamente. Para que se vea más claro, todo lo que hay dentro de un bucle se suele escribir con sangría, aunque no es obligatorio. Existe otro tipo de bucle, llamado bucle definido que permite repetir una serie de operaciones una cierta cantidad de veces. Vamos a ver cómo se hace. 5. Vuelve al programa PruebaAltavoz.bs2 en el editor, pulsa File > Save as y guárdalo con el nombre PruebaAltavoz2.bs2 6. Sustituye el bucle indefinido DO … LOOP por este otro: cuenta VAR Word FOR cuenta = 1 TO 15 ... ... NEXT. ' repite 15 veces. 10 de 38.

(11) Los puntos suspensivos no tienes que ponerlos sino sustituirlos por las cuatro órdenes que hacen sonar la melodía. 7. Ejecuta el programa con Run > Run ó Ctrl+S y comprueba cómo se repite la melodía exactamente 15 veces. 8. Sabiendo que la nota Re3 tiene una frecuencia de 1174 Hz haz que repita la secuencia {Re3, Mi3, La4, silencio} durante siete veces. 9. Ya casi hemos terminado la práctica. Guarda el programa, pero no desconectes el robot porque lo vas a necesitar. Merece la pena ver con un poco más de detalle cómo funciona el bucle definido, porque lo vamos a utilizar muchas veces. La orden cuenta VAR Word. crea una nueva variable llamada cuenta de tipo Word (dos bytes de extensión). Esa variable se usará para que la controladora vaya recordando el número de repeticiones por el que se llega. Naturalmente, el nombre es arbitrario y podía haberle puesto cualquier otro, aunque conviene que sea descriptivo. La siguiente orden FOR cuenta = 1 TO 15. indica el comienzo del bucle. Lo que haya desde ahí hasta NEXT se repetirá 15 veces, y en cada vez se irá incrementando el contador de uno en uno. 10. Explica qué ocurriría si el bucle comenzase por FOR cuenta = 5 TO 15 ¿Se repetiría 15 veces, 10, 11, …? ¿O simplemente daría error? ¿Y si fuera por FOR cuenta = 15 TO 1 ? ¿Haría una cuenta atrás? Compruébalo con el Scribbler y cuando tengas la respuesta apágalo y desconéctalo del ordenador. 11. Este apartado es para que lo resuelvas con el Scribbler apagado: ¿Cuál es el máximo valor que podría tener la variable cuenta? Pista: recuerda que en un byte cabe un número binario de ocho cifras. Veremos más adelante que la orden FREQOUT también se usa para manejar los detectores de obstáculos del Scribbler.. 11 de 38.

(12) Práctica 10: Comprobación de los fotosensores Los fotosensores del Scribbler constan de un condensador y una foto-resistencia que a grandes rasgos funcionan así: el condensador se carga al recibir una señal alta durante un tiempo suficiente (alrededor de 3 ms) y se descarga después sobre la foto-resistencia, tanto más deprisa cuanta más luz esté recibiendo esta. Así pues para manejar los fotosensores es necesario realizar dos pasos: primero se cargan los condensadores y después se mide su tiempo de descarga; cuanto mayor sea más oscuridad hay. En esta práctica vamos a ver cómo se puede hacer eso en el lenguaje PBASIC. 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca y abre los programas PruebaFotoSensores.bs2 y ScribblerReset.bs2 3. Ejecuta el programa con Run > Run ó Ctrl+S . En la pantalla del ordenador aparecerá la ventana Debug Terminal donde se muestran los valores que en ese mismo instante están recibiendo los fotosensores. Si tapas uno de ellos verás que el correspondiente valor aumenta (hay más oscuridad), si lo destapas o le acercas una luz verás que disminuye. 4. Gira hacia los lados el robot y estima un valor aproximado para los tiempos de descarga de los tres fotosensores en las condiciones habituales de tu taller. Apúntalos. Es importante conocer estos valores para que el Scribbler sepa qué entendemos por luz y por oscuridad. Por otra parte, como los fotosensores no son exactamente iguales, en las mismas condiciones no se descargan a idénticas velocidades; por eso es necesario estudiar cada uno por separado. 5. Ejecuta el programa de reinicio ( ScribblerReset.bs2 ) y apaga el robot. El programa es fácil de entender si se ha comprendido cómo funcionan los fotosensores.. Así por ejemplo en la línea.

(13) HIGH reOscuroCen. se carga el condensador del fotosensor central, después con la orden RCTIME reOscuroCen, 1, valOscCen. se mide el tiempo que tarda en descargarse y se almacena en la variable valOscCen y, finalmente, en DEBUG "Valor del fotosensor central =. ", DEC5 valOscCen, CR. se envía a la ventana Debug Terminal el valor de dicho tiempo de descarga en formato numérico de cinco cifras (DEC5) más un salto de línea (CR) al final. Recuerda que los fotosensores son en realidad detectores de oscuridad: cuanto más alto es el valor que devuelven, hay menos luz en el ambiente.. 13 de 38.

(14) Práctica 11: Verificación del detector de línea Como vimos anteriormente, el Scribbler posee en su parte inferior un detector de rayos infrarrojos que contiene un emisor IR y dos sensores situados a sus lados. Con esto el robot es capaz de encontrar una línea pintada en el suelo aprovechando el hecho de que los rayos IR rebotan al alcanzar una superficie clara y brillante, pero son absorbidos por superficies oscuras y mates. El emisor IR está conectado al puerto 3 y se activa y desactiva como los LEDs, es decir, con las órdenes HIGH y LOW, respectivamente. Los sensores están conectados a los puertos 4 (derecho) y 5 (izquierdo); normalmente están activados y sólo se desactivan cuando reciben un rayo IR rebotado del emisor. En el lenguaje PBASIC se considera que una variable se encuentra en estado activado (o verdadero) cuando contiene un valor numérico no nulo, generalmente 1, y en estado desactivado (o falso) cuando contiene el valor cero 0. Gracias a esto podemos saber si los sensores han recibido un rebote o no, como enseguida veremos. Vamos a ver cómo se lleva todo esto a la práctica. 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca ScribblerReset.bs2. y. abre. los. programas. PruebaLineas.bs2. y. Antes de continuar con la práctica vamos a detenernos un momento a observar lo que hay en el programa.. En las líneas 25 a 27 se definen los tres puertos del detector IR. Los puertos 4 y 5 son de entrada de datos, reLineaDer reLineaIzq. PIN 4 PIN 5. ' Detector (inferior) derecho de lineas ' Detector (inferior) izquierdo de lineas. por eso la re (de receptor) al comienzo de su nombre. De ahí en adelante, cada vez que se utilice uno de estos nombres, la controladora verificará el estado del correspondiente.

(15) puerto, si está activo devolverá un 1 y si está inactivo devolverá un 0. Se dice entonces que reLineaDer y reLineaIzq funcionan como variables binarias, que sólo pueden contener un valor verdadero (1) ó falso (0). Hay una particularidad en el comportamiento de estos sensores que conviene tener clara: habitualmente se encuentran activos (devuelven 1 al ser interrogados) y sólo tras recibir un haz de pulsos IR se desactivan (devuelven un 0). Si te parece extraño, considera que son sensores de no-rebotes en vez de sensores de rebotes. Muchos otros dispositivos, tanto emisores como receptores, se comportan de esta manera y se dice de ellos que funcionan con lógica negativa. En la línea 34 se pone en funcionamiento el emisor IR con la orden HIGH como si fuera un LED —de hecho es un tipo especial de ellos— y a partir de ahí (líneas 36 a 58) se repite indefinidamente un bucle en el que comprueba individualmente el estado de los sensores laterales: si el sensor está a 1 es que no ha recibido el rebote del haz de infrarrojos que mandó el emisor, seguramente porque en su lado hay una línea en el suelo o al menos una zona más oscura que lo ha absorbido; si el sensor está a 0 es porque el haz del emisor ha rebotado sobre una zona clara y ha llegado hasta él desactivándolo. Para hacer esa comprobación es necesario utilizar una nueva estructura llamada bifurcación condicional. En general, estas estructuras consisten en evaluar una expresión que generalmente suele ser una comparación; si el resultado es verdadero (1) o bien un número distinto de cero entonces se ejecuta un conjunto de órdenes, pero si el resultado fuera falso o, lo que es lo mismo, el número 0 entonces ejecuta otro conjunto de órdenes. En el lenguaje PBASIC eso se hace con este grupo de órdenes: IF (...) THEN ... ELSE ... ENDIF. Veamos sobre el programa qué significa cada cosa. En la línea 41 se comprueba si está desactivado el sensor derecho con la orden IF IF (reLineaDer = 0) THEN. ' Si el sensor IR derecho esta a cero. En caso de que lo esté ( reLineaDer = 0 ) se ejecuta (THEN) la línea siguiente DEBUG "Lado derecho:. Blanco". ' Ha recibido el rebote: no hay línea. y en caso contrario se ejecuta (ELSE) esta otra DEBUG "Lado derecho:. Negro". ' No ha llegado el rebote: hay línea. Por último, la línea ENDIF. indica el final de la estructura de bifurcación. En definitiva, con esa estructura se ha conseguido que según si esté desactivado o no el sensor derecho el robot haga una cosa u otra. Observa que también podríamos haberlo hecho al revés, es decir, así, IF (reLineaDer <> 0) THEN DEBUG "Lado derecho: Negro" ELSE DEBUG "Lado derecho: Blanco" ENDIF. ' Si el sensor IR derecho no esta a cero... ' ...no ha llegado el rebote: hay línea ' En caso contrario... ' ...Ha recibido el rebote: no hay línea. siendo el resultado exactamente el mismo. Como habrás podido suponer, el símbolo <> significa “no es igual a” ; si quisieras indicar “es mayor o igual que” o bien “es menor o igual que” tienes que usar >= y <= respectivamente. En general, tras la sentencia IF puede ir cualquier expresión aritmética o lógica que devuelva un valor 0 ó 1, mientras que en las sentencias THEN y ELSE pueden ir una o varias órdenes de PBASIC. Enseguida veremos más ejemplos de todo esto. Es muy importante que no confundas las condiciones verdaderas o falsas con los estados activos e inactivos. Fíjate en este mismo caso: si el detector reLineaDer está inactivo, o sea, si contiene un valor 0, entonces la condición IF (reLineaDer = 0) devolverá un valor verdadero, o sea, 1, pero si está activado (contiene un 1) entonces esa misma 15 de 38.

(16) condición devolverá un valor falso, o sea, un 0. Parece un trabalenguas pero es absolutamente lógico. Por lo demás, en las líneas 49 a 54 el programa vuelve a hacer esas mismas operaciones con el detector izquierdo para terminar regresando al comienzo del bucle y repetir estas operaciones indefinidamente. 3. Apoya el robot sobre un costado y ejecuta el programa con Run > Run ó Ctrl+S . En la pantalla del ordenador aparecerá la ventana Debug Terminal donde se indica lo que están detectando los dos sensores inferiores. Acerca un objeto oscuro a los sensores y comprueba que ambos funcionan. 4. Mientras preparas el siguiente apartado apaga el robot. Esto es para que el emisor de IR no agote las baterías. 5. Sobre una hoja de papel dibuja líneas de distintos colores y anchuras, sitúa el robot sobre ellas y comprueba su mayor o menor dificultad para detectarlas. Anota los resultados. 6. Ejecuta el programa de reinicio ( ScribblerReset.bs2 ) y vuelve a cargar el programa CalculaConScribbler.bs2 (práctica 7). Guárdalo con el nuevo nombre CalculaConScribbler2.bs2 y modifícalo para que pida dos números enteros y calcule su cociente sólo si el denominador es distinto de cero; en caso contrario debe avisar de que no puede hacer la división. 7. Ejecuta el programa de reinicio ( ScribblerReset.bs2 ), apaga el robot y anota en la memoria de la Práctica 7 los resultados de esta ampliación, comentando las faltas que hayas encontrado.. 16 de 38.

(17) Práctica 12: Comprobación del detector de obstáculos El detector de obstáculos tiene una estructura ligeramente distinta a la del detector de líneas: este tiene dos emisores IR a ambos lados del morro (puertos 14 y 15) y un único sensor en la parte central (puerto 6). Además, el detector de obstáculos se programa de una manera un poco más elaborada que aquél. Ambas cosas permiten extraer una información más precisa y de forma más eficiente. En efecto, para detectar obstáculos es preferible enviar y rastrear el rebote de un pulso, esto es, de una sucesión de brevísimos destellos oscilatorios generadas mediante la orden FREQOUT (repasa la práctica del altavoz); digamos que es algo parecido al bip del sonar de los barcos, pero con luz infrarroja. Gracias a esto no sólo se gasta mucha menos energía en el emisor IR, sino que además, dependiendo de la frecuencia de las oscilaciones se podrá estimar la distancia a la que se encuentra el obstáculo. Vamos a ver de forma práctica cómo influye todo esto en la programación del detector. 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I.. 2. En el editor busca y abre el programa PruebaEco.bs2 (y si abres también ScribblerReset.bs2 tanto mejor). Este programa se distingue del anterior en varias cosas. Tras las definiciones de los puertos (líneas 26 a 34) en las líneas 39 y 40 se crean dos variables de tipo Bit —esto es, sólo pueden contener un 0 o un 1— para conocer la procedencia del último eco recogido por el sensor IR, si es que lo ha recibido: varLibreDer VAR Bit varLibreIzq VAR Bit. ' Recuerda si no hay obstaculos a la derecha ' Recuerda si no hay obstaculos a la izquierda. En las líneas 45 a 52 se desactivan todos los puertos de salida para prevenir posibles interferencias de situaciones anteriores y en la línea 53 comienza el bucle principal. La tarea básica que se debe repetir ya la conocemos: mirar primero a un lado y luego al otro para ver si hay obstáculos. Pero hay algunos cambios con respecto a la práctica anterior. El primer cambio está en que los emisores envían un brevísimo destello oscilatorio:.

(18) FREQOUT emEcoDer, 1, 38500. ' Emite un pulso de luz IR (modulado a 38,5 KHz). La frecuencia de 38500 Hz permite detectar objetos a distancias intermedias, digamos de unos 25 cm; si se aumentase o redujese este valor aumentaría o se reduciría (resp.) la distancia de detección. Inmediatamente después inspecciona el puerto del receptor IR (recuerda que en el morro sólo tiene uno). Si ha habido rebote contendrá un 0 y si no lo ha recibido continuará teniendo el 1 que tiene habitualmente (recuerda lo que comenté sobre la lógica negativa de estos dispositivos). En cualquier caso, guarda el resultado en una variable auxiliar para que no se pierda varLibreDer = reEco. ' ... y recoge el eco si lo hay. Posteriormente realiza (líneas 58 a 64) una bifurcación condicional parecida a la de la práctica anterior para encender o apagar el LED derecho según haya rebote o no. El esquema se repite de idéntica forma con el otro emisor. Como no hay dos receptores el resultado se recoge igualmente en reEco, por eso es necesario guardarlo en otra variable auxiliar varLibreIzq para que en el siguiente bucle no se confunda con el resultado del otro emisor. 3. Ejecuta el programa con Run > Run ó Ctrl+S . Si acercas la mano o, mejor aún, un objeto claro y liso verás cómo se iluminan los LEDs cuando lo detecta a uno u otro lado. Comprueba a qué distancias y ángulos la detección es más precisa. 4. Repite el apartado anterior cambiando la frecuencia de destello por los siguientes valores (uno por uno): 41500, 40500, 39500, 38250 y 37500 Hz. Recopila los resultados obtenidos en una tabla resumen. 5. Modifica el programa para que indique además por la ventana del Debug Terminal si ha detectado un obstáculo y a qué lado está. 6. Apaga el robot y responde a la siguiente cuestión. En ocasiones ocurre que con alguna de las frecuencias de destello del apartado anterior el Scribbler detecta siempre un objeto, lo haya o no. ¿Qué crees que puede estar ocurriendo? Pista: Apaga la luz. En las siguientes prácticas veremos para terminar cómo se controla el funcionamiento de los servo-motores del Scribbler. Para evitar accidentes no estaría de más que pusieras el robot sobre una caja pequeña apoyado sobre su panza de manera que las ruedas no toquen el suelo y puedan moverse libremente. Después cuando compruebes que los programas funcionan correctamente puedes ponerlo en el suelo (nunca sobre una mesa) para ver cómo se mueve.. 18 de 38.

(19) Práctica 13: Comprobación de los motores en marcha indefinida El robot Scribbler posee dos servo-motores independientes conectados a los puertos 12 (motor derecho) y 13 (motor izquierdo). En el lenguaje PBASIC se activan con la orden PULSOUT seguida de dos valores: el primero es el número de puerto del motor que se desea mover y el segundo es otro número con el que se indica la velocidad a la que debe girar. Así por ejemplo, la orden PULSOUT 13, 2500. hace moverse al motor izquierdo con una velocidad de 2500 unidades. Desafortunadamente, a cuántos metros por segundo o vueltas por minuto corresponden esas 2500 unidades de velocidad (lo abreviaremos como udv) depende grandemente de la estructura física del motor, de la transmisión y de la controladora. Para nuestro robot lo único que se puede decir es que dicho número debe estar comprendido entre 1000 y 3000 udv, que corresponden a los siguientes comportamientos: - A 3000 udv el motor gira en sentido directo lo más rápido que puede. - A 2000 udv el motor está detenido. - A 1000 udv el motor gira en sentido inverso lo más rápido que puede. Naturalmente, valores intermedios proporcionan velocidades intermedias. En el caso anterior, el motor izquierdo se pondrá a girar en sentido directo a media velocidad. Es completamente posible hacer que una rueda gire a una velocidad y la otra a una distinta: así es como se consigue que el robot se desvíe hacia un lado o al otro o que rote sobre sí mismo. Vamos a verlo enseguida. Por último, y antes de comenzar con la práctica conviene que sepas que antes de ponerlos en funcionamiento, los motores del Scribbler necesitan recibir una secuencia de inicialización que consiste en una señal baja y una pausa de 100 ms: LOW 12 LOW 13 PAUSE 100. ' Patilla del motor der a 0 volt ' Patilla del motor izq a 0 volt ' Da tiempo para que reaccionen. Hay más cosas que decir acerca de los motores, pero lo haré en otras prácticas. De momento comenzaremos con esta. 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca y abre el programa PruebaMotores1.bs2 (y si abres también ScribblerReset.bs2 tanto mejor). Observa las dos definiciones de constantes (CON) que aparecen en las líneas 32 y 33: Vizq Vder. CON 2800 CON 2500. ' Velocidad de la rueda izquierda ' Velocidad de la rueda derecha. Las constantes son datos como las variables pero cuyo valor se mantiene fijo a lo largo de todo el programa, de ahí su nombre (observa que no es necesario hacer la reserva previa de espacio). En este caso hemos definido las velocidades de ambas ruedas; como la izquierda gira más deprisa que la derecha, el robot describirá una curva hacia ese lado..

(20) El programa propiamente dicho comienza inicializando los dos motores (líneas 41 a 44) y enviando a cada motor la correspondiente orden PULSOUT para que se mueva. La rueda izquierda gira algo más deprisa que la derecha, así que cuando lo dejemos en el suelo el robot se moverá describiendo un círculo en sentido horario. 3. Manteniendo el robot en volandas ejecuta el programa con Run > Run ó Ctrl+S y verifica que ambas ruedas giran en la forma indicada. 4. Apaga el robot, desconéctalo del ordenador, colócalo en el suelo y vuelve a encenderlo. Comprueba que se mueve en círculos. 5. Apaga el robot, vuelve a situarlo sobre su apoyo, enciéndelo de nuevo y carga el programa ScribblerReset.bs2 para que se detenga. 6. Modifica el programa PruebaMotores1.bs2 para que el Scribbler se mueva en círculos en sentido antihorario. Cuando hayas comprobado que funciona, guarda el programa modificado con el nombre PruebaMotores1a.bs2 (no te olvides de apagar el robot). 7. Modifica el programa PruebaMotores1.bs2 para que el robot se mueva en línea recta hacia delante a la máxima velocidad posible. Cuando hayas comprobado que funciona, guarda el programa modificado con el nombre PruebaMotores1b.bs2 8. Modifica el programa PruebaMotores1.bs2 para que el Scribbler se mueva marcha atrás, en círculos antihorarios. Cuando hayas comprobado que funciona, guarda el programa modificado con el nombre PruebaMotores1c.bs2 9. Modifica el programa PruebaMotores1.bs2 para que el robot avance en línea recta durante dos segundos y después indefinidamente en círculos horarios. Cuando hayas comprobado que funciona, guarda el programa modificado con el nombre PruebaMotores1d.bs2 Como habrás podido observar, esta forma de programar los motores del Scribbler presenta un problema muy importante: los motores se quedan indefinidamente en la última pareja de órdenes PULSOUT que se les dé y no hay manera de pararlos. Ciertamente sería posible detenerlos con PULSOUT 12, 2000 PULSOUT 13, 2000. pero esa no es una buena solución porque, aunque no giren, los motores permanecen activos y pasando corriente por ellos. En la siguiente práctica vamos a ver otra manera más potente de programarlos que resuelve este problema. 20 de 38.

(21) Práctica 14: Comprobación de los motores en marcha programada Es posible hacer que los motores del Scribbler giren durante un tiempo predefinido y luego se detengan o hagan otra cosa utilizando una combinación de órdenes que ahora veremos. Esto es muy útil no sólo porque proporciona una manera eficaz de parar los motores sino porque permite realizar maniobras complejas enlazando varias maniobras simples. Para ello se debe enviar a cada motor un grupo de tres órdenes como este: PULSOUT 12, 2200 PAUSE 1 PULSOUT 12, 1800. La primera orden le dice al motor (en este caso, el derecho) que gire a 2200 udv, la segunda le pide que espere a recibir otra orden, la tercera es la que establece el tiempo que permanecerá girando, que en este caso es 1800 unidades de tiempo (lo llamaremos udt para abreviar). Tal como ocurría con las velocidades, la correspondencia entre udt y segundos es distinta para cada máquina y controladora; no obstante, para el caso concreto del Scribbler hay una hay una ecuación bastante exacta que nos relaciona ambas de forma muy sencilla: T[udt] = 1000 + 40×T[dseg]. o, lo que es lo mismo,. T[dseg] = (T[udt] – 1000)/40. Así pues, el motor anterior estará girando durante (1800–1000)/40 = 20 décimas de segundo, o sea, 2 segundos, y luego se detendrá. Se toma como unidad de tiempo la décima de segundo en vez de el segundo porque a la controladora BS2 le resulta más cómodo trabajar con números enteros que con decimales. Vamos a verlo en la práctica:. 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca y abre el programa PruebaMotores2.bs2 (y si abres también ScribblerReset.bs2 tanto mejor). Observa en las líneas 50 a 56 cómo se envían las órdenes de marcha programada a los motores; pese a lo que pudiera parecer, no se mueve primero un motor y luego otro, sino ambos a la vez. 3. Manteniendo el robot en volandas ejecuta el programa con Run > Run ó Ctrl+S y comprueba que ambas ruedas giran en la forma indicada. 4. Modifica el programa PruebaMotores2.bs2 para que el Scribbler rote (es decir, gire sobre sí mismo sin moverse donde está) en sentido antihorario durante un segundo. Cuando creas que ya está hecha la modificación, apaga el robot,.

(22) desconéctalo del ordenador, colócalo en el suelo y vuelve a encenderlo. Si funciona como se pide, apágalo y guarda el programa modificado con el nombre PruebaMotores2a.bs2, si no funciona bien, ponlo sobre su apoyo, vuelve a conectarlo y revisa el programa. 5. Ajusta el tiempo en el programa PruebaMotores2a.bs2 para que el Scribbler se dé media vuelta, es decir, rote exactamente 180º. Cuando lo consigas, guarda el programa modificado con el nombre PruebaMotores2b.bs2 y apaga el robot. 6. Vuelve a cargar el programa de la práctica anterior, PruebaMotores1.bs2, y modifícalo para que el robot describa un arco de 90º. Cuando lo consigas, guarda el programa modificado con el nombre PruebaMotores2c.bs2 y apaga el robot. 7. Modifica el programa PruebaMotores2.bs2 para que el Scribbler avance en línea recta a toda velocidad durante 6 segundos. Guarda el programa modificado con el nombre PruebaMotores2d.bs2 y ejecútalo en el suelo. Con una cinta métrica mide la distancia recorrida y calcula su velocidad en cm/min. Apunta este dato porque lo vas a necesitar. 8. Modifica el programa del apartado anterior para que el robot avance 60 cm. No debes hacerlo por tanteo sino calculando el tiempo a partir de la velocidad hallada anteriormente. Comprueba con la cinta métrica que efectivamente ha avanzado 60 cm y busca explicaciones a los errores que se hayan podido producir. Guarda el programa modificado con el nombre PruebaMotores2e.bs2 9. Modifica el programa PruebaMotores2.bs2 para que el Scribbler describa un cuadrado de 60 cm de lado. Observa que tienes que hacer ocho maniobras: cuatro avances rectos y cuatro rotaciones de 90º. Cuando lo tengas, guárdalo con el nombre PruebaMotores2f.bs2 y ejecútalo en el suelo. Comprueba que el robot vuelve al punto de partida o, mejor aún, si tienes un rotulador grueso pónselo en el agujero que tiene en el lomo y haz que lo dibuje sobre un papel suficientemente grande. 10. Carga y ejecuta en el robot el programa de reinicio ScribblerReset.bs2 y apágalo. Si repites alguno de los apartados anteriores te darás cuenta de que las velocidades y tiempos de maniobra varían apreciablemente, dependiendo del estado de las pilas, del suelo, de las ruedas, de lo bien o mal engrasados que estén los ejes, etc. Es prácticamente imposible predecir estas desviaciones, por lo que necesitaremos usar los sensores del robot para que compruebe dónde está realmente y corrija su posición.. 22 de 38.

(23) Práctica 15: Verificación del detector de bloqueo de los motores No es raro que al moverse el Scribbler se tope con algún obstáculo que impida el movimiento de uno o de sus dos motores. Es inaceptable que ocurra esto porque cuando un motor eléctrico se bloquea es muy probable que su circuitería interna se averíe de forma irreparable en poco tiempo. Para evitarlo el Scribbler posee un detector de bloqueo conectado al puerto 7 que se activa cuando alguna de las ruedas (o ambas) está moviéndose y se bloquea. Es por tanto muy conveniente añadir a los programas de movimiento una orden (generalmente una bifurcación condicional) que compruebe periódicamente dicho detector y haga algo cuando se atasque. Veámoslo: 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca y abre el programa PruebaBloqueo.bs2 (y si abres también ScribblerReset.bs2 tanto mejor).. La parte principal de este programa está en la estructura IF...THEN...ELSE...ENDIF dentro del bucle DO...LOOP. Concretamente, es en la línea 55 donde se comprueba el estado del detector de bloqueo IF (reBloqueo = verdadero) THEN. y se bifurca en un sentido o en otro según cual sea el resultado. Pero hay además en esta práctica unas cuantas cosas que, aun siendo accesorias, merecen la pena comentarlas. La primera está en la línea 33 verdadero. CON. 1. y no es más que la definición de una constante aritmético-lógica: cada vez que el intérprete vea en el programa la palabra verdadero la sustituirá por el número 1. Es simplemente una cuestión de comodidad. En las líneas 35 a 38 se hace una serie de operaciones para establecer la velocidad de los motores. Primero se fija la velocidad como un porcentaje de su valor máximo, Vpc. CON. -75. Esto quiere decir que los motores van a girar en sentido inverso (signo –) y al 75% de la velocidad máxima. Naturalmente, a Vpc se le puede dar cualquier valor comprendido entre –100 y +100. Después se declara la variable Vudv como un número entero que ocupa dos bytes.

(24) Vudv. VAR. Word. y seguidamente se convierte la velocidad de porcentaje a udv aplicando la siguiente fórmula Vudv = 2000 + (10*Vpc). ' Se convierte la velocidad en udv (aprox). Esa es una fórmula aproximada que sólo sirve para el robot Scribbler y siempre que no se usen porcentajes cercanos a +100, a –100 ó a 0. Para este caso proporciona una velocidad de 1250 udv. En caso de duda conviene no usarla. En definitiva, con este programa el robot se mueve marcha atrás al 75% (aprox.) de su velocidad máxima PULSOUT emMotorDer, Vudv PULSOUT emMotorIzq, Vudv. y al mismo tiempo comprueba periódicamente el detector de bloqueo, informando por el Debug Terminal de su estado. 3. Carga el programa en el Scribbler y ponlo en el suelo sin desconectar el cable. Según marcha hacia atrás pon un obstáculo que lo bloquee y comprueba cómo cambia el mensaje en el terminal. Cógelo y apágalo antes de que se suelte el cable. 4. Modifica el programa anterior para que camine marcha atrás cuando está libre y se detenga cuando esté bloqueado. Guárdalo como PruebaBloqueo2.bs2 Con esto hemos terminado de ver cómo se programan todos los dispositivos del Scribbler. En las siguientes prácticas aprenderemos a utilizarlos todos juntos en programas más complejos. 5. A modo de resumen, vas a crear un programa resumen llamado PruebaTodo.bs2 que compruebe uno por uno todos los dispositivos del Scribbler. En concreto, debes hacer que el robot active y desactive los tres led, el altavoz, los tres foto-sensores, los dos detectores de líneas, el detector de obstáculos, los dos motores y el detector de bloqueo, informando desde el Debug Terminal de por dónde se llega.. 24 de 38.

(25) Práctica 16: Programación con subrutinas I Como habrás podido ver, existen ciertos bloques de operaciones que se realizan constantemente en todos los programas e incluso en el mismo programa varias veces. Sería conveniente poder reunir cada uno de estos grupos bajo un nombre de manera que cada vez que se invocara ese nombre se realizaran todas las operaciones que agrupa. Eso se hace en PBASIC mediante unas estructuras llamadas subrutinas.. Por ejemplo, las tres órdenes que inicializan los motores se usan constantemente, así que vendría bien agruparlas en una subrutina llamada ArrancaMotores . Eso se hace así: ArrancaMotores: LOW 12 LOW 13 PAUSE 100 RETURN. ' Subrutina para inicializar los motores ' Patilla del motor der a 0 volt ' Patilla del motor izq a 0 volt ' Da tiempo para que reaccionen. Observa que se ha añadido al principio una línea con el nombre de la subrutina, seguido de dos puntos y al final otra línea con la orden RETURN . Con esto, cuando se precise inicializar los motores bastará con escribir una línea con esto: GOSUB ArrancaMotores. y se ejecutarán las tres operaciones de inicialización. Vamos a verlo en la práctica: 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca y abre el programa PruebaGosub1.bs2 (y si abres también ScribblerReset.bs2 tanto mejor). A partir de la línea 69 están las definiciones de tres subrutinas utilizadas en la parte principal del programa. La primera se llama ArrancaMotores y ya la conocemos; la segunda es esta MueveMotores: PULSOUT emMotorDer, Vder PULSOUT emMotorIzq, Vizq RETURN. ' Subrutina para mover los motores indefinidamente ' Mueve el motor derecho ' Mueve el motor izquierdo.

(26) Cada vez que se la llame ( con GOSUB MueveMotores ) la subrutina utilizará los valores de Vder y Vizq que haya en ese momento, es decir, en la primera llamada (línea 58) Vder = 3000 : Vizq = 2500 GOSUB MueveMotores. usará una Vder de 3000 udv y una Vizq de 2500 udv, pues esos son los valores que se les ha dado en la línea anterior (los dos puntos sirven para escribir dos órdenes en una misma línea). Pero en la segunda llamada (línea 61) Vder = 2000 : Vizq = 2000 GOSUB MueveMotores. usará una Vder de 2000 udv y una Vizq de 2000 udv. Gracias a esto, con la misma subrutina se pueden realizar distintos movimientos. La tercera subrutina AvisaError se explica por sí misma. Tan solo queda por comentar algo ajeno a las subrutinas que se encuentra en la línea 54 vfAtascado = IN7. ' Comprueba el detector de bloqueo. En ella se recoge lo que hay en el puerto de entrada número 7 (el del detector de bloqueo) y se guarda en la variable valAtascado que, por cierto, es de tipo Bit , por lo que sólo puede contener un 0 ó un 1. Habría sido más cómodo usar una definición reBloqueo. PIN. 7. ' sensor de bloqueo. y luego haber hecho la asignación vfAtascado = reBloqueo. ' Comprueba el detector de bloqueo. pero en ocasiones se usa esta otra forma más breve. 3. Carga el programa en el robot con Run > Run ó Ctrl+S y en cuanto empiece a funcionar apágalo. Desconéctalo del ordenador y ponlo en el suelo, vuelve a encenderlo y, si fuera necesario pulsa el botón rojo. Observa cómo se detiene al encontrar un obstáculo en su camino y continúa la marcha cuando el obstáculo desaparece. 4. Vuelve a conectar el robot al ordenador, ejecuta el programa de reinicio (varias veces si es necesario) y apágalo.. 26 de 38.

(27) Práctica 17: Programación de movimientos mediante subrutinas En esta práctica vamos a utilizar una subrutina muy útil para encadenar fácilmente movimientos con el robot. La subrutina se llama MueveMotores y es una ampliación de la que usamos en la práctica anterior. Para usarla es necesario haber definido y asignado valores a tres variables: las velocidades Vpcder y Vpcizq en forma de porcentajes y el tiempo de marcha Tds en décimas de segundo. Por ejemplo, Vpcder = 30 : Vpcizq = 70 : Tds = 45 GOSUB MueveMotores. mueve el motor derecho al 30% de la velocidad máxima y el izquierdo al 70% durante 4,5 segundos. Enlazando varios bloques como este se pueden obtener movimientos muy complejos sin gran esfuerzo. Vamos a verlo: 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca y abre el programa PruebaGosub2.bs2 (y si abres también ScribblerReset.bs2 tanto mejor).. La parte principal del programa está en el bucle FOR...NEXT , entre las líneas 49 y 60. Allí se hacen tres llamadas a MueveMotores cada una con distintos valores para las velocidades y el tiempo; el resultado es un movimiento en tres etapas que se repite tantas veces como indique el bucle. La subrutina MueveMotores (líneas 75 a 90) se puede dividir en tres partes: primero se transforman los porcentajes de velocidad y las décimas de segundo a las unidades propias del motor: Vder = 2000 + (10 * Vpcder) Vizq = 2000 + (10 * Vpcizq) Tudt = 1000 + (40 * Tds). ' Velocidad del motor derecho en udv ' Velocidad del motor izquierdo en udv ' Tiempo (en udt) que van a girar los motores. en la segunda parte se realiza un movimiento programado de los dos motores PULSOUT emMotorDer, Vder PAUSE 1 PULSOUT emMotorDer, Tudt. ' Mueve el motor derecho.

(28) Con el motor izquierdo hace lo mismo; y en la tercera parte se realiza una pausa para darle tiempo a terminar PAUSE Tds * 70. ' Se detiene un poco para coger fuerzas. Vamos a ejecutar el programa para ver si funciona. 3. Carga el programa en el robot con Run > Run ó Ctrl+S y en cuanto empiece a funcionar apágalo. Desconéctalo del ordenador y ponlo en el suelo en una zona despejada, vuelve a encenderlo y, si fuera necesario pulsa el botón rojo. Observa cómo realiza los cinco movimientos de tres etapas. 4. Modifica el programa anterior para que el robot trace en el suelo una letra B haciendo que regrese al mismo sitio y en la misma posición de partida. Guárdalo con el nombre PruebaGosubB.bs2 5. Rehaz el programa que trazaba un cuadrado en el suelo (PruebaMotores2f.bs2) para que haga lo mismo usando subrutinas. Guárdalo con el nombre PruebaGosubC.bs2. 28 de 38.

(29) Práctica 18: programación con subrutinas II En esta práctica vamos a ampliar y mejorar el programa PruebaGosub1.bs2 (práctica 16) para que, entre otras cosas, “vea” los obstáculos con los detectores IR y pueda pararse antes de chocar con ellos (programa PruebaEco.bs2). 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca y abre el programa PruebaGosub3.bs2 (ya no es necesario que abras ScribblerReset.bs2 ).. Fíjate en que el programa no tiene grandes novedades, salvo por la subrutina EsperaReset . Esa subrutina se invoca al principio de los programas de movimiento para que no arranquen inmediatamente y permanezcan a la espera hasta que el usuario pulse el botón rojo de reset . De momento, no es imprescindible que sepas cómo funciona, sino sólo cómo se usa. 3. Carga el programa en el robot con Run > Run ó Ctrl+S y observa cómo permanece en suspenso solicitándote que pulses el botón rojo. Apaga el robot, desconéctalo del ordenador y ponlo en el suelo. Pulsa entonces el botón rojo y comprueba que comienza a moverse en círculos; si pones un obstáculo en su trayectoria debería detenerse antes de chocar con él. 4. Modifica la frecuencia de barrido freqIR con valores entre 37,5 y 41,5 kHz y elige el valor que más apura la frenada sin chocar. 5. Reescribe PruebaGosub3.bs2 sin usar las subrutinas y llámalo PruebaGosub3a.bs2 . El programa será ahora más pesado de leer pero —al menos en teoría— será más rápido porque se evitan las llamadas a las subrutinas. Comprueba si eso es cierto para este caso. 6. Modifica PruebaGosub3a.bs2 para que, además de pararse, la alarma suene sólo cuando están bloqueadas, pero no cuando haya un obstáculo. Cuando lo tengas, guarda el programa con el nombre PruebaGosub3b.bs2.

(30) 7. Modifica PruebaGosub3b.bs2 para que cuando haya un obstáculo indique con los LEDs si está a la derecha, a la izquierda o a ambos lados. Cuando lo tengas, guarda el programa con el nombre PruebaGosub3c.bs2 8. Añade a los programas de las prácticas 16 y 17 la llamada a la rutina EsperaReset (y su definición al final, claro) para que no arranquen hasta que no se pulse el botón rojo.. 30 de 38.

(31) Práctica 19: Programa elemental de exploración En esta práctica vamos a hacer por fin un programa de los que utilizan los robots en la realidad. Con él el Scribbler va a ser capaz de explorar o deambular, es decir, caminar por un entorno desconocido evitando los obstáculos. En realidad ya casi lo tenemos hecho en la práctica anterior así que sólo vamos a tener que añadirle unas pocas modificaciones; la más importante consiste en hacer que los motores se vayan moviendo paso a paso según lo que les vayan indicando los sensores de infra-rojos y de bloqueo, a saber: si hay un obstáculo a un lado gira hacia el otro y si hay un obstáculo a ambos lados o se ha bloqueado, retrocede. 1. Conecta el Scribbler al ordenador y abre el Basic Stamp Editor, si no lo están. Es conveniente que verifiques la conexión pulsando Run > Identify ó Ctrl+I. 2. En el editor busca y abre el programa ScribblerEvitaObstaculos.bs2. 3. La parte esencial del programa está en la segunda etapa del bucle DO...LOOP (líneas 89 a 107). Para asegurarte de que entiendes bien lo que hace, vas a hacer lo siguiente: en la hoja de prácticas dibuja una tabla como esta vfLibreDer. vfLibreIzq. vfAtascado. Vpcder. Vpcizq. Escribe en las tres primeras columnas todas las posibles combinaciones de valores que pueden tomar las variables indicadas en la fila superior y en las dos últimas columnas los valores que toman Vpcder y Vpcizq en cada caso. 4. Ejecuta el programa con Run > Run ó Ctrl+S y observa cómo el robot permanece en suspenso solicitándote que pulses el botón rojo. Apaga el robot, desconéctalo del.

(32) ordenador y ponlo en el suelo. Pulsa entonces el botón rojo y comprueba cómo se mueve el robot y qué hace al poner obstáculos delante de él. Es normal que el comportamiento inicial del Scribbler no sea más que pasable e incluso deficiente: a veces reacciona muy lentamente, otras bruscamente, otras no detecta objetos, etc… Todos los robots necesitan una fase de ajuste y afinación para adaptarlos al entorno donde se van a mover. Es lo que haremos en el siguiente apartado. 5. Ajusta por tanteo las asignaciones de valores a Vpcder y Vpcizq que aparecen en las estructuras IF...THEN hasta conseguir un comportamiento preciso y estable. Seguramente tengas que modificar también los tiempos de pausa que necesita el robot para “coger fuerzas”. 6. Modifica el programa para que el robot se comporte de esta otra manera: si hay un obstáculo a un lado únicamente que rote un cuarto de vuelta al otro lado, si hay un obstáculo a ambos lados que dé media vuelta y si está bloqueado que retroceda. Guárdalo como ScribblerEvitaObstaculos2.bs2. 32 de 38.

(33) Práctica 20: Programa mejorado de exploración Es posible mejorar algo más el programa de deambulación aprovechando una característica de los detectores IR y otra del lenguaje PBASIC. Como ya sabes, según sea la frecuencia de la señal IR es posible detectar obstáculos a diferentes distancias; se podría por tanto enviar un grupo de cuatro o cinco pulsos de distintas frecuencias para saber no sólo si hay obstáculos sino también la distancia a la que se encuentran. Precisamente esto es lo que hace un programa llamado PruebaZonaIR.bs2 que vamos a ver antes de ponernos con la práctica. 1. Conecta el Scribbler al ordenador, abre el Basic Stamp Editor y carga el programa PruebaZonaIR.bs2 En ese programa todo es conocido excepto la línea LOOKUP cuentaFreq, [37500,38250,39500,40500,41500], freqIR. Lo que hace la orden LOOKUP es tomar la lista que está entre corchetes, seleccionar el elemento que está en el puesto cuentafreq+1 y guardarlo en la variable freqIR ; por ejemplo, si cuentafreq vale 2 tomará el número 39500 y lo guardará en freqIR . Naturalmente, los nombres de las variables pueden ser cualesquiera y la lista puede ser más larga o más corta.. De esta manera, mediante un bucle FOR cuentaFreq = 0 TO 4. se pueden lanzar sucesivamente cinco pulsos IR cada uno con las frecuencias indicadas en la lista. Si al lanzar el primer pulso (de 41,5 kHz) hay rebote entonces el obstáculo se encuentra en la zona más próxima al robot (la llamaremos zona 0), si el rebote ocurre al lanzar la segunda señal, entonces hay un obstáculo en una zona algo más alejada y así sucesivamente hasta llegar a la zona 4, que es la más lejana que produce rebote. Si no hubiera ningún rebote con ninguna de las cinco señales supondremos que no hay obstáculos o que están aún más alejados (zona 5). El cálculo de la zona se realiza sumando acumulativamente todos los no-rebotes que haya contado, así zonaIzq = zonaIzq + vfLibreIzq.

(34) No debe extrañarte que zonaIzq aparezca a ambos lados del símbolo = porque no es ninguna igualdad sino una asignación, es decir, en esa expresión se está introduciendo en zonaIzq el resultado de sumar lo que valiera antes zonaIzq más vfLibreIzq En definitiva, al terminar las cinco pasadas del bucle FOR…NEXT tendremos en las variables zonaIzq y zonaDer un número entero que indicará, de 0 a 5 y para cada lado, lo lejos que se encuentra el obstáculo, si lo hubiera. Vamos a verlo: 2. Ejecuta el programa PruebaZonaIR.bs2 y comprueba su funcionamiento acercando y alejando objetos al Scribbler. Verás cómo aparece en la ventana Debug Terminal la zona en que se encuentran esos objetos para cada sensor. 3. Ejecuta el programa PruebaZonaIR2.bs2 y compara su funcionamiento con el anterior. Cuando entiendas cómo funciona modifícalo para que reconozca sólo tres zonas —lejana, intermedia y cercana—, ajustando las frecuencias para que lo haga de manera rápida y segura. Cuando creas que ya está, guárdalo y apaga el robot. Ahora aplicaremos esta nueva herramienta para hacer que cada rueda se mueva más o menos rápido e incluso hacia atrás según lo cerca o lejos que estén los obstáculos a su lado. 4. Carga en el Basic Stamp Editor el programa ScribblerDeambula.bs2 En la primera etapa del bucle DO...LOOP no hay nada nuevo: simplemente se determina si hay obstáculos a cada lado y la zona en que se encuentran de la misma forma que en el programa anterior. Después, en la segunda etapa se calculan las velocidades (en udv) de los motores a través de las fórmulas Vizq = Vref + (zonaDer*incrV) Vder = Vref + (zonaIzq*incrV). Supón, por ejemplo, que hay un obstáculo en la zona 2 derecha y el lado izquierdo está libre. Entonces zonaDer valdrá 2 y zonaIzq valdrá 5 y, de acuerdo con esas fórmulas, el motor izquierdo girará más despacio que el derecho, por lo que el robot se desviará hacia su izquierda. Fíjate en que si el obstáculo está muy cercano la rueda opuesta irá marcha atrás y el robot retrocederá para evitar el choque. Por último, con los valores asignados a Vizq y Vder en la etapa anterior se mueven los motores durante un pequeño tiempo para después comenzar de nuevo el bucle. 5. Ejecuta el programa con Run > Run ó Ctrl+S , pon el robot en el suelo y pulsa el botón rojo. Comprueba cómo se mueve el robot y qué hace al poner obstáculos delante de él. Cada vez que termines apágalo. 6. Cambia los valores del tiempo de movimiento (1400) por 1200 y 2000 ¿Qué ocurre en uno y otro caso? ¿Por qué? Ajusta ese valor hasta obtener un comportamiento lo menos brusco posible. Anota los valores obtenidos y guarda el programa. 7. Haz una copia del programa anterior y guárdala con el nombre ScribblerDeambula2.bs2 . En ella vas a tratar de ajustar las asignaciones de valores a Vref y incrV hasta conseguir un comportamiento preciso y estable. El ajuste se hace por tanteo, pero como Vref y incrV no pueden tomar cualquier valor sería conveniente que antes de hacer ningún cambio sustituyeras la tercera etapa por esto otro DEBUG DEBUG DEBUG DEBUG. CLS "Vizq = ", DEC5 Vizq, CR "Vder = ", DEC5 Vder, CR HOME. Así podrás ver con los motores parados los valores que toman las velocidades y, cuando sean razonables, volver a poner las órdenes de marcha a los motores. Guárdalo como ScribblerDeambula0.bs2 y ejecútalo con distintos valores. Fíjate en que Vref debe tomar valores inferiores a 2000 para que cuando esté en la Zona 0 el robot retroceda lentamente. 34 de 38.

(35) 8.. Vuelve a hacer otra copia del programa ScribblerDeambula.bs2 y llámala ScribblerDeambula2.bs2 . Sustituye las fórmulas de asignación de velocidades (líneas 97 y 98) por estas otras:. LOOKUP zonaDer, [1300, 1800, 2300, 2700, 3000], Vizq LOOKUP zonaIzq, [1300, 1800, 2300, 2700, 3000], Vder. Ejecútalo, explica su funcionamiento e intenta mejorarlo ajustando los valores entre corchetes. Cuando hayas terminado, guárdalo y apaga el robot.. 35 de 38.

(36) Práctica 21: Programa de seguimiento El programa de seguimiento consiste en hacer que el robot permanezca a una distancia fija del obstáculo (pongamos por caso, en la zona 2), siguiéndolo si este se mueve, es decir, alejándose de él si está muy cerca y acercándose a él cuando esté muy lejos. Una manera muy sencilla de resolverlo consiste en modificar la asignación de velocidades del programa anterior así: Vizq = Vref + (zonaIzq*incrV) – (2*incrV) Vder = Vref + (zonaDer*incrV) – (2*incrV). El último término se añade para obligar al robot a permanecer en la zona 2. No se ha sacado factor común en incrV para evitarle problemas a la controladora con el manejo de bytes negativos. 9. Vuelve otra vez al programa ScribblerDeambula.bs2 y cambia el procedimiento de control por el del párrafo anterior. Guárdalo como ScribblerSeguidor0.bs2 y ejecútalo. Ajusta los valores de Vref e incrV para que haga honor a su nombre y explica cómo funcionan las fórmulas anteriores en cada caso posible. Como habrás podido comprobar, el robot realiza un seguimiento de los objetos más bien pobre. Para mejorarlo podemos realizar la asignación de velocidades mediante una estrategia de control incremental o por errores. Esta es una técnica muy útil y poderosa que consiste en lo siguiente: Lo primero que se hace es asignar unos valores iniciales a las velocidades y establecer una zona de referencia donde deberían permanecer siempre los obstáculos. Después se ejecuta un bucle así: – Para ambos lados, si los obstáculos se encuentran en dicha zona, no hay corrección y las velocidades permanecen en los valores que tuvieran anteriormente. – Si el obstáculo está más lejos de lo prescrito en el siguiente paso la velocidad se incrementará, y si está más cerca de lo debido, se reducirá. De este modo se espera que el robot siempre permanezca a una distancia fija del obstáculo, siguiéndolo si este se mueve. En nuestro programa eso se realiza utilizando las siguientes fórmulas: Vizq = Vizq + (Kg*ZonaIzq) – (Kg*2) Vder = Vder + (Kg*ZonaDer) – (Kg*2). donde Kg es una ganancia fija, análoga a incrV, que gradúa la severidad de la corrección y el 2 indica la zona de referencia donde se desea que estén los obstáculos. 10. Vuelve otra vez al programa ScribblerDeambula.bs2 y cambia el procedimiento de control por uno incremental como el del párrafo anterior. Debes tener en cuenta que no sólo hay que sustituir las fórmulas, sino asignar valores iniciales a las velocidades y a Kg y tener en cuenta que en todo momento Vizq y Vder deben estar comprendidos entre 1000 y 3000. Cuando lo tengas guárdalo como ScribblerSeguidor1.bs2 y ejecútalo. Ajusta los valores y reduce el número de zonas para que sea capaz de seguir un obstáculo móvil con suficiente precisión y rapidez. Comenta los nuevos problemas que surgen. 11. ¿Qué ocurriría si hiciéramos funcionar a un robot con el ScribblerDeambula.bs2 y a otro con ScribblerSeguidor.bs2 ?. programa.

Show more

Nuevo documento

Esta información procede de la capacidad de ob- servación que el médico vaya desarrollando a lo lar- go de su formación y de su experiencia, con respecto a la interpretación de las

En ese sentido, en ortopedia y traumatología se recibe un gran número de quejas, pues se trata de una de las especialidades más socorridas, debido prin- cipalmente a que los accidentes

Para prevenir la EIC tenemos que considerarla, no como un mero producto de conductas individuales de riesgo, sino como un proceso con un componente social muy importante, y disminuir su

Escribía Juan Ramón Jiménez : " Ramón del Valle-Inclán, primer fabJista de España, intentó en su obra de madurez sobre todo, una lengua total española que expresara la suma de

En 1895 el general Manuel González de Co- sío, quien era ministro de Gobernación, el doctor Eduardo Liceaga y el Ingeniero Roberto Gayol fue- ron comisionados para presentar el proyecto

Antes de examinar cómo Carpentier aplica la premisa de lo maravilloso naturalizado por la fe popular en el corpus cultural de América Latina, conviene retornar a Le miroir para observar

Un hallazgo importante fue el peso estadístico y el lugar que tuvieron las demás variables acadé- micas además del español asociadas con el éxito académico según el análisis

La introducción de la tecnología aplicada a la medicina abre nuevos horizontes para proporcionarle a nuestras pacientes una mejor calidad de vida, como realizar cirugía sin cicatriz y

RECOMENDACIONES El médico tratante debe atender las necesidades reales del paciente geriátrico y mantener buena co- municación entre el equipo de salud y los familia- res; apegarse a

Cuando el valor es mayor de 2, indica que hay un aumento de la producción en la MO, ya sea por hemólisis, hemorragia o respues- ta a agentes estimulantes de la eritropoyesis, pero