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.