ACTUALIZACION: Aqui esta el listado de materiales: BOM_PIC_DATALOG_V1.0_WEB
Hola! Aquí estoy con la última tarjeta que he diseñado y que continuo probando. Es un pequeño datalogger alimentado por una batería y basado en un microcontrolador PIC18F2620. La idea surgió hace unos meses, hablando con un compañero. Necesitaba algo para monitorzar la temperatura y humedad dentro de un contenedor marítimo, para un viaje de unas tres semanas desde España a China. El bajo consumo es importante en esta aplicación, para tener la mayor autonomía posible con una pequeña batería. He usado el sensor HDC1050 para la temperatura y humedad, y he añadido un sensor de luz ambiental TEMT6000X01. Los datos recogidos se almacenan en una tarjeta micro-SD. Además, la tarjeta tiene un reloj interno para poder añadir marcas temporales, un cargador de baterías de Li-Ion, botones y led’s de usuario, y un conversor serie-USB MCP2221 para poder comunicarse con la tarjeta y configurar parámetros a través de un PC. Veamos la tarjeta en detalle!
- HARDWARE
Lo pirmero, una vista de la tarjeta con los componentes principales. Después hablaremos de la carcasa 😉
El esquema de la tarjeta está disponible aqui: EEL_PIC_DATALOG_V1.0. Está dividido en las siguientes partes:
- Diagrama principal: incluye el conector mini-B, un diodo TVS para proteger las líneas del puerto USB y el resto de conexiones entre bloques de la tarjeta.
- Etapa de alimentación: La tarjeta se puede alimentar a través de una batería de Li-Ion de 3.7V o a través del puerto USB. Para este primer prototipo he usado una batería de 3.7V/1100mAh (LP603450). El puerto USB además de alimentar la tarjeta, se usa para cargar la batería. Como regulador, he usado el MCP73832-2ACI/OT de Microchip, con una Rset de 4K7 (no de 10K como aparece en el esquema). Esto permite una corriente de carga de unos 220mA/h. Los diodos led D4 (rojo) y D5 (verde) indican el estado de la carga. Además, el led D1 (verde) se enciende cuando hay alimentación desde el puerto USB:
En la siguiente imagen, el punto caliente es el regulador de batería, cuando está en el proceso de carga. A pesar que es una temperatura alta, no es crítica, y con esta configuración la batería está totalmente cargada en aproximadamente 5 horas.
La alimentación del sistema es de 3.0V, por lo que he utilizado un reulador LDO. El modelo es el TPS76930DBVR con una corriente máxima de salida de 100mA y un dropout típico de 115mV para una corriente de salida de 100mA. Además hay otro regulador lineal, U10, de 3.3V. Este último es utilizado para alimentar el conversor USB – serie. La entrada de este regulador viene del puerto USB, por lo que cuando no hay conexión en este puerto, el regulador y el conversor serie no están alimentados, aumentando la autonomía del equipo.
La tensión de la batería se mide con la entrada analógica RA3 del microcontrolador. Para ello, he montado un simple divisor resistivo para ajustar el valor máximo de la batería (4.2V al final de la carga) con los 3V máximos de tensión de entrada al PIC.
En estos momentos, la duración de la batería es de unos 10 dias. Con el actual software, no hay ningún modo de bajo consumo implementado. En funcionamiento normal, el consumo está alrededor de 5-6mA, incluyendo el sensor DS18B20 (1mA) que actualmente no uso. Creo que desmontando este sensor y modificando el software para activar los modos de bajo consumo, el objetivo de autonomía de tres semanas debiera ser fácil de alcanzar.
- Microcontrolador PIC18F2620: El crebro de la tarjeta! 64KB de memoria Flash, 3968 bytes de RAM, 1KB memoria EEPROM, 25I/O, I2C, UART,…todo condensado en un encapsulado SOIC de 28 pines, suficiente para este proyecto! Por supuesto, la tarjeta tiene un conector para el puerto de programación ICSP. También hay dos conectores, J4 y J5 con la alimentación disponible (VCC y GND) y tres pines no utilizados. Además está la huella para el sensor de temperatura DS18B20. Originalmente, está en la tarjeta porque no sabía si iba a ser capaz de soldar a mano el sensor HDC1050 sensor. Así, si no podía, al menos podría obtener la temperatura de este sensor.
- Bus I2C: En el bus I2C de 3V de la tarjeta, están conectados el sensor de temperatura y humedad HDC1050 y el reloj en tiempo real M41T00SM6. Este reloj tiene una batería CR1220 para guardar la fecha y hora del sistema. Además, hay un conector con todas las señales del bus I2C disponible para futuros usos (J1). Este bus I2C esta implementado por software porque las líneas propias del I2C están compartidas con el puerto SPI, y este puerto se usa para el manejo de la tarjeta micro-sd.
- Zócalo para tarjeta Micro-SD: He utilizado este de Molex porque es fácil de montar a mano. No hay mucho mas que decir, simplemente una tarjeta micro-sd conectada a un puerto SPI. La especificación de la tarjeta SD puede verse aqui.
- Interfaz de Usuario: Dos pulsadores (activos a nivel bajo) y dos led’s (D2 Verde / D3 Rojo) a disposición del usuario!.
- LDR: He añadido también un sensor de iluminación ambiente, el TEMT6000X01. Se lee con la entrada analógica RA0. Como el ADC interno del PIC tiene una resolución de 10 bits, el máximo valor que se leerá es de 1023, correspondiente al máximo nivel de iluminación.
- Conversor Serie-USB: Basado en el integrado MCP2221 que ya he empleado antes.
He diseñado la tarjeta con componentes solo por una cara, ya que es mas fácil el montaje. El formato de la PCB es el DP5050 de DangerousPrototypes. Los ficheros gerber de la tarjeta se pueden descargar aqui: GBR_PIC_DATALOG_V1.0. Y aqui hay un par de imagenes en 3D sacadas con Altium:
La fabricación de las placas ha sido en la compañia DirtyPCB, y como siempre, la calidad es excelente para el precio que tienen. El único inconveniente que he encontrado es que fabricar la placa en color amarillo y la serigrafía en color blanco, hace que ésta no se lea bien. Pero bueno, nunca habñia hecho una placa amarilla! 😉
- CARCASA
Por primera vez, he hecho una carcasa con una impresora 3D para la tarjeta . Para hacerla, me ha ayudado uno de mis mejores amigos. Tiene su propia compañia y una gran experiencia diseñando cajas y envolventes para sistemas electrónicos. Le he enviado el modelo step de la tarjeta y él ha diseñado la carcasa, para fijar la tarjeta y también la batería. Este fue el primer intento:
La tarjeta encaja perfectamente, pero se ve la batería (la parte azul). Además, necesito un pequeño hueco para sacar los cables de la batería y una forma de fijación para el datalogger. Hemos implementado estos cambios en la segunda versión:
Si! He utilizado dos Imanes de neodimio para poder fijar el conjunto a cualquier superficie metálica. Es un método transparente para fijarlo, y el resultado final es bastante bueno. Ahora lo puedo poner en la puerta del frigorifico 😉 :
En esta versión la electrónica encaja mejor y ahora no se ve la batería, por lo que el datalogger ahora parece un poco mas profesional:
El fichero .stl de esta última versión de la carcasa está disponible aqui: BOX_DATALOGGER_V02
- SOFTWARE
El software (*) del datalogger puede descargarse aqui: PIC_DATALOG_V00d. He usado el compilador Mikroc Pro PIC, las librerias de este compilador son muy buenas. Especialmente la librería FAT32, permite el manejo de la tarjeta micro-SD de una forma muy sencilla. La versión actual del software es la 00D, y todavía estoy trabajando en ella. Se que hay muchas cosas que se pueden optimizar, procesos que pueden simplificarse,…pero aún está en desarrollo!
Hay muchas cosas a tener en cuenta en este software. Intentaré explicar algunos puntos importantes, pero si hay alguna duda con algo, comentarlo y trataré de resolverlo!
- En el arranque, el sistema configura y comprueba todos los periféricos: se configuran los pines de entrada / salida, UART, I2C, SPI, se comprueba el estado del RTC y se fija la fecha y hora para los ficheros a almacenar en la tarjeta micro-SD. Además se lee el ID del dispositivo, un parámetro que identifica el datalogger (valor almacenado en la EEPROM del microcontrolador).
- Los ficheros en la SD tienen el siguiente formato de nombre: aaaammdd.ext . Esto es, año, mes y dia. La extensión inicial es ‘000’. Cada día, a las 00:00 horas, el sistema crea un nuevo fichero con el mismo formato, por lo que cada 24 horas hay un nuevo fichero.
- El sistema tiene definido un tiempo tras el cual se realizan medidas, se actualizan todos los parámetros y se almacenan los nuevos datos en la SD. Este tiempo es configurable por el usuario, y puede ir entre 1 y 999 segundos. Cuando este tiempo cumple, el sistema lee todos los sensores y parámetros y almacena los datos en la SD.
- Con el pusador P1, se puede insertar una marca en el fichero. Esto significa que en ese momento, se fuerza un evento: los sensores se leen y se almacenan los datos. Con el pulsador P2 se crea un nuevo fichero. Se mantien el nombre pero se incrementa en uno la extensión: cambia a 001, 002….y así. Cada pulsación en P2 crea un nuevo fichero.
- Formato de los datos: En la tarjeta SD, hay un fichero nuevo cada dia. Estos ficheros son en texto plano y los campos están separados por ‘;’ por lo que es fácil importarlos con excel o algún programa similar :
Cada trama almacenada contiene los siguientes campos:
.Nombre y versión del software
.Identificador del datalogger (ID)
.Tiempo (en segundos) en que el sistema actualiza las medidas y los almacena en la tarjeta SD.
.Fecha
.Hora
.Tipo de evento (Arranque, marca, actualización,…)
.Tensión en la batería (voltios)
.Valor del LDR
.Temperatura del sensor DS18B20 (ahora es fija porque no se esta leyendo)
.Temperatura del sensor HDC1050 (en ºC)
.Humedad relativa del sensor HDC1050 (%)
.El resto de bytes están reservados para futuros usos.
Un ejemplo rápido de un gráfico del nivel de batería durante 4 dias
- Cada dia se crea un nuevo fichero. Para combinar todos los ficheros en uno solo (para facilitar la importacion de dtos y creación de gráficos) se puede utilizar el siguiente comando desde la ventana de comandos:
type *.* >> out_file.txt
- He implementado una serie de comandos a través del puerto serie para obtener infomación o fijar parámetros del datalogger. Para conectarse a la tarjeta, simplemente hay que conectar el cable micro-USB al PC e instalar el driver para el puerto serie virtual del MCP2221. Como terminal he usado el programa Tera Term Pro. Los parámetros de conexión son 9600bps, 8 bits de datos, sin paridad y 1 bit de stop. Importante! Activar la casilla ‘Local Echo’ en el menu ‘Terminal’ para ver los comandos que se envian a la tarjeta. La lista de los comandos implementados es la siguiente:
– reset -> Realiza un reset software del datalogger
– set time -> Fijar la hora del datalogger (hora y minutos, los segundos e ponen a ‘0’).
– set date -> Fijar la fecha del datalogger (año, mes, día del mes y dia de la semana).
– set update -> Fija el tiempo para actualizar el sistema (desde 1 hasta 999 segundos),
– set id-> Fija el identificador del datalogger (desde 000 hasta 999)
– temp-> Realiza una medida de temperatura del HDC1050
– hr-> Realiza una medida de humedad relativa del HDC1050
– ldr-> Realiza una medida del LDR (media de 10 muestras)
– batt-> Realiza una medida de la tensión de la batería (media de 10 muestras).
– date-> Muestra la fecha del datalogger
– time-> Muestra la hora del datalogger
– id->Muestra el ID del datalogger
– upd-> Muestra el tiempo de actualización (en segundos)
(*) THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.