Electrónica, placa de sensores y de control.

Baby Orangutan B-328 Robot  Controller.  
Link.
Como cerebro del robot  y para el control de lo motores vamos a utilizar esta placa que vende pololu, su precio es de $30 ($42 con su programador) y consiste en un microcontrolador con sus correspondientes pines al mundo exterior y un puente en h para controlar dos motores, junto a unos sensores, éstos son los componentes principales de todo robot, sensores, control, y actuadores.

Lo primero es soldar los conectores que nos viene con la placa como se ve en la imagen:

Imagenes de pololu.com

El conector que va por la parte superior es el conector que usaremos para programar la placa (más sobre ésto cuando se llegue a la parte de programación) y debe ser soldado en la parte superior con ese tipo de conector. Los otros conectores son las salidas a los motores y pines del microcontrolador, se pueden soldar como se quiera o usar el conector que más guste, soldarlo con los conectores de la foto en esa posición es bastante acertado porque podremos pinchar la placa sobre una protoboard para realizar pruebas, o sobre una placa de topos para soldar y hacer un circuito si no queremos hacer un pcb.

Los componentes de la placa son los siguiente:



El microcontrolador, en este caso un ATmega328P, lo cual es una buena noticia y decisivo en mi caso a la hora de seleccionar la placa, porque probablemente en 8 bits los AVR son los mejores microcontroladores disponibles, y otra buena noticia es que el compilador de c/c++ es bueno y gratis.

El otro integrado TB6612FNG es un puente en H, su misión es controlar el motor en velocidad y sentido en función de las entradas que le da el microcontrolador. Un motor no se puede controlar directamente desde el pin de un microcontrolador ya que el motor requiere mucha más intensidad para su funcionamiento de la que es capaz de proporcionar el puerto del micro. Cuando llegue a la parte de programación entraré en todo detalle con su funcionamiento, y los periféricos del micro (PWM) necesarios para su control. El puente es tecnología MOS por lo que la caída de tensión en éste serán mucho menor que en las alternativa bipolares, como el L293 y L298 que se suelen ver por aquí para el control de pequeños motores, lo que en definitiva nos permitirá aprovechar mejor la batería y darle más tensión al motor. Las conexiones de las entradas del puente van a las salidas PWM del microcontrolador como es lógico.

Los otros componentes a destacar es un led que se puede encender y apagar durante la programación y un potenciometro en la placa que lee mediante un ADC. La tensión de entrada de la placa es de 5 a 13.5V, ya lleva su regulador.

Antes de entrar con los pines disponibles del microcontrolador que es lo que realmente interesa un vistazo al esquema:



El diseño es sencillo, empezando por arriba a la izquierda vemos la tensión de entrada que conectaremos a la batería, un mosfet para evitar la inversión de polaridad y un regulador disipativo que proporciona una tensión de 5V a lógica de los integrados. La tensión de entrada de la batería también se lleva al puente en H (etiqueta Vbat), es la tensión que le llega a los motores, por lo que con esta placa podremos controlar motores de 6 a 12V (valores nominales comunes) y de hasta 1.2A en stall (motor alimentado y parado), debido a que tenemos el límite de la tensión de entrada entre 5 y 13.5.

Pasado el regulador se observa condensadores para eliminar ruido, un led para indicar que la placa está funcionando y un filtro LC para darle una tensión limpia a la parte del ADC (convierte valores de tensión analógicos en valores digitales) del micro, la V de referencia del ADC va conectada a esta tensión de 5 voltios, es decir 5/1024 de resolución para nuestros ADCs. Luego tenemos el puente en H conectado a los correspondientes pines del micro para su control. La señal de reset llevada a Vcc a través de una resistencia, para habilitar un botón de reset sólo tendremos que llevar a tierra este pin a través de un pulsador. Un led de usuario y un potenciometro también de usuario, si nos molestan para nuestra aplicación y queremos usar ese pin para otra cosa se podrían quitar.

Pero lo más interesante, que pines del microcontrolador podemos usar y que hay en esos pines.



PB0:  ICP1/CLKO/PCINT0.
ICP1: input capture pin timer1, nos serviría para capturar una señal externa y calcular por ejemplo su frecuencia, ciclo de trabajo, etc.. medianet el timer1.
PCINT0: interrupt on change, cuando cambia el estado del puerto (de 1 a 0 o al contrario) se dispara una interrupción, conectar algún botón, sensor de distancia digital, etc..
CLK0: para sacar la señal de reloj. Poco aplicable en el velocista.

PB1: OC1A/PCINT1.
OC1A: output compare match output timer1, se usa para generar una salida mediante el timer1 (un pwm por ejemplo), cuando coincide la cuenta de éste con un valor almacenado en un registro. Poco aplicable en el velocista.
PCINT0: interrupt on change, cuando cambia el estado del puerto (de 1 a 0 o al contrario) se dispara una interrupción, conectar algún botón, sensor de distancia digital, etc..

PB2: SS/OC1B/PCINT2.
SS: slave select, para el protocolo SPI que no está disponible en esta placa. Sin uso.
OC1B: output compare match output timer1. Igual que en el anterior.
PCINT2: interrupción externa como los anteriores.

PB4: MISO/PCINT4.
MISO: master input slave output, señal del protocolo spi, sin uso ya que no está disponible en la placa.
PCINT4: interrupción externa como en los casos anteriores.
Este pin se usa para la programación en serie, por lo que hay que tener cuidado de no conectar nada que pueda influir a ésta (como una capacitancia elevada) o en la que pueda influir.

PB5: SCK/PCINT5.
SCK: reloj del bus I2C, no disponible en la placa.
PCINT5: interrupción externa igual que los anteriores.
Este pin se usa para la programación en serie, por lo que hay que tener cuidado de no conectar nada que pueda influir a ésta (como una capacitancia elevada) o en la que pueda influir.

En este puerto nos falta PB3 que va al puente en H de la placa, PB3 contiene la línea MOSI del protocolo SPI, por lo que sin ella perdemos este protocolo serie.

PD0:  RXD/PCINT16.
RXD: receive data, la entrada de datos para la USART. Importante ya que nos permitirá establecer una comunicación serie con el exterior.
PCINT16: interrupción externa.

PD1: TXD/PCINT17.
TXD: transmit data, la salida de datos de la USART. Junto con el anterior los dos pines necesarios para montar una comuniación serie mediante la UART.
PCINT17: interrupción externa.
En este puerto además tenemos conectado un led de usuario, que puede ser un problema si queremos usar el puerto como entrada, si el dispositivo que proporciona la entrada no es capaz de suministrar la corriente necesaria que requiere el led, la tensión que vea el micro puede estar por debajo del umbral del 1, por lo que no podremos leer. En el peor de los casos se quita el led.

PD2: INT0/PCINT18.
PCINT18: interrupción externa como los anteriores, cuando cambia el nivel de tensión de bajo a alto o al revés se dispará.
INT0: también es una interrupción externa, la diferencia si recuerdo correctamente (tendría que mirarlo en el datasheet) es que esta interrupción tiene su propio vector de interrupción, mientras que todas las anteriores suelen tener un vector cada 8 fuentes de interrupción, por lo que una vez disparada habría que detectar quien la ha disparado. Con la INT0 se entraría directamente, también en la INT0 creo que se puede seleccionar si es disparada por un flanco de bajada (de 1 a 0) o de subida (de 0 a 1), o ambos., mientras que en la otra cualquiera lo dispara.

PD4: XCK/T0/PCINT20
XCK: es el reloj externo para la usart, no lo usaremos.
T0: nos sirve para capturar un flanco de subida o de bajada que incremenet o decremente la cuenta del timer0, por ejemplo sirve para capturar un encoder. Pero no lo podremos usar ya que se usa para el pwm del puente en h.
PCINT20: interrupción externa cuando cambia el pin.

PD7:  AIN1/PCINT23
AIN1: analog comparator negative input. La positiva no la tenemos disponible.
PCIN23: interrupción externa como las anteriores.

PC0 a PC3: ADCx/PCINTx
En todos encotramos una entrada para convertir un valor analógico en digital y una interrupción externa.

PC4: SDA/ADC4/PCINT12
ADC + interrupción como en los anteriores.
SDA: 2-wire serial interface data, es decir la línea de datos del protocolo serie I2C. Protocolo muy importante para comunciarnos con otros circuitos integrados y que propablemente sea usado en el robot.

PC5: SCL/ADC5/PCINT13
ADC + interrupción como en los anteriores.
SCL: 2-wire serial interface clock, la línea de reloj del protocolo I2C, que junto con el puerto anterior añaden lo necesario para montar este protocolo.

PC6:  RESET/PCINT14.
PCINT14: interrupción externa como las anteriores.
Reset: aquí tenemos una de las fuentes de reset del microcontrolador, en la placa lleva una resistencia de pull-up y un condensador a tierra, si queremos usar el reset externo sólo tenemos que llevar este pin a tierra. También tenemos la opción de deshabilitar el reset externo y usar el pin como un pin de entrada y salida normal, para ello tendremos que tener en cuenta la resistencia de pull-up que ya está puesta y si molesta quitarla, al igual que el condensado.

ADC6 y ADC7.
Estas dos entradas del ADC no están multiplexadas con ningún puerto, en el ADC7 ya tenemos conectado un potenciometro, en el esquema no sale el valor, pero que habrá que tener siempre en cuenta si se quiere usar.

Cuandos se dice que un puerto está multiplexado, significa que además del hardware necesario para hacerlo funcionar como entra o salida, hay también otro hardware disponible como puede ser una entrada al ADC, un timer, etc.. y sólo podremos elegir una de las opciones al mismo tiempo, en ejecución de programa se puede reconfigurar.

Resumiendo, contamos con 17 puertos + 2 ADCs, de los que un puerto tiene conectado un led verde, otro es la señal de reset con resistencia de pull-up y condensador a tierra y uno de los ADCs lleva conectado un divisor de tensión, es decir, un potenciometro.

Por lo que podemos elegir entre la combinación de las siguientes opciones (en total tienen que sumar 19): 16 entradas digitales + 1 de reset si queremos usarlo como tal, 8 ADCs (dos de ellos sin multiplexar con los puertos), 2 pines para montar un protocolo serie mediante la UART (PD0 y Pd1), 2 pines para montar un protocolo serie mediante I2C (PC4 y PC5). Y un timer de 16 bits (timer1) disponible, que no podemos usar para contar algún evento ya que no tenemos disponible el pin necesario (está en el puente en h), pero si se podrá usar para crear un par de señales pwm (PB1 y PB2).

De los 3 timers que tiene el micro tenemos disponible el de 16 bits, los dos de 8 bits se usan para controlar el puente en h de la placa y generar sus señales pwm de control (más sobre esto cuando se utilice), y el de 16 bits lo vamos a tener que usar para la parte derivativa del control del robot o para leer los sensores. Por lo que los 3 timers de los que disponemos están ocupados.


M1B, M1A, M2B y M2A, van conectadas a los dos motores, pueden suministrar una intensidad de 1.2A continuos y picos de 3A.
VIN es la entrada de la batería, junto con GND (negativo de la batería).
También tenemos una conexión de Vcc, sería una salida de 5V del regulador de la placa, pero de la que no podemos sacar casi intensidad (50 mA max) ya que si intentamos sacar más nos cargamos el regulador interno. Por lo que si hay que usar electrónica adicional (los sensores) lo mejor es usar otro regulador externo.

Todos los protocolos y conceptos anteriores se irán viendo según se vayan utilizando.

Placa de sensores. Link.
Pololu nos da dos posibles opciones a la hora de comprar una placa de sensores, una para leer el valor analógico de los sensores y otra para leer un valor digital, el resultado de usar una u otra es el mismo, es hacer la misma cosa de dos maneras distintas. En este caso se ha elegido la digital ya que es la que implementa su robot 3pi y podemos encontrar código disponible en el que fijarnos.


La placa está formada por 8 sensores y se puede dividir en una placa de seis y en otra de dos.


En nuestro caso vamos a usar los 8 sensores, ya que tenemos entradas de sobra en el microcontrolador y con los 8 sensores abarcamos más espacio para la lectura de la línea.

El sensor está formado por un fotodiodo y un foto transistor. El diodo es un emisor de luz y el transistor un receptor, hay que detectar una superficie blanca o negra para poder seguir el circuito. Si la superficie de debajo del sensor es negra, la luz emitida por el diodo es absorbida por el color negro, y el fototransistor no recibe casi luz. Si la superficie es blanca la luz emitida por el diodo es reflejada por la superficie y al fototransistor le llega luz. Cuando el fototransistor recibe luz, se crea una corriente que pasa a través de éste (la corriente es proporcional a la cantidad de luz recibida), y nosotros debemos detectar el efecto que genera esa corriente con el microcontrolador, para ello debemos añadir un componente al circuito como una resistencia.


Este sería el caso más sencillo, el transistor recibe luz y genera una corriente que pasa a través de él, esta circulación de corriente provoca una caída de tensión en la resistencia (V=I*R) que será de un valor suficiente para tener un valor cercano a 0V cuando el transistor está sobre blanco y por tanto recibiendo luz. Cuando el sensor está sobre negro al transistor no le llega casi luz y la corriente que genera es prácticamente cero, por lo que en la resistencia no se produce ninguna caída de tensión y la tensión en la salida es cercana a Vin (5V). Con un microcontrolador conectado a la salida podemos leer los estados altos y bajos haciendo una lectura en digital y detectando sólo un 1 ó 0. Cuando el sensor no está totalmente sobre negro ni sobre blanco, por ejemplo está a mitad de negro y blanco, el valor de la salida estará comprendido entre 0 y 5V, y aquí podemos usar un ADC para leer el valor de la salida real, lo que nos dará una idea mucho más precisa de la distancia del sensor a la línea negra. Con detectar el uno y el cero es suficiente en la mayoría de los casos y no hace falta hacer lectura analógica.

Así funciona la placa QTR-8A, que puede que hubiese sido mejor elección que la otra opción que voy a usar
Link, ya que la lectura directa de uno o cero es muy sencilla, si se complica la cosa cambiaré a esta placa, pero de momento mi interés es analizar la placa que voy a usar que por lo visto da muy buenos resultados.

En la placa elegida el sensor se monta así:

En lugar de una resistencia tenemos un condensador y una resistencia en la salida, y en lugar de medir un valor de tensión, medimos el tiempo en que tarda en cambiar de uno a cero la tensión, como explican en la página de pololu la secuencia para realizar la lectura sería la siguiente.

La salida OUT se conecta a un puerto del microcontrolador que se configurara como entrada o como salida para hacer el proceso de lectura, cuando un puerto está configurado como entrada se dice que está en alta impedancia, es decir que la corriente que absorbe es muy muy pequeña, por lo que visto desde el circuito del sensor se podría ver como un circuito abierto.

Traducción de la página de pololu:
1.
Set the I/O line to an output and drive it high. // Configurar el pin del micro como salida y ponerlo a uno.
2. Allow at least 10 us for the 10 nF capacitor to charge //Esperar por lo menos 10 us para que el condensador se cargue.
3. Make the I/O line an input (high impedance) //Configurar el pin del micro como entrada (alta impedancia).
4. Measure the time for the capacitor to discharge by waiting for the I/O line to go low //Medir el tiempo que el condensador tarda en descargarse, es decir cuando leamos un 0 en la entrada debido a que la tensión en out es menor que el 1 lógico.

Lo que entiendo yo sobre como funciona ésto, me parece que me va a tocar coger lápiz y papel x_x.
1. Configurar el micro como salida y ponerlo a uno.
2. Esperar 10 us para que el condensador se descargue en lugar de cargarse, estaría a la misma tensión en los dos bornes, así que me expliquen hacía que sentido se carga el condensador.
3. Poner el pin del microcontrolador como entrada.
4. Medir el tiempo que tarda el condensador en cargarse, según se carga la tensión en Vout irá disminuyendo.

Haciendo caso a lo que pone en la página y resumiendo el tema consiste en medir el tiempo que tarda en "descargarse" el condensador (poniendo el pin del micro como salida o como entrada hacemos que el condensador se cargue o se descargue), y este tiempo será proporcional a la corriente que circule por el transistor, esta corriente a su vez depende de la luz que le llegue, es decir, el tiempo que tarde el pin del micro de pasar de leer uno a pasar a leer cero será función de los lejos que se encuentre la línea negra del sensor, es como hacer una lectura con un ADC pero usando un puerto digital y contando tiempo. Por lo que obtenemos una buena idea de la distancia del sensor a la línea negra y probablemente obtengamos mejor resolución que con el ADC.

Este circuito es más complejo que el anterior, pero me he decidido por su uso para evaluarlo ya que es el que se usa en los robots 3pi, pero para quien no quiera complicase se pone la otra placa leída en digital, 1 ó 0, pasando del ADC y probablemente no necesite más. Eso sí luego para poder hacer la derivada del error hay que contar tiempo, mientras que haciendolo mediante ADC o condensador podemos aplicar los valores leídos directamente, pero para llegar aquí aún queda bastante.

El esquema completo de la placa es el siguiente:

Se puede ver el montaje anterior de fototransistor y condensador multiplicado por 8, los foto diodos se colocan dos a dos para reducir el consumo. Tenemos una entrada a la placa que se llama LEDON, que nos sirve para apagar y encender los diodos emisores de luz, y puede utilizarse en dos casos: en el primero nos sirve para ahorrar batería, los encendemos realizamos la lectura y los apagamos hasta la próxima vez que queramos volver a leer. El segundo uso que le podemos dar es controlar la luz emitida por los diosos aplicando una señal pwm, haciendo mayor o menor el ciclo de trabajo podemos hacer que a los transistores le lleguen más o menos luz. En el caso del robot velocista con dejarlos siempre encendidos es suficiente.

El consumo de la placa dice que es de 100 mA, la placa anterior del micro podría dar esos 100 mA pero nos arriesgamos a quemarla, una buena regla es siempre dimensionar los componentes para el doble de la teoría.

También observamos como hay un conector para cortocircuitar las resistencias de 47 ohmios de los diodos, ésto es por si vamos a alimentar la placa con 3.3V, ya que esa resistencia está calculada para un valor de alimentación de 5V. Si se alimenta con 5V no hay que tocar nada, si se alimenta con 3.3V unir esos puntos.

Los conectores de la placa los podemos soldar de dos formas:

Mediante un conectos que se ajustaría al rectángulo grande amarillo, o con un conector en fila:

En fin, según gustos.

La placa de sensores viene con su tira de pines para ponerla como más nos guste, la resistencia es por si decidimos partir la placa en dos e iría en la plaquita de los dos sensores, en nuestro caso no sirve de nada.

Para poder realizar la lectura de estos sensores con condensador hay que utilizar un timer del microcontrolador, ya que debemos contar tiempo, por lo que no queda más remedio que utilizar el timer1 que nos quedaba libre para la tarea, por suerte podremos leerlos todos a la vez detectando cuando se produce el cambio en el pin de entrada por una interrupción. Por lo que seguramente habrá que elegir un pin del micro con interrupción externa para cada sensor, por suerte tenemos de sobra. Tenemos un montón de código en el que fijarnos, ya que el robot 3pi que usa esta forma de ller los sensores también lleva el ATmega328p, por lo que probablemente vamos a poder reutilizar sus librerias para el control de los motores y para la lectura y calibración de los sensores, o almenos fijarnos como se han hecho.

Un último apunte sobre los sensores, es que éstos han de estar a una distancia mínima del suelo, cuanto más nos alejemos menos luz nos llegará al transistor procedente del diodo, por lo que debemos preocuparnos por situarlos a unos 3 mm del suelo aproximadamente.

El siguiente paso sería crear una placa mediante pcb o una placa de topos, para pinchar la placa del micro, y cablear todo el robot, añadir un led, algún pulsador. La placa de sensores requiere 8 ó 9 pines del microcontrolador, por lo que tendríamos suficientes con la baby orangutan, para los sensores y alguna cosa más que queramos añadir. Pero eso para el próximo fin de semana, si el miniz me deja. Con esto queda hecha la introducción de la electrónica seleccionada para el robot, ya se irá concretando cada punto según se utilice.

Para cualquier duda, idea, comentario: foro.