Hola, hoy os traigo algo que llevo tiempo queriendo hacer. Se trata de una fuente de alimentación variable con Arduino y un cargador compatible con QC3. Con ella conseguiremos por ejemplo, una salida con un rango de voltajes comprendido entre 3.6v y 20v en saltos de 200mv.

En resumen, entre las utilidades de la fuente de alimentación, podemos destacar el poder ajustar el voltaje de salida. También, podemos usarlo para ajustar el voltaje requerido para nuestros proyectos. Si por ejemplo, nuestro proyecto requiere de 12v para funcionar, podemos configurarlo al arranque con este módulo, y así hacerlo compatible con cargadores QC3.

Lo primero que tenemos que hacer, es instalar la librería QC3Control, la cual nos permitirá comunicarnos con el cargador de forma fácil y rápida. Esta librería la podemos instalar a través del IDE o descargándola desde su página de GitHub, siguiendo los pasos de mi otro tutorial.

Una vez instalada, dispondremos de varios ejemplos que nos ayudarán a manejarla con facilidad, pero en este post os explicaré una a una, todas las funciones de esta librería. Esto es importante, ya que nos ayudará a comprender mejor cómo funciona, y cómo podemos modificar el sketch si queremos añadir funcionalidades por ejemplo.

begin()

La primera función es begin(), la cual simplemente inicializa la librería para que pueda ser usada. Esta función hay que usarla siempre en el setup, y preferiblemente al final del mismo para reducir el tiempo en el que el microcontrolador estará en espera. Esto es debido a que el cargador espera que el dispositivo conectado esté durante cierto tiempo con los pines Data+ y Data- a 0.6v para activar el modo QC.

Para poder usar el modo continuo, es necesario que dispongamos de un cargador QC3 compatible con la clase B, además de tener que inicializar la librería indicándoselo con begin(true);.

La ejecución de esta función es opcional, ya que el programador hizo que su ejecución se realizara si intentábamos cambiar el voltaje sin haberlo hecho antes. Aún así, se recomienda su ejecución para que así quede constancia de que se está inicializando el módulo.

Modos estándar

Entre los dos modos disponibles, el estándar es el primero del que hablaremos. Este modo nos permite sacar voltajes estándar del cargador sin complicarse mucho, ya que tan sólo será necesario ejecutar la función. Esta función se puede ejecutar en el setup también tras la función begin().

set5V

Esta función tal y como indica, sirve para configurar la salida de voltaje a 5v. Teniendo en cuenta que es el voltaje estándar de los cargadores, esta función sólo nos será útil si estamos en otro voltaje y queremos cambiar.

set9v

Esta función cambiará el voltaje de salida a 9v.

set12V

Bueno, sé que no hace falta explicar para qué sirve esta función, pero aún así rellenaré el espacio diciendo que sirve para cambiar a 12v la salida :P.

set20V

Esta función al igual que las anteriores, sirve para cambiar el voltaje de salida a 20v. En este caso tengo que añadir que este voltaje sólo está disponible si disponemos de un cargador QC3 de clase B, e inicializamos la librería en ese modo. En el caso de no inicializar la librería en ese modo, la función simplemente no hará nada.

Modo continuo

El modo continuo es el modo que nos interesa para nuestra fuente de alimentación variable con Arduino, ya que nos permitirá ajustar el voltaje. Este voltaje se deberá ajustar entre 3.6v y el voltaje máximo de nuestro cargador. Este voltaje puede ser 12v, o 20v en el caso de cargadores de Laptops. El ajuste de voltajes se hará en incrementos de 200mv, por lo que no podremos ajustar el voltaje a 4.3v. En este caso habría que hacerlo a 4.2v o 4.4v. También hay que tener en cuenta que para usar este modo, necesitamos un cargador compatible con QC3, ya que los cargadores QC2 no son compatibles.

Este modo no hace falta activarlo de forma explícita, ya que la librería se encarga de ello por nosotros (además la función es privada). En este modo disponemos de las siguientes funciones.

incrementVoltage

Empezaremos por la función incrementVoltage, la cual incrementará el voltaje de salida de la fuente de alimentación en 200mv.

decrementVoltage

Esta función es la contraria a comentada anteriormente, por lo que lo que hará será reducir el voltaje de la fuente de alimentación en 200mv.

setMilliVoltage

Con esta función podremos ajustar el voltaje directamente a los milivoltios que deseemos. Así no será necesario ejecutar las funciones de arriba hasta conseguirlo. Esta función comprobará si el voltaje es compatible, por lo que si se le indica un voltaje no compatible, la función lo ajustará al más cercano.

setVoltage

Esta función se podría decir que es un alias de la anterior, sólo que en este caso recibe el voltaje en voltios en lugar de en milivoltios.

getMilliVoltage

Además de poder configurar el voltaje de salida con las funciones anteriores, podemos saber cuál es el voltaje actual con getMilliVoltage. Esta función devolverá el voltaje en milivoltios.

getVoltage

Por último disponemos de la función getVoltage, la cual es igual que la anterior, sólo que en este caso nos devolverá el voltaje en voltios.

Personalmente creo que estas dos últimas funciones son poco útiles, ya que no recuperan el voltaje real de la fuente, sino el que cree la librería que tiene. Pienso que lo más recomendado para saber el voltaje de la fuente, es utilizar un divisor de tensión junto con el ADC de Arduino. Esto nos permitirá asegurarnos de que el voltaje es efectivamente el que esperamos.

Fuente variable con Arduino, usando QC3

Creo que va siendo hora de que nos centremos en el tema que seguramente te habrá traído a este post, ya que seguramente esperas poder hacer tu fuente tras haber terminado de leer 😉

Si el texto de arriba te pareció un poco aburrido y te lo saltaste, te diré que este tipo de fuente es sólo válido para cargadores QC3, ya que los de tipo QC2 no son compatibles con el ajuste dinámico de voltaje.

Ten en cuenta que para la realización de esta fuente de alimentación no es necesario que desarmes ningún cargador, ya que el circuito lo que hace es usar el ajuste dinámico de los cargadores QC3.

Circuito básico de la fuente variable

Para el circuito básico necesitaremos los siguientes componentes:

  • Un Arduino, por supuesto, aunque si nuestra finalidad es simplemente crear un selector de voltaje para nuestro proyecto, nos puede servir cualquier microcontrolador compatible. Por ejemplo, un ATTiny85, o incluso un ATTINY13A o un ATTINY10 que son más baratos.
  • Un regulador de 5v o 3.3v dependiendo del microcontrolador, pero es muy importante que soporte al menos el voltaje máximo que vayas a solicitar a la fuente. También se recomienda que sea del tipo de baja caída de voltaje (LDO), así incluso con un voltaje de 5v, tendremos un voltaje suficiente en la salida. Podemos usar un LP2950 por ejemplo, que tiene un voltaje máximo de 30v y la caída de voltaje es de tan sólo 0.6v.
  • Dos condensadores cerámicos de 1pf para ayudar a la estabilidad del regulador.
  • Cuatro resistencias de 10k, dos de 470Ω, y dos de 1.5k, las cuales servirán de apoyo a la librería, ya que la ayudará a conseguir los voltajes necesarios por el protocolo QC3.

Y el esquema del circuito sería el siguiente:

En este circuito, la alimentación del Arduino correrá por parte del USB, el cual comenzará con 5v. Al poder aumentar hasta 20v dependiendo del voltaje que seleccionemos, necesitaremos de un regulador que soporte ese voltaje máximo, y alimente nuestro Arduino con 5v estables. Estos 5 voltios también alimentarán los divisores de tensión utilizados para conseguir el voltaje requerido por el protocolo QC, además de para alimentar los botones.

El código que usaremos en nuestro Arduino será el siguiente:

#include <QC3Control.h>

//Pin 4 for Data+
//Pin 5 for Data-

//See How to connect in the documentation for more details.
QC3Control quickCharge(4, 5);

#define waitTime 500

unsigned long latestPush = 0;

void setup() {
  attachInterrupt(digitalPinToInterrupt(2), decreaseV, RISING);
  attachInterrupt(digitalPinToInterrupt(3), increaseV, RISING);
  
  quickCharge.begin();
}

void loop() {
  //delay(5000);
  //quickCharge.incrementVoltage();
}

void decreaseV(){
  if (millis() > (latestPush + waitTime)){
    quickCharge.decrementVoltage();
    latestPush = millis();
  }
}

void increaseV(){
  if (millis() > (latestPush + waitTime)){
    quickCharge.incrementVoltage();
    latestPush = millis();
  } 
}

Como puedes observar, el código de arriba es bastante simple. Tan sólo esperamos a la interrupción de los pulsadores y entonces ejecutamos la función correspondiente.

Actualmente la librería no dispone de Feedback, por lo que el voltaje que tiene y cree tener puede no coincidir. Con el tiempo intentaré crear una que disponga de Feedback.

¡Espero que os haya gustado!, ¡un saludo!!

Daniel Carrasco

DevOps con varios años de experiencia, y arquitecto cloud con experiencia en Google Cloud Platform y Amazon Web Services. En sus ratos libres experimenta con Arduino y electrónica.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.