e-Candies(1). Acelerómetro Digital MMA7455

diciembre 1st, 2010


A long time ago…

Bueno, de vuelta poco a poco.

En esta ocasión vamos a hacer un pequeño repaso a esas “golosinas” que suponen nuestros mini módulos que usamos habitualmente en nuestros montajes previos a una integración total con la PCB final, que reutilizamos mil y una vez y que algunas veces nos dan algún quebradero de cabeza, en especial cuando implementamos algún tipo de chip nuevo con el que vamos a experimentar.

En este primer post, me voy a centrar en el acelerómetro digital MMA7455 de Freescale.
Este es un modelo de acelerómetro 2G/4G/8G que se puede interconectar por SPI o I2C.

Tiene una resolucion de 8 bits y hasta 10 bits en modo 8G.

Es muy fácil de configurar modificando simplemente valores en sus registros internos.

Y los datos también son muy sencillos de leer de los propios registros de los ejes o de configuración.

Dispone de dos interrupciones configurables por el usuario y la posibilidad de setear los registros de los ejes para calibrar el dispositivo.

Se alimenta entre 2,5 – 3,6 vDC y tiene un consumo mínimo en standby de 26uA por uno de max 3mA en funcionamiento.

Es un cacharrito interesante para alimentarlo con una pila tipo coin cell (botón).

He optado por hacer una PCB que pueda servir para usarlo de los dos modos posibles. En el caso del SPI usando SDA/SDO en una sola patilla.

La soldadura, teniendo en cuenta que el encapsulado es LGA-14 no ha sido muy complicada. Eso sí, usando pasta de estaño.

La implementación de las comunicaciones tambien he decidido hacerla por I2C, con lo que en este caso será necesario añadir al circuito 2 resistencias de pull-up de 4k7 ohms entre SDI, SDO y Vcc.

Este es el esquema del circuito, que como podeis ver, no es más que un adaptador a SIL (Single In Line) para poder pinchar en la protoboard:

Y esta la PCB resultante:

Implementación en CCS

La implementación de la comunicación I2C del acelerómetro es bien simple. Sólo hay que configurar en el inicio el modo de funcionamiento del acelerómetro y posteriormente leer los registros de los ejes para obtener los datos de aceleración.
Voy a hacer una configuración básica. Lo voy a configurar con un rango +/-2G y en modo de medición, que es el más habitual.
Abrimos el datasheet del acelerómetro, extraemos las tablas de configuración del registro de control del modo de funcionamiento ($16) y vemos que para seleccionar el modo +/-2G debemos poner los bits GLVL[1:0] a 01:

Y para el modo de funcionamiento de medición, los bits MODE[0:1] hemos de ponerlos a 01:
Con lo cual nuestro dato a escribir en el registro $16 va a ser 0b0000101 (0×05).

Para poder escribir y leer datos en el acelerómetro, necesitamos direccionarlo primero en el bus I2C. El datasheet nos dice que la dirección del dispositivo es $1D (0x1D).

Tenemos que fijarnos ahora en los gráficos de escritura y lectura de 1 byte en el acelerómetro para no cometer un error típico en el manejo de dispositivos serie.

La longitud de la dirección del dispositivo ($1D en nuestro caso) es de 7 bits [6:0], no de ocho, ya que la dirección se desplaza 1 bit hacia la izquierda para añadir en el bit menos significativo el flag de lectura o escritura (W/R):

Para escritura, desplazamos y añadimos un 0:
(0x1D)=00011101 desplazamos 1 bit a la izquierda y le sumamos 0 => 00111010 = 0x3A
Y para lectura, desplazamos y añadimos un 1:
(0x1D)=00011101 desplazamos 1 bit a la izquierda y le sumamos 1 => 00111011 = 0x3B
Con lo que para una escritura, enviaríamos:

  • [Start bit]
  • [0x3A] Device Address + W
  • Esperamos Ack
  • [Registro a escribir]
  • Esperamos Ack
  • [Byte a escribir]
  • Esperamos Ack
  • [STOP bit]

Podeis verlo en el siguiente cronograma, escribiendo 0×05 en el registro de configuración 0×16:

Para la lectura de un registro, el procedimiento será:

  • [Start bit]
  • [0x3A] Device Address + W
  • Esperamos Ack
  • [Registro a escribir]
  • Esperamos Ack
  • [0x3B] Device Address + R
  • [Leemos 8 bits]
  • Enviamos NAck
  • [STOP bit]

Podéis verlo tambien en el siguiente cronograma, leyendo el registro de configuración 0×16 que en este caso ya está cargado con 0×05:


Ya podemos hacer algo interesante con él y este podría ser el código que manejara el MMA7455:

//*****************************************************************
//                            MM7455.c
//
//   Librería para control de acelerómetro Freescale MM7455
//   por bus I2C
//   Author codigo C: Droky
//   Released at 19/09/2010
//
//
//*****************************************************************
// --------------------------------------------
// Definición de BUS I2C
// --------------------------------------------
#use i2c(master,fast,sda=PIN_B5, scl=PIN_B4)

//-----------------------------
//Comprobacion de acelerometro
//-----------------------------
BOOLEAN accel_ready() {
   int1 ack;
   i2c_start();            // Si el comando de escritura recibe ACK
   ack = i2c_write(0x3A);  // el dispositivo está listo.
   i2c_stop();
   return !ack;
}
//------------------------------
// Inicializacion Acelerometro
//------------------------------
void  accel_init(){
   i2c_start();
   i2c_write(0x3A); //0x1D desplazado con un 0
   i2c_write(0x16); //Registro MODE CONTROL
   i2c_write(0x05); //Medición contínua
   i2c_stop();
}
//-----------------------------------
// Escritura 1 registro
//-----------------------------------
void  accel_write(int reg, int data){
   i2c_start();
   i2c_write(0x3A); //0x1D desplazado con un  0
   i2c_write(reg);  //Registro a escribir
   i2c_write(data); //Dato a escribir en registro
   i2c_stop();
}
//-----------------------------------
// Lectura 1 registro
//-----------------------------------
int   accel_read(int reg){
   int   data;
   i2c_start();
   i2c_write(0x3A); //0x1D desplazado con un  0
   i2c_write(reg);  //Registro a leer
   i2c_start();
   i2c_write(0x3B); //0x1D desplazado con un  1
   data=i2c_read(0); //Dato leido->data
   i2c_stop();
   return(data);
}
//----------------------------------
// Lectura de 3 ejes de forma
// consecutiva y almacenado en
// 3 variables globales Xdata,
// Ydata y Zdata
//----------------------------------
void accel_read_3axis(){
   i2c_start();
   i2c_write(0x3A); //0x1D desplazado con un  0
   i2c_write(0x06); //Primer registro a leer (eje X)
   i2c_start();
   i2c_write(0x3B); //0x1D desplazado con un 1
   Xdata=i2c_read(); //Lectura eje X
   Ydata=i2c_read(); //Lectura eje Y
   Zdata=i2c_read(0); //Lectura eje Z
   i2c_stop();
 }

Y esto ha sido todo por ahora.
Nos vemos en la próxima entrega de e-candies. Quizás un conversor serial a Bluetooth para comunicarnos inalámbricamente con nuestro aparatito.
Droky.

Descargas

Cargador USB para Li-po de 3.7v

febrero 18th, 2010

¿Alguna vez os habéis planteado alimentar vuestro circuito con “algo” que dure más que unas pilas, que sea recargable y siendo barato ofrezca ligereza de peso y una corriente en condiciones?
Pues bienvenidos al mundo de las Li-po o baterías de Polímeros de Litio.
Estas baterías están de moda en los dispositivos electrónicos actuales, ya que siendo ligeras, ofrecen unas prestaciones muy interesantes a un precio muy bueno. Las podemos encontrar en los reproductores de MP3/MP4, teléfonos móviles, dispositivos GPS, minicámaras, y casi todos los gadgets que se precien de ofrecer una duración decente de sus baterías.


Simplemente para trabajar con ellas hay que tener en cuenta un par de normas básicas y con ello podremos alimentar nuestros circuitos durante mucho tiempo.
Las dos cosas fundamentales a tener en cuenta en una Li-po (vamos a ver solo los modelos de 1 celda, ya que es la base de las baterías Li-po) son:

  • No permitir que la carga baje de 3.3v ya que quedaría permanentemente dañada.
  • No doblarla, golpearla, pincharla ni cortocircuitarla ya que llegan a explotar y hacer fuego.

Este enlace, proporciona un interesante manual de uso de las Li-po.
Una forma muy interesante de conseguir baterías Li-po son las baterías de los móviles y MP3/MP4 de última generación (iPhone, iPod son mis favoritas ) en ebay. Son baterías muy ligeras y en el caso de las de los iPhone, ofrecen 1600mAh por 3 euros con envío incluído.

Nuestro circuito se va a encargar de la carga de una celda de 3,7v de Li-po a través del puerto USB.

Es un circuito muy simple, alrededor del MAX1555 y a un tamaño muy reducido. Este circuito es el punto de partida para probar el funcionamiento del MAX1555 y que posteriormente podremos implementar en nuestros diseños alimentados con Li-po de 3,7v y en el que necesitaremos añadirr un monitor de tensión ( una de las entradas analógicas de un PIC, por ejemplo) para evitar la caída por debajo de los 3,3v que nos dañe irreversiblemente la batería.
Posee un led que se ilumina durante la carga y que una vez llegado a los 4v se apaga dando por concluído el proceso de carga.
La carga se realiza a 3,3v y 100mA al hacerse por el USB. Es posible una forma de carga más rápida, usando la entrada DC (patilla 4 del MAX1555 no implementada en este circuito) y que se realizará a 350mA, pero desde una alimentación externa, ya que esto colapsaría el bus USB pudiendo llegar a dañarlo.

Esquema

El circuito cumple con la Appnote recogida en el datasheet de Maxim y sólo necesita de dos condensadores de 1uF. Se le añade un led de monitorización de carga completa con su resistencia limitadora.

Pcb

La Pcb es muy pequeña, 16mmx12mm y la mayor parte de su tamaño lo ocupa el conector USB. El led es de tamaño 0603 y la resistencia y los condensadores 0805, lo que da una idea del poco espacionecesario para implementarlo en un diseño electrónico.
La salida Vlipo va directamente conectada a nuestra batería de una celda de 3,7v

En acción

Tenemos una Li-po con su carga baja y procedemos a cargarla. En este caso el medidor de tensión (es un modelo usado para monitorizar Li-po en RC-modelismo)nos da una lectura de 3,83v:

El proceso de carga con el led encendido:

Y una vez terminado, el led se apaga:

Observamos que con la carga completa, la batería nos ofrece una tensión de 4,17v.

Ya la tenemos lista para alimentar nuestro circuito particular. Evidentemente es una solución ideal para circuitos que trabajen a 3,3v y siempre añadiendo un regulador de tensión tipo LDO como el MAX8881 que nos ofrece un Vdropout típico de tan solo 0,36v dejándonos un margen perfecto para la batería.
Este tipo de baterías, son tambien una solución ideal para añadir a aeromodelos FPV para alimentar el GPS, el circuito de OSD o sistemas de iluminación led en helicópteros y aviones RC ya que la batería ofrece muy poco peso, algo fundamental en estos aparatos.

Salu2,
Droky.

Descargas

Teclado capacitivo Mtouch 16 sensores

octubre 20th, 2009


Hola otra vez, no ha pasado mucho tiempo a ver si las ideas siguen fluyendo así.
Últimamente habéis visto un par de cosas relacionadas con los sensores capacitivos en este blog y no os podéis creer las calenturas de cabeza que me han dado. Por fin he llegado al final del trayecto con ellos y me han quedado claras algunas cosas (EMHO) que quiero dejar plasmadas aquí.
El tema de los sensores capacitivos está un poco de moda, desde que Apple decidió incorporarlos a sus iPod, las placas de las cocinas eliminaron los paneles frontales y en algunas zonas públicas se incorporaban como una superficie interactiva y fácil de limpiar (sin bordes ni pulsadores).
Últimamente han aparecido unas cuantas empresas que han puesto a nuestra disposición controladores para este tipo de sensores y en ellos he estado inmerso en los últimos tiempos.

Antecedentes
El primer contacto, fue con la serie 10F de Microchip, en concreto con el 10F206 con buenos resultados al final, pero con el inconveniente de la necesidad de implementar un firmware (con su correspondiente programación del micro) para un solo sensor:

Personalmente, creo que para un solo sensor la mejor solución es el QT100A de Quantum. No hay que cargarle ningún firmware, y la sensibilidad depende de una pequeña red RC. Muy simple de implementar. Es el que he usado para el juego de la vida y en una pequeña PCB prototipo de dos sensores:

Con los buenos resultados del QT100A me decidía probar algo “más grande” y de la misma marca, el Qt1081 controlador de 8 sensores.
Lo más dificultoso de manejar es su encapsulado 32QFN. Es diabólico para los que hacemos las cosas desde nuestra casa :) y un inconveniente a mi entender es su procesamiento “paralelo” de los sensores. Es decir, tenemos 8 entradas de sensado y 8 salidas y además necesitamos implementar 8 redes RC que nos dan la sensibilidad y nos modifican el burst del pulso que hace la detección.
Esta era la placa controladora con su teclado:

Los resultados, además de ser un poco engorroso el tema de las RC, no fueron lo que yo esperaba. Demasiada circuitería en el diseño:
Controladores QT1081, PIC para gestionar las I/O con la USART, alimentación y conversor de niveles. Para mi aplicación en particular eran demasiados componentes.
Para lo que sí lo he encontrado muy interesante es para teclados de reducidadas dimensiones tipo iPod por su elevada integración y tensión de trabajo. Además una PCB de tamaño reducido acabaría con los problemas que yo me encontré en estas dimensiones.

A través de un amigo de un foro conocí los MPR084 de Freescale. Se antojaban interesantes. Con conexión I2C eran más manejables y además son configurables por software.
La programación es muy sencilla, pero despues de un par de intentos, no se adaptaban a mi diseño:

  • Necesitaba hacer un cambio de niveles de tensión del bus I2C y el PCA9306 me metía demasiado ruido.

Hice dos pruebas con planos de masa y sin ellos ( doble cara y simple cara ) y no me resultaron satisfactorios. Vamos que no me funcionó como yo quería.
Me releí los datasheets y las AppNotes, pero creo que las dimensiones de la PCB eran un problema .
A simple cara con la controladora:

Y a doble cara con plano de masa:

Finalmente, y después de haber pasado por un seminario de Microchip con el amigo Desig, de toquetear las placas con sus mtouch y sus placas de metacrilato sobre ellas, me dije que había que intentarlo.
El candidato, el PIC16LF727, un TQFP44 dedicado a sensores táctiles (además de otras aplicaciones), 3.3v de alimentación y de la serie nanoWatt de bajo consumo (60nA a 2v en standby!).

El diseño
El diseño, como manda Microchip. Esta vez a doble cara y con plano de masa para aislar pads.
Los componentes alrededor del PIC… un condensador de 100nF de desacople y una resistencia al MCLR (costumbre de la casa).
Todo está hecho en programación, los ajustes, los delays, los antirebotes , el control de pulsación…
El esquema es como sigue:

Le he añadido como comunicación serie un convertidor TTL-USB en la propia placa que al mismo tiempo me proporciona a través del FT232RL los 3.3v necesarios para alimentarlo.
Así, un solo cable y conexión USB.
Tambien incorpora una conexión de alimentación externa (3.3v) seleccionable con un jumper de soldadura y si no se quiere implementar el conversor, pues existen dos pads en la PCB que son el TX/RX de la USART del PIC16LF727

La PCB

Pues como ya comenté en un párrafo anterior, a doble cara para hacer que el plano de masa me bloquee cualquier falsa detección sobre las pistas de los pines de sensado en la cara inferior.
Lo he probado y de verdad que es muy eficiente siempre que el threshold esté bien calibrado.
Esta es la PCB:

Resultado Final

El resultado ha superado todas mis expectativas en cuanto a sencillez de diseño, integración y calibrado.
La placa ha quedado así:

Y le he incorporado un panel de metacrilato de unos 2mm haciendo sandwich con una carátula (impresa en papel foto con una impresora de inyección EPSON) y la PCB resultando esto:

He escrito un pequeño programa para monitorizar el funcionamiento del teclado y ajustar desde el PC el threshold de los sensores y su histéresis y el resultado lo podéis ver en este pequeño vídeo.
Ha quedado un poco oscuro… a ver si alguien me regala una cámara HD :) y hago mejores vídeos

Salu2,
Droky

Juego de la vida – Game of Life (Conway)

septiembre 28th, 2009

Lo primero, demasiado tiempo sin escribir por aquí, muchas ideas pero poco tiempo para plasmarlas.
Esta vez me traigo un ejercicio de programación típico, el “juego de la vida” de John Horton Conway.

Citando a la wikipedia:
“El juego de la vida es el mejor ejemplo de un autómata celular; es en realidad un juego de cero jugadores, lo que quiere decir que su evolución está determinada por el estado inicial y no necesita ninguna entrada de datos posterior. El “tablero de juego” es una malla formada por cuadrados (“células”) que se extiende por el infinito en todas las direcciones. Cada célula tiene 8 células vecinas, que son las que están próximas a ella, incluso en las diagonales. Las células tienen dos estados: están “vivas” o “muertas” (o “encendidas” y “apagadas”). El estado de la malla evoluciona a lo largo de unidades de tiempo discretas (se podría decir que por turnos). El estado de todas las células se tiene en cuenta para calcular el estado de las mismas al turno siguiente. Todas las células se actualizan simultáneamente.

Las transiciones dependen del número de células vecinas vivas:

* Una célula muerta con exactamente 3 células vecinas vivas “nace” (al turno siguiente estará viva).
* Una célula viva con 2 ó 3 células vecinas vivas sigue viva, en otro caso muere o permanece muerta (por “soledad” o “superpoblación”). “

Como otros circuitos anteriores, intenté utilizar los mínimos recursos posibles y aprovecharlos al máximo. En este caso han sido:

  • PIC12F683
  • LCD Nokia3310
  • 2x QT100A

Como no disponía de memoria suficiente en el PIC, he dividido la pantalla con una rejilla y así convertir la matriz de 84×48 pixels en una matriz de 25×17 (405 celdas) que sí me caben en la RAM del PIC.
El siguiente problema ha sido al calcular la generación siguiente, ya que necesitaba dos matrices de RAM, una para la generación de entrada y otra para la de salida. Lo he solucionado calculando la generación siguiente línea a línea y usando una pila tipo LIFO de 2 niveles sobre 2 variables de tipo vector.
Los elementos se disponen de forma manual, con uno de los sensores capacitivos y de forma pseudoaleatoria. El programa en el modo de colocación de individuos, ejecuta una interrupción del TIMER1 cada 0.406ms (así solo cuenta de 0 a 405 que son los elementos de la matriz ) y cada vez que se toca el sensor, lee el valor del timer y activa la celda correspondiente.


El otro sensor inicia la simulación.
Durante la simulación es posible pausarla y una vez pausada, podemos continuar o reiniciar.



El circuito

El circuito es muy simple, como he usado componentes de bajo consumo, está alimentado por una pila de botón tipo CR2032.
El PIC se conecta al LCD nokia y sólo es necesario un condensador de 47uF para la Vout del LCD.
Los QT100A únicamente incorporan 1 condensador de desacoplo de 100nf y una red RC que ajusta la sensibilidad del sensor.

La PCB

A una cara y con todos los componentes en SMD. Existen 4 jumpers por la cara posterior.
En el diseño, no he tenido en cuenta que el encapsulado WSON6 de los QT100A posee un pad tipo GND en el centro y he tenido que cubrir con rotulador las pistas que pasan bajo el encapsulado para evitar cortocircuitos.
EL interruptor ON/OFF lo he aprovechado de un MP3 portable.

Simulacion con Proteus

Por si queréis ver como funciona la simulación, os dejo los ficheros de ISIS para Proteus.
Necesitaréis instalar el modelo de simulación del componente “LCD 3310″.
Lo podeis descargar de:
http://www.tanu-sha.narod.ru/nokia3310.html

Aquí os dejo un vídeo del funcionamiento:

Salu2

Descargas

Pong con acelerómetro en matriz de leds

diciembre 14th, 2008

Siguiendo con los experimentos con acelerómetro y la matriz de leds, ahora le toca el turno a un mini juego de Pong.
La pala se maneja moviendo la placa hacia los lados, con la particularidad que ésta es ligeramente elástica y rebota contra las paredes laterales.
La velocidad de la pelota varía según el tipo de golpe que se le de y la fuerza de empuje lateral que lleve la pala.
Ahí os dejo un video del funcionamiento:

Salu2


Copy Protected by Tech Tips's CopyProtect Popup Images .