Boya Iridium con Arduino y GPS | Diseño electrónica (esquemas y PCB)
En esta entrada voy a presentar el diseño de la electrónica seleccionado para este proyecto. Incluye un importante novedad, y es que los circuitos electrónicos se van a montar en formato PCB de fabricación profesional.
Indice ‘Boya Iridium con Arduino‘ | Proyecto Elcano:
- Introducción
- Análisis de concepto y costes
- ⇒ Diseño electrónica (esquemas y PCB)
- Montaje hardware (próximamente)
- Programación en Arduino (próximamente)
- Lanzamiento y seguimiento (próximamente)
Para este proyecto he decido dar un salto y hacer el diseño electrónico de forma mas profesional utilizando la herramienta KiCad. Aprovechando que la herramienta permite también diseñar PCB, toda la electrónica de este proyecto estará montada sobre PCB de fabricación profesional (JLCPCB.com).
Antes de nada, quiero aclarar un par de temas relacionado con la disposición de los componentes dentro de la caja (la boya propiamente dicha). La boya estará compuesta por dos niveles, un nivel superior (con la placa solar, el módulo GPS con la antena, el módulo Iridum y un pequeño PCB) y un nivel inferior (con el PCB principal). Lo veremos todo más adelante en otra entrada, cuando comience con el montaje:
Si bien haber situado el PCB principal en el nivel superior hubiese simplificado el cableado, he decidido hacerlo así para evitar que la electrónica esté al sol, y evitar sobrecalentamientos. Además de esto, las dimensiones de la placa solar tampoco hubiesen permitido situar el PCB en el nivel superior. Como contrapartida, hacerlo así obliga a tener un pequeño PCB en en el nivel superior para poder llevar algunas funcionalidades muy concretas al nivel superior y facilitar la accesibilidad.
PCB inferior (principal) y PCB superior (secundario)
En esta entrada nos centraremos en el diseño electrónico de esquemas y PCB.
- PCB inferior: PCB principal, donde irá toda la electrónica. Este PCB irá situado físicamente en la parte inferior de la boya, por lo que quedará bastante inaccesible una vez terminado el montaje, ya que quedará debajo del nivel superior. Tiene unas dimensiones de 122mm x 86mm:
- PCB superior: pequeño PCB que irá en la parte superior de la boya, para tener acceso a ella al abrir la tapa transparente sin tener que desmontar nada. Solo incorpora un led, que parpadeará cada aproximadamente 3 segundos para estar seguros de que todo funciona correctamente a través de la tapa, y un jumper, para aislar la batería (que irá en el PCB inferior) de forma fácil:
PCB inferior (PCB principal) | Diseño explicado
A continuación, vamos a analizar los esquemas y el diseño del PCB inferior o PCB principal, bloque por bloque:
Etapa de entrada
La etapa de entrada está compuesta principalmente de la placa solar, el cargador de baterías, y la batería de Li-ion.
Componente | Fabricante | Referencia |
Conector en PCB inferior (J4) | JST Sales America | B2B-PH-K-S(LF)(SN) |
Diodo Schottky (D5) | Micro Commercial | 1N5820-TP |
Cargador de baterías (U1) | – | TP4056 |
Batería (BT1) | RS PRO | 880-1558 |
Placa solar | Seeed Technology | 313070005 |
La etapa de entrada está compuesta por un conector macho JST de dos pines (J4) donde se conectará la placa solar, que ya incorpora cable y conector compatible. He utilizado un diodo Schottky (D5) como protección para bloquear posibles corrientes circulando hacia la placa solar. El cargado de baterías que he utilizado es el TP4056 (U1) que ya había utilizado anteriormente en otro proyecto, será el encargado de cargar la batería con la energía de la placa solar. La batería seleccionada es de 2600mAh, y comprada a un fabricante fiable como es RS. Cuidado con comprar baterías de Li-Ion en portales como Ebay, la mayoría son falsas. La función de jumper es poder aislar la batería de forma manual a la hora de hacer pruebas.
El cargador TP4056 irá situado en el borde del PCB y con el conector USB hacia afuera para facilitar la carga por USB y no tener componentes delante que puedan entorpecer la conexión del cable.
Por temas de optimización del espacio, la batería irá situada en el borde opuesto del PCB:
El cargador TP4056 admite una tensión de entrada máxima de 8V según la hoja de datos del fabricante, y la placa solar que he seleccionado genera hasta 8.2V en vacío. La caída de tensión en el diodo D5 es de 0.2V a corriente de 10uA, por lo que la tensión de entrada en el peor caso no debería superar los 8V. De todas formas este punto lo comprobaré in-situ al recibir la placa solar:
Conector auxiliar y PCB superior
El conector auxiliar es el nexo de unión entre el PCB superior y el PCB inferior. Si bien el nivel superior también van situadas placa solar, módulo GPS y módulo Iridium, estos no forman parte del PCB superior como tal, y llevan cables independientes de conexión con el PCB inferior. La conexión se hará utilizando un cable de 10 hilos, que unirá ambos conectores.
Componente | Fabricante | Referencia |
Conector J1 (PCB inferior) | Molex | 053047-1010 |
Conector J1 (PCB superior) | Molex | 053047-1010 |
Cable | Molex | 15134-1002 |
El objetivo de este conector (y por lo tanto, del PCB superior), es llevar algunas funcionalidades muy concretas al nivel superior para facilitar su accesibilidad. El conector que he utilizado el mismo que para conectar el módulo Iridium como veremos mas adelante en esta entrada, el objetivo de esto es ahorra costes utilizando el menor número de componentes diferentes posible. Estas funcionalidades son dos:
- Un led para conocer el estado del sistema a través de la tapa transparente. En realidad voy a utilizar 2 led, uno en cada PCB. El led del PCB inferior servirá únicamente para la etapa de pruebas.
- Un jumper para aislar la batería de forma fácil con solo abrir la tapa. Este jumper también irá en ambos PCB, pero el inferior servirá únicamente para la etapa de pruebas.
El esquema de este conector en el PCB inferior es el siguiente:
El esquema correspondiente en el PCB superior es el siguiente:
Alimentación Arduino (5V)
El objetivo de este módulo es elevar la tensión de batería (variable entre 3.3V y 4.2V), a 5V constantes. Para ello voy a utilizar 2 DC/DC elevadores, y 3 diodos. El objetivo de utilizar tantos componentes es hacer un OR de alimentaciones, y tener DC/DC redundantes.
Componente | Fabricante | Referencia |
DC/DC principal (J8) | Polulu | U3V12F5 |
DC/DC auixiliar (J7) | Polulu | S7V8A |
Diodo Schottky (D1, D2, D3) | Micro Commercial | M1N5820-TP |
El DC/DC es un componente pequeño (1cm x 1cm) y muy barato (0.5€), pero de una importancia vital. Es la fuente que suministrará la energía a muchos de los componentes electrónicos mas importantes, entre otros, la placa Arduino y el módulo GSP. Si este pequeño componente falla y deja de suministrar los 5V, perdemos completamente todo, es un elemento crítico. Para intentar paliar esta situación, he añadido un DC/DC redundante, y la posibilidad de alimentar la electrónica directamente desde batería a través del diodo D1 en caso de que ambos DC/DC fallen. Utilizando diodos generamos un OR de alimentaciones, donde la salida de tensión mas elevada será la única que alimente la electrónica.
- DC/DC principal: el DC/DC principal será el central (conector J8 de 3 pines). Este suministrará los 5V necesarios para alimentar la electrónica.
- DC/DC auxiliar: He añadido un DC/DC auxiliar (conector J7 de 4 pines) que se puede activar y desactivar mediante una salida digital desde la placa Arduino. Por defecto estará apagado (salida a 0V). En caso de que el el DC/DC principal falle, se activará este.
- Alimentación directa desde batería: En caso de que ambos DC/DC fallen, o para la transición desde que el principal falla y hasta conectar el auxiliar, la electrónica pasará a alimentarse directamente desde la batería a través del diodo D1. Es un modo al que nunca se debería llegar, ya que módulos como el GPS no admiten tensiones tan bajas. Es solo para en caso de perder ambos DC/DC, tener una fuente de alimentación extra para no perderlo todo y conseguir alargar la vida de la boya.
En funcionamiento normal, el DC/DC principal tendrá 5V a la salida, el auxiliar estará apagado, y la tensión de batería estará como mucho a 4.2V, por lo que solo conducirá el diodo D3 y toda la corriente la suministrará el DC/DC principal.
En caso de que este falle, la tensión a la salida de este DC/DC caerá a 0V, por lo que empezará a conducir el diodo D1. Utilizando una entrada analógica monitorizaré cual es la tensión que tenemos a la salida del OR de alimentaciones, y si se detecta que esta ha hasta 4.2V, significará que el DC/DC principal ha dejado de funciona y que está conduciendo el diodo D1 (alimentación directa desde batería). En este caso, a través de una salida digital de la placa Arduino activaré el DC/DC auxiliar, que es el que comenzará a suministrar los 5V de salida.
En caso de que este también falle, conducirá el diodo D1 y la electrónica pasará a alimentase directamente desde batería.
Lectura de la tensión de batería y salida 5V
Utilizando entradas analógicas el sistema hará lecturas periódicas tanto de la tensión de batería como de la tensión a la salida de 5V.
Esta funcionalidad es bastante simple y no presenta dificultad especial. De todas formas, la lógica presentada en el apartado anterior exige pensar en como se va a hacer la lectura de la tensión cuando la propia tensión de alimentación de la placa Arduino varía. Es un bucle infinito: queremos leer la tensión de alimentación que le llega a la placa Arduino, pero para ello necesitamos conocer cual es esa tensión de alimentación para hacer la conversión. Es la pescadilla que se muerde la cola:
void loop() { valor5V = analogRead(A4); voltage = valor5V * (5.0 / 1023.0); }
El problema aquí es que lo 5.0 / 1023.0 voltios utilizados para la conversión no tiene por que ser 5V siempre… al conducir el diodo D1 y alimentar la placa Arduino directamente desde batería, habría que hacer la conversión con la propia tensión de batería, que es la tensión que estamos intentado leer, la cual no conocemos.
Para solucionar esto, voy a utilizar como referencia la salida de 3.3V que incorpora la placa Arduino para hacer las lecturas de tensión. Esta salida se mantiene constante a 3.3V independientemente de la tensión de alimentación de la placa Arduino (siempre que esta sea superior a 3.3V claro). Esto me permite leer la tensión de entrada sin conocer a que tensión se está alimentando la electrónica:
void loop() { valor3_3V = analogRead(A3); valor5V = analogRead(A4); voltage = valor5V * 3.3 / valor3_3V; }
Por último, añadir que la lectura de tensión de batería y de alimentación 5V se hará a través de una resistencia de 10k para evitar alimentar la placa Arduino a través de las entradas analógicas como ya me ha pasado anteriormente.
MPU6050 y Watchdog
El conexionado de estos dos módulos es muy sencillo, y no requiere de explicaciones.
Por mencionar algo, he decidido alimentar el Watchdog directamente desde tensión de batería, ya que el consumo es menor, y necesito que esté siempre alimentado.
El sensor MPU6050 en cambio, lo he alimentado desde una salida digital de Arduino debido a su bajo consumo. Esto me permitirá resetear si se detecta que el sensor deja de funcionar, e incluso quitar alimentación cuando no se use para ahorrar energía. De todas formas, en sensor MPU6050 cuenta con un modo de bajo consumo, donde este cae hasta 50uA, y no será necesario quitar la alimentación al sensor:
La localización de estos componentes en el PCB es la siguiente:
Módulo GPS
El módulo GPS irá situado en el nivel superior, ya que necesita tener visión clara del cielo para comunicarse de forma efectiva. Al estar toda la electrónica de control en el PCB del nivel inferior, se utilizará un cable de 6 hilos y un conector de 6 pines para comunicar este módulo con la placa Arduino. La distancia entre pines es de únicamente 1mm, por lo que la soldadura en el PCB se podría complicar:
Componente | Fabricante | Referencia |
Conector en PCB inferior (J2) | JST Sales America | BM06B-SRSS-TB(LF)(SN) |
Cable | JST Sales America | A06SR06SR30K152A |
Módulo GPS | GLOBALSAT | EM-506 |
MOSFET (Q2) | ON-Semiconductor | FDP7030BL |
El conexionado del módulo seleccionado se muestra a continuación. Este módulo necesita alimentación de 5V, por lo que se alimentará de este potencial (salida del DC/DC).
Las entradas asociadas en la placa Arduino son las siguientes. Utilizaré la librería SoftwareSerial.h (pines D3 y D4) para las comunicaciones por puerto serie, ya que las salidas RX y TX de la placa Arduino las he reservado para el módulo Iridium. El GPS cuenta con una señal Directive que indica el estado de la señal GPS. He reservado un pin para esta señal a pesar de no tener claro aun si la utilizaré para algo:
Puede llamar la atención el MOSFET utilizado en el potencia GND. Este MOSFET será en encargado de cortar la alimentación del módulo GPS cuando estemos en modo bajo consumo. Debido a que el módulo GPS ya cuenta con una función de bajo consumo que se activa por software, puede que no sea necesario conectar/desconectar el módulo cada vez que se quiera utilizar. Para ello he añadido el jumper JP2. De esta forma, una vez que tenga el módulo en mis manos y haga pruebas de consumo, si considero que la función software de bajo que consumo que incluye es suficiente, no montaré el MOSFET y lo puentearé con el jumper JP2.
Módulo Iridium
Igual que el módulo GPS, el módulo Iridium irá en el nivel superior, ya que necesita tener visión clara del cielo para comunicarse de forma efectiva. Al estar toda la electrónica de control en el PCB del nivel inferior, se utilizará un cable de 10 hilos y un conector de 10 pines para comunicar este módulo con la placa Arduino.
Componente | Fabricante | Referencia |
Conector en PCB inferior (J3) | Molex | 053047-1010 |
Cable | Molex | 15134-1002 |
Módulo Iridium | RockBlock | |
MOSFET (Q1) | ON-Semiconductor | FDP7030BL |
Este módulo se alimentará directamente desde batería, ya que puede funcionar alimentado de esta forma. De esta forma evitamos sobrecargar el DC/DC y evitarnos las pérdidas que se generan:
Las entradas asociadas en la placa Arduino son las siguientes. Al igual que el módulo GPS, este se comunica por puerto serie. Tiene varias salidas más, como Ring o NetAv, para los que he reservado entradas digitales en la placa Arduino a pesar de no saber si las usaré:
He utilizado la misma lógica de MOSFET + jumper por si el modo bajo consumo activado por software que incorpora no fuera suficiente y quisiera desconectarlo cada que vaya a estar tiempo sin utilizarse.
Placa Arduino
Con todo lo mencionado anteriormente, las entradas/salidas de la placa Arduino han quedado ocupadas casi al completo:
Realizaré algunas modificaciones en el hardware de la placa Arduino Nano para reducir su consumo en modo sleep y reducirlo a tan solo 90uA (micro-amperior).
Fabricación de PCB
Los PCB será fabricados en China por JLCPCB.com, un gigante de este mundo, que tiene unos precios realmente bajos. Sin contar el envío, el PCB inferior me ha costado unos 1.2€/unidad, y el superior unos 0.3€/unidad.
Realmente merece la pena dedicar algo de tiempo a aprender como utilizar software de diseño PCB (yo he utilizado KiCad), ya que en sistemas complejos como este, hacer la soldaduras a manos puede ser un quebradero de cabeza, además de un punto débil al depender la vida del proyecto de tu habilidad para soldar. Para mi ha sido la primera vez, y no puedo estar mas contento.
Y gracias a la magia de Internet…
… las placas han llegado ya a mi casa. Como veis, me he decantado por hacer PCB de color blanco. He montado algunos componentes para que veáis como quedará 🙂
Siguiente entrada del proyecto Elcano:
- Introducción
- Análisis de concepto y costes
- Diseño electrónica (esquemas y PCB)
- ⇒ Montaje hardware (próximamente)
- Programación en Arduino (próximamente)
- Lanzamiento y seguimiento (próximamente)
Excelente…seguiré de cerca tu trabajo pues he pesando crear una adaptación al mío. Arduino nos abre un mundo de posibilidades… quien sabe, quizás tu boya Elcano, al ser Open Source, podrá ser adaptada a otros proyectos acuáticos, como un submarino autónomo que nos ofrezca las mejores imágenes del desconocido fondo submarino, o que detecte amplias zonas acuáticas contaminadas por plástico… Creo que tiene un sin fin de posibilidades… Agradezco desde ya, que compartas tus conocimientos. Un saludo y adelante, como diría Juan Sebastián Elcano.
Gracias por tu comentario Jorge. ¿estas trabajando en algo similar?
Un saludo 😉
Muchas gracias por tu blog y tus publicaciones.
Yo si que estoy metido en un «fregao» de narices haciendo un ROV (Remotely Operated Vehicle), Vehículo submarino operado remotamente, básicamente es un mando de PS2, con el que controlo todos los movimientos del robot, un Arduino en el puesto de control que recoge las señales del mando PS2 y las envía por comunicación serie a otro Arduino que esta dentro del vehículo, que es el que ejecuta las ordenes a motores y sensores, y que envía los datos de los sensores al Arduino del puesto de control, a demás tengo video en vivo en el puesto de control.
Tampoco es cuestión de extenderme aquí mucho mas, llevo 4 años con el proyecto.
Un saludo a todos
Buenas, parece muy interesante! tiene pensador publicar el trabajo en algún sitio?
Te mande un Email con mas explicaciones sobre la pagina del data logger
https://thecavepearlproject.org/how-to-build-an-arduino-data-logger/
y con el enlace a donde estoy publicando de momento mis progresos y fracasos
https://www.foromodelismonaval.es/viewtopic.php?f=46&t=16061
y con el enlace a Github con la explicación de mi proyecto
https://github.com/asesorplaza1/Programas-ROV-en-evoluci-n
A ver si tengo tiempo estas Navidades y actualizo un poco el Github, que falta le hace.
Felices Pascuas a todos.