.
.
.
.
.
.
.
.
.
.
Resulta por ello que a primera vista la cosa parece sencilla. lo que nosotros queramos programar o se corresponde al diagrama tipo A o al diagrama tipo B. Claro que, hay que añadir un pequeño detalle
Las cajas de los diagramas encierran a su vez acciones que se pueden en cuadrar en uno de estos dos esquemas y así sucesivamente por ejemplo en una d sola iteración la cosa puede pudiendo llegar alcanzar este aspecto.
Sin embargo estos esquemas son fundamentales para enfrentarnos a la programación de cualquier acción por los que les dedicaré una especial atención. Decíamos en el post anterior, (y si lo ha olvidado vuelva a darse una vuelta por el post), que “Programar consiste pues, en descomponer una tarea compleja en otras más sencillas”, pues exactamente estas estructura son la forma adecuada de hacerlo. Sabemos que nuestro programa se puede encuadrar dentro de uno de estos dos esquemas.
Por ejemplo nuestro programa que v estudiamos en el artículo anterio para que el robot vaya de la cocina al salón llamado “Trasladarse_de_la_cocina_al_salon”, es un modelo claro de programa tipo B
Así pues, vamos a estudiar ambos esquemas con un poco en detalle:El esquema de tipo A se le suele llamar Programa de meni
Consta de tres módulos y una caja de decisiones El módulo superior o de inicio hará alguna cosa antes de finalizar su funcionamiento, por ejemplo una cosa típica es solicitar por pantalla introducir una una opción de menú, Finalizada esta parte, se entra en la caja de decisiones que es el rombo que está debajo, en ella se compara un valor que se ha generado como consecuencia de la actividad en el módulo de inicio, con otro valor que puede también haber sido generado en el modulo inicial o ser un valor fijo.
Supongamos que en nuestro, caso el valor generado en el modulo inicial fuera el valor introducido por es usuario en una pantalla y el valor con el que se compara es un “1”, las comparaciones son solo de tres tipos, igual (=), menor (<)” o “mayor” (>). Supongamos que en nuestro caso la comparación que programamos es “igual”.
Si el valor introducido en el proceso de inicio fue “1” al comparar con el parámetro fijo “1” da si y se ejecuta el Programa A, en el caso que se hubiera introducido otro valor se ejecutará el Programa B.
El esquema tipo B se suele llamar esquema repetitivo
Consta igual que el anterior, de tres módulos un “Módulo de inicio” donde se efectúan una serie de labores previas que solo se efectuarán una vez, un Módulo Proceso en el que uno de las instrucciones consistira en modificar el valor de una variable que cuando acaba el “Módulo proceso” pasa a una caja de decisiones en la que cuando la comparación da como respuesta “no”, manda repetir nuevamente el Modulo proceso de cabo a rabo y volver a repetir la comparación, hasta que la respuesta es “si” que finaliza las repeticiones entrando en un “Módulo fin” donde se realizan una serie de labores que solo se efectúan una vez al finalizar el proceso.
En nuestro caso el Modulo de Inicio será “Salir de la cocina” algo que solo se hace una vez, el Módulo proceso será “Dar un paso en el pasillo” que se repetirá tantas veces hasta que el módulo detecte que ha entrado en el salón, donde dejara de dar pasos por el pasillo y por último se ejecutará el Modulo fin que solo se repite una vez que en nuestro caso será “Entrar en el salón”
Cono dijimos y volvemos a repetir “Programar consiste pues, en descomponer una tarea compleja en otras más sencillas”, la tare inicial la hemos descompuesto en tres módulos que son independientes entre si, cada uno tiene un principio y un fin y suponiendo que el resto de los módulos funcionen correctamente, bastará que seamos capaces de resolver correctamente el que estamos construyendo para que todo el sistema funcione.
Como el proceso de descomponer un programa es iterativo, si el módulo que estamos construyendo no le sabemos resolver, lo descomponemos en un módulo del tipo A, o del tipo B, según convenga, con lo que el modulo irresoluble se ha transformado en tres submódulos que serán mucho más sencillos, por tanto mucho más fáciles de construir.
Hay otro concepto que conviene tener claro relacionado con los módulos, Observarán que hasta ahora hemos hablado solo de las cajas, o módulo pero no hemos hablado de las líneas que los unen. Hay en informática dos conceptos tan sencillos como estos que hasta ahora hemos hablado, que es el concepto de “Fase” e “Interfase”, Fase es la parte del programa capaz de alterar el valor de los datos, en una palabra, las cajas que hemos llamado Módulos, en ellos, los datos se alteran mezclan, generan, suman etc., de acuerdo con unas reglas, o algoritmos que hemos programado, pero en el transcurso de esos procesos los datos han adquirido valores que son resultados intermedios, que otros módulos necesitarán para su buen funcionamiento. Hay por tacto que guardarlos para su uso posterior en algún lado, allí donde se guarden son las interfases es decir elementos que pasan de un programa al siguiente sin modificarse y que en el esquema hemos pintado como una línea que une la salida de un módulo con la entrada en otro.
Esas interfases pueden ser de diferentes tipos, una es la misma memoria del ordenador, que guarda valores intermedios que se van a utilizar posteriormente. Como esa memoria sólo se mantiene mientras el ordenador esté en marcha y mientras no se utilice para otra cosa, normalmente solo se utiliza para pasar valores de un módulo al módulo siguiente. Pero hay otros datos que conviene guardar incluso si el ordenador se apaga por ejemplo los datos contables, los nombres de los clientes o por ejemplo en robótica la ruta que va siguiendo el robot. Estos datos se conservan en memorias no volátiles, como puede ser el disco duro, en estructuras de datos que van desde los registros de un fichero a Bases de datos y sobre soportes que pueden ser el disco duro del Ordenador, que es el más habitual, pero tambien un CD o un PenDriver.
Así pues cuando estemos diseñando un programa habremos de tener en cuenta donde guardaremos todos los valores que por un motivo o por otro van a utilizarse en otros módulos y nos tendremos que preocupar en cada módulo de leerlos, utilizarlos y actualizarlos para que el siguiente módulo que los utilice se encuentre la última versión de los mismos.
Y ya esta con estas nociones básicas me siento capaz de hacerle comprender poco a poco las complejas instrucciones que hay que introducir para que un robot haga cosas como tocar el violín.
El siguiente robot es un rastreador de luz específicamente diseñado a tal efecto y su única tarea es encontrar un punto de luz dentro de su ángulo de detección de 180º frontales y dirigirse lo mas rápido posible hacia tal fuente de luz.
Dispone de 3 sensores de luz LDR dispuestos en ángulo de 60º los unos de los otros y metidos en una bocina dividida en 3 partes y echa al efecto con cartulina negra para evitar que la luz ambiente afecte a la buena detección de la fuente de luz a encontrar, también dispone de 3 circuitos comparadores analógicos de tensión en torno a amplificadores operacionales en modo comparador y lógica digital programable (a mano) en torno a circuitos integrados de la serie 74, el driver controlador de los motores es un ULN2003 con lo que se controla el encendido de los dos motores independientemente, al usar el ULN2003 no se dispone de control de dirección de giro y las ruedas en ningún caso correrán hacia atrás, por ultimo y terminar con la descripción, e usado una base móvil con dirección de giro diferencial (tipo tanque) construida a partir de 2 kits motorizados 4x4 a escala 1/32 de camiones de mina que comercializa TAMIYA, como los motores actúan sobre las dos ruedas de un costado e juntado dos camiones y ahora cada motor de cada camión actúa sobre un lado con lo que ya tenemos el sistema diferencial de dirección. La alimentación de la parte lógica de control es mediante una pila de 9V y la parte de potencia y motores es mediante las mismas pilas que trae cada camión compuesta por 2 pilas LR6 de 1,5 V, estos dos grupos de pilas los e conectado en paralelo para disponer de mas corriente y que se agoten por un igual los dos grupos de pilas, como puede deducirse los motores son de 3V cada uno y gastan una media de 400mA aunque el pico de arranque es bastante elevado y ronda 1 Amperio.
Funcionamiento: Paso ahora a describir el funcionamiento del circuito principal del robot que contiene la lógica digital compuesta por circuitos integrados de la serie 74xx, el diseño del circuito es tal que se puede programar de manera manual y sin tener grandes conocimientos de electrónica digital, mediante cableado entre los conectores J7 y J6. De esta manera seremos nosotros mismos los que programemos la actitud del robot según las condiciones o eventos externos captados por los sensores, como se verá mas adelante la configuración optima de la parte programable no la describo y no puede verse en ninguno de los esquemas, no obstante estará explicado de una forma muy sencilla y completa el modo de hacerlo y cada cual tendrá que programarse el robot a gusto ya que de esta manera será mas satisfactorio el montaje de este robot y de paso aprenderemos un poco sobre circuitos digitales simples.
Sensores: El siguiente esquema muestra el circuito utilizado para poder ajustar la sensibilidad o histerisis del nivel luz a detectar y de este modo poder dejar fuera de acción a la luz ambiente u otras posibles fuentes de luz.
El funcionamiento de este circuito es como sigue; como ya sabemos, la LDR varia su resistencia interna en función de la luz que incide sobre ella, a mas luz menos resistencia y viceversa, si nos fijamos en el circuito anterior veremos que lo que se a hecho es un divisor de tensión simple en base a dos resistencias, una de ellas es la LDR que variara su valor en función de la luz y la otra es una resistencia fija de 10K, al variar la LDR de valor lo que también hará es variar la tensión en el punto intermedio entre las dos resistencias, con lo que ya tenemos un nivel de tensión proporcional a la luz. Seguidamente lo que se hace es comparar el nivel de tensión proporcionado por el conjunto divisor de tensión LDR-Resistencia con otra tensión variable esta vez obtenida de un potenciometro, el amplificador operacional lo que hace es activar su salida o desactivarla en función de si los valores en su entrada positiva es igual o mayor al de su salida negativa, de este modo podemos ajustar el nivel de histeris del circuito es decir con que valor mínimo de luz se activara su salida.
Como también podemos observar, en la salida del amplificador operacional se a dispuesto un diodo LED para tener una indicación de visual del estado de salida del circuito y de este modo poder ajustar fácilmente sin instrumento externo alguno, también se a dispuesto un jumper en el caso que no queramos que los leds luzcan una vez ajustado el circuito.
El robot consta de dos circuitos idénticos como este, como cada uno maneja dos LDR en total serian 4 pero como en este caso tan solo necesitamos 3 sensores LDR podemos dejar sin montar media parte de uno de los circuitos si así lo creemos conveniente (aunque teniendo en cuenta el bajisimo precio de los componentes que lo forman no vale la pena).
Lógica de control 1/2: Aquí tenemos la mitad del corazón del sistema lógico de control que se describirá en dos partes como ya habréis intuido.
El problema principal que se me planteaba en el diseño de este robot era el uso de 3 sensores LDR ya que no podía hacerlo tan simple como si hubiese sido con 2 LDR, aunque ni que decir de las ventajas de usar 3 sensores en la practica. Pues bien al pensar un poco y hacer unos bocetos sobre papel se me ocurrió (lo que a todo el mundo con un mínimo de electrónica digital jeje) que 3 LDR equivalían a 8 posibles estados de salida en conjunto, bien esta parte ya la tenemos pensada, ahora queda el que hacer con estos 8 posibles estados, en forma binaria no nos son muy útiles a no ser que usemos un microcontrolador o sistema complejo con lo que la siguiente fase será convertir los 3 bits binarios en 8 salidas independientes y para tal efecto usaremos el circuito integrado 74LS138 que es un conversor BCD-Decimal de 3 bits y nos viene al dedillo para este caso, las salidas de este integrado son pull-up y se activan a nivel bajo (siempre están a 5V menos cuando se activa la salida que pasa a ser 0V o GND).
Pues bien esta parte del circuito ya la tenemos echa, o casi.. os habréis fijado en que e puesto unos disparadores trigger schmitt tipo 74LS14 en las entradas, pues bien esto es debido a que los amplificadores operacionales LM358 no dan mas que 3,3 V a sus salidas y si los dirigiésemos directamente al 74LS138 este ni se enteraría de los niveles lógicos y tomaría todo como 0, hay otros operacionales que dan a su salida lo mismo que su alimentación pero bueno esto ya esta echo y funcionando :)
Lógica de control 2/2: Pues bien aquí tenemos la segunda parte del circuito de control y el problema ahora es que tenemos 8 salidas del 74LS138 y solo 2 motores que actuar, así que nos sobran unas cuantas salidas no?, y como vamos a poder hacer que en un determinado estado de entrada se active tal motor?.
Vamos a analizarlo ahora del revés, tenemos 2 motores, el control que vamos a tener sobre ellos va a ser tal que solo podamos activarlos o desactivarlos en una dirección con lo que para girar el robot mantendrá un lado frenado mientras las otras ruedas giraran (como un tanque) el radio de giro de este sistema es mas grande que haciendo girar un lado en un sentido y el otro lado en otro sentido, pero como es mas sencillo usaremos lo primero. Para controlar los motores usaremos un circuito integrado driver especifico para motores modelo ULN2003 que es suficiente para pequeños motores de juguetería. Bien ahora lo tenemos asi; el motor tiene 2 cables, uno de ellos lo llevamos a Vcc y el otro lo hacemos pasar por el driver que actuara como un interruptor y activara o no el motor, ahora tenemos 2 cables para el control de los 2 motores, 2 cables son 4 posibles estados; Adelante, Giro derecha, Giro izquierda, Parado, de esta manera tenemos un control simple de todas las posibles acciones del robot.
Para solucionar el problema planteado anteriormente sobre las 8 salidas y los 2 motores.. pues nada mas fácil que un codificador de prioridad o conversor Decimal-BCD, en este caso un 74LS147 que dispone de 9 entradas independientes y una salida binaria de 4 bits equivalente a la entrada activa, para activar los motores usaremos (tal como se ve en el esquema) solamente las salidas A y B, las entradas del codificador de prioridad se han puesto a pull-up mediante resistencias y se activaran a nivel bajo, recordemos que el 74138 activaba sus salidas a nivel bajo también, con lo que los 2 integrados se acoplan entre si a la perfección.
En el esquema también podemos ver el regulador de tensión en torno a un 7805 que regulara a +5V los +9V obtenidos de la pila que alimenta el circuito.
Montaje: El robot consta en total de 3 placas de circuito impreso, dos para los sensores y una con la lógica de control, conectadas entre si tal como puede verse en la siguiente figura:
La siguiente parte que tenemos que hacer es una especie de bocina plana de 180º en total dividida en 3 sectores a 60º en donde ubicaremos las LDR. tal como puede verse en la foto de la derecha. En mi caso el sector central lo e estrechado con tiras de cartulina negra para así tener una mejor detección de lo que realmente es el frente (en esta foto no están puestas tales tiras). Esto se debe de probar sobre la marcha una vez el robot ya funcione y hagamos diferentes pruebas.
Programación: Llegados a esta fase supongo que ya tendréis montado el robot por completo y solo os quedara la programación del circuito.
La tabla de la verdad del circuito integrado 74LS138 es la siguiente:
Input | Output | Estado de los sensores | ||
---|---|---|---|---|
C | B | A | /Q=L | |
0 | 0 | 0 | 1 | Luz en todos |
0 | 0 | 1 | 2 | |
0 | 1 | 0 | 3 | |
0 | 1 | 1 | 4 | |
1 | 0 | 0 | 5 | |
1 | 0 | 1 | 6 | |
1 | 1 | 0 | 7 | |
1 | 1 | 1 | 8 | Oscuridad total |
y como puede verse cada combinación de entrada de los sensores LDR equivale a que una de las salidas del integrado tome el valor lógico bajo. Tendremos en cuenta para la programación que las señales provenientes de las LDR son invertidas al pasar por el trigger schmitt con lo que en ausencia de luz captaremos todas las entradas a nivel lógico alto. Como puede verse hay dos campos rellenados correspondientes a oscuridad y luz en todos los sensores, los demás deberán de rellenarlos cada cual ya que de esta manera será mas divertido y satisfactorio el trabajo. Los números de salida equivalen a cada pin del conector J7 del circuito de control.
En la siguiente tabla de la verdad podemos ver la equivalente al circuito integrado 74LS147 codificador de prioridad, que como vemos saca un valor binario equivalente a la entrada que tiene puesta a nivel bajo.
/Entrada | /Salida | ||||||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | D | C | B | A | Descripción. |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | todas al aire |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | |
1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | Parado |
1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | |
1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | |
1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | |
1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | Parado |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
Como podemos observar las salidas C y D están representadas en un color mas apagado ya que en no se usan en este montaje para nada y no se tienen en cuenta. También podemos observar que no está rellenada la descripción de lo que harán los motores en todos los casos posibles y como en el la tabla anterior será tarea de cada uno averiguarlo :) aunque en este caso es mas fácil ya que teniendo el circuito alimentado y probando con un cablecito conectado a masa podremos ver lo que hacen los motores cada vez que pinchamos el cable en una posición de conector J6 (cuidado de no poner mas de un cable a masa o hacer contactos entre pines adyacentes). La primera posición cuya descripción es "todas al aire" corresponde al caso en que no tengamos ningún calecido puesto y estén todos los pines de J6 al aire con lo que en realidad estarán a Vcc por las resistencias de polarización y por lo tanto los dos motores se moverán hacia delante.(si lo hiciesen hacia atrás seria un problema del cableado de los motores y habría que invertir los polos de estos para invertir el giro de estos)
Creo que es bastante fácil encontrar las combinaciones para programar el robot y que haga lo que queramos pero de todas formas si alguien encontrase demasiadas complicaciones se puede poner en contacto conmigo y le mandaría la forma mas correcta de funcionamiento. He aquí un diseño super simple para montar un rastreador de líneas básico con 2 sensores CNY70 y componentes discretos de fácil compra en cualquier comercio de electrónica.
En el esquema mostrado se puede apreciar como funciona el circuito, el led emisor del sensor CNY70 se alimenta a través de una resistencia R1 de 680 Ω, cuando una superficie reflectante como el color blanco de la superficie por donde se moverá el rastreador, refleja la luz del led emisor, el fototransistor contenido en el sensor CNY70 baja su resistencia interna entre Colector y Emisor con lo cual conduce la corriente que hace que también entre en conducción el transistor Q1 que estaba polarizado a masa por medio de la resistencia R2 de 10 KΩ. Q2 sirve para invertir la señal para que de este modo se desactive el motor cuando ve blanco y se ponga en marcha cuando ve negro el sensor, con lo que al activarse Q1 hace que se active Q2 cortando a Q3 con el, ya que este ultimo estaba activo porque esta polarizado por R3, con lo cual lo que a pasado es que la salida del motor se a desactivado cuando el sensor a detectado una superficie reflectante, en estado de reposo la salida estará siempre activa y Q3 conduciendo. Los 2 circuitos se pueden alimentar con 4 pilas normales de 1,5V puestas en serie con lo que se obtienen 6V, dependerá del consumo de los motores elegir pilas o baterías mas potentes.
Montaje: El robot se compondrá de un circuito que podremos hacer fácilmente con una placa de topos o de prototipos o usando los fotolitos expuestos y este tendrá dos circuitos exactamente iguales uno para cada sensor-motor e irán cruzados con lo que el sensor izquierdo actuara sobre el motor derecho y el sensor derecho sobre el motor izquierdo tal como se muestra en la ilustración.
Los motores tienen que ser de corriente continua y habrá que fabricarles una reductora si no disponen de ella para mover las ruedas, contra mas grandes sean las ruedas, mas velocidad alcanzara el robot, aunque no hay que pasarse con el diámetro de estas porque si no en las curvas se saldrá de trayectoria, unos 6 cm. es lo ideal.
Los sensores irán dispuestos mirando al suelo y a unos 2 o 3 mm de separación desde el suelo a la superficie del sensor y la separación entre ambos sensores será para que quede dentro de la línea negra que vayamos a usar como trayectoria. En mi montaje he utilizado dos servos trucados de manera que queden solo los motores CC con la reductora osea sin circuito de control pero se puede usar cualquier motor de CC de unos 5 o 6 voltios y que no consuma demasiado para no agotar las pilas o baterías demasiado deprisa. El trazado lo podremos hacer sobre una cartulina blanca y para trazar las líneas usar cinta aislante negra, tener cuidado en no hacer curvas demasiado cerradas ya que si el robot es muy veloz (ruedas grandes) se saldrá de la trayectoria por inercia y al sacar los 2 sensores fuera de la línea no volverá a entrar (recordemos que este sistema no es microcontrolado) por lo que haremos algunas pruebas antes de trazar el camino final.
Funcionamiento: Pondremos el robot en la superficie de fondo blanca y lo alimentaremos, como los dos sensores están activos los motores permanecerán parados, ahora empujaremos el robot hasta la línea de trayectoria negra, al entrar uno de los sensores con la línea negra este hará que el motor del lago contrario empiece a funcionar con lo que el robot entrara por si solo en la trayectoria, cuando tenga los dos sensores viendo negro los 2 motores estarán en marcha con lo que el robot avanzara en línea recta, ahora bien si el llega a una curva y supongamos que el sensor izquierdo sale de la línea negra entonces provocara que el motor del lado contrario (motor derecho) se desactiva con lo cual el robot girara a derecha (como un tanque) entrando de este modo en la línea negra otra vez... para el caso contrario pasa lo mismo pero con el otro motor y sensor.
Espero disfrutéis de este sencillo diseño.. creo que es uno de los mas sencillos que hay ahora mismo por internet por no decir el mas sencillo :)