En esta ocasión escribiré acerca de un circuito integrado con características muy especiales, un potenciómetro digital. En pocas palabras, es un circuito integrado que tiene la capacidad de variar su resistividad a través de una señal digital.
El circuito integrado X9C103P, un potenciómetro digital capaz de variar la resistividad de un circuito desde un entorno digital. En este post se explicará como utilizar este circuito, utilizando como controlador un Arduino Leonardo
Hasta ahora hemos utilizado algunos potenciómetros como resistencias variables el algunos proyectos.
Como sabemos, al mover la perilla variamos la resistencias entre las patas del potenciómetro. Un potenciómetro digital tiene un funcionamiento similar, pero por ser digital no tenemos que mover una perilla ,sino excitar una entrada del circuito para obtener diferentes resultados.
Potenciómetros digitales
El circuito integrado X9C103P forma parte de una familia de circuitos integrados que tienen la función de un potenciómetro. Entre la «C» y la «P» se coloca una numeración. En este caso es 103, lo que significa 10×10^3. Eso equivale a 10000 Ohm, es decir, 10KOhm por lo que el circuito X9C103P solamente podrá alcanzar un valor máximo de 10K.
Existen los modelos 102 (1K), 104(100 K) y 503(50K). Cada uno es un arreglo de 100 resistencias. En el modelo de 10K cada resistencia es de 100 Ohm. En el modelo de 1 K son 100 resistencias de 10 Ohm; en el modelo de 50K son 100 resistencias de 500 Ohm; en el modelo de 100K son 100 resistencias de 1 K cada una.
Estos potenciómetros pueden ser adquiridos desde Mouser, Jameco, Ebay, Amazon, etc. El precio es bastante accesible, lo cual permite considerar este tipo de circuito como una opción viable para los proyectos en los que sea necesario emplearlos
Características del circuito integrado
El esquemático de esta familia de circuitos integrados es el siguiente:
Pin No. |
Nombre del Pin |
Descripción |
1 |
INC |
Incremento. Cuando se le aplica una señal de onda cuadrada en esta pata el circuito aumenta o reduce el valor de su resistividad dependiendo del estado en que se encuentre la pata U/D |
2 |
U/D |
Up/Down. Dependiendo del estado de esta pata cuando se aplique una onda cuadrada en el INC el valor de la resistencia subirá o bajará. |
3 |
VH/RH |
Este es el equivalente de una de las patas del potenciómetro, específicamente una de las 2 patas situadas en los extremos. |
4 |
VSS |
Voltaje de salida (GND) del circuito. Se conecta a tierra. |
5 |
VW/RW |
Este es el equivalente una de las tres patas del potenciómetro, específicamente la pata del centro. Se le llama “wiper” |
6 |
VL/RL |
Este es el equivalente de una de las patas del potenciómetro, específicamente una de las 2 patas situadas en los extremos. |
7 |
CS |
Esta pata es prácticamente el activador/desactivador del dispositivo. Cuando está en estado LOW es posible cambiar la resistividad del potenciómetro. Una vez pase a un estado HIGH el circuito guardará la resistencia en dicho instante en una memoria no volátil que es capaz de mantener dicho valor por un periodo muy extenso, siendo posible guardar una configuración por un tiempo de hasta 100 años. |
8 |
VCC |
Voltaje de entrada (V+) del circuito. Se conecta al voltaje de alimentación. |
Para configurar este circuito integrado necesitamos una serie de combinaciones de estados HIGH/LOW, lo que hace un poco complicado utilizarlo de forma manual. Sin embargo utilizando un micro controlador como Arduino se hace muy fácil aumentar, reducir y guardar la resistividad en este circuito.
Utilizando el potenciómetro con Arduino
Ahora vamos a armar un sencillo diagrama con el que nos será posible manipular el estado del circuito con Arduino.
Como vemos es muy fácil de usar.
- Conectamos la pata 1 al pin 2 de Arduino, la pata 2 al pin 3, la pata 7 al pin 4.
- La pata 4 va a GND y la pata 8 va a V+.
- Entre las patas 3 y 5, o bien, 5 y 6 es donde medimos la resistencia. Recordemos que en los potenciómetros mecánicos tenemos 2 opciones, medir la resistencia entre la pata 1 y 2 y entre la pata 2 y 3.
- Acá es lo mismo, solo usaremos la 5 y 6 o la 3 y la 5.
La programación de Arduino se hace completamente sencilla a través del uso de una librería escrita por Timo Fager. Se llama DigiPotX9Cxxx y la podemos encontrar en el siguiente enlace:
https://sites.google.com/site/tfagerscode/home/digipotx9cxxx
Recuerden que hay que copiar el contenido de la carpeta que descargamos en la carpeta libraries en la raíz de Arduino, es decir, la carpeta donde tenemos instalado Arduino IDE.
El código a usar es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <DigiPotX9Cxxx.h> DigiPot pot(2,3,4); int input; void setup() { Serial.begin(115200); } void loop() { if (Serial.available()>0){ inpue=Serial.read(); if (input=='1'){ pot.increase(1); } else { pot.decrease(1); } } } |
Subiendo este código a Arduino, abrimos el Monitor Serial. Con enviar un «1» aumentaremos la resistencia la cantidad de veces que enviemos el uno. Con un «0» o cualquier otro carácter reduciremos la resistencia.
El valor mínimo será cercano a 0 y el valor máximo será próximo a 10K. He aquí un video donde les presento el armado del circuito y el funcionamiento del mismo.
[youtube https://www.youtube.com/watch?v=FttpYV3__Yo]
Cualquier duda me la pueden expresar a través de sus comentarios. Saludos.
Hola, estoy pensando en montar este circuito en una Raspberry Pi pero desconozco a que pin de GPIO debo connectar la pata 1, la 2 y la 7. Sabrías indicar cuales son las salidas de RPI adecuadas. Cualquira valdria o deben ser SPI, I2C u otras siglas que desconozco?
Muchas gracias y muy buen trabajo!
¿Cuál es la potencia que soportan estos circuitos?
No mucha. Solo 10mA a 5 voltios. Eso es 50 mW
Poca potencia. 10mA @ 5 volts
Que tal. Tienes un pequeño problema en tu código. En la línea 12 debe ser «input» y los tienes como «inpue»
Gracias por la observación
Hola
Muchas gracias por el tutorial.
Con un potenciometro funciona perfectamente. Pero quiero poner tres n el mismo programa y qe se activen independientemente.
Sería posible?
Sí es posible. Pero debes ajustar el código
amigo es lo que me referia, que si puedo poner mas potenciometros por ejemplo 6 para el control de 6 luminarias con un solo arduino, o necesito implementar mas arduinos?
Recuerda que estos circuitos solamente trabajan en base a 5 volts y 10 mA. Tienes que pensar muy bien si vas a usarlos para controlar luminarias
Hola! ¿Podrías orientarme a cómo programarlo en MatLab?
Parabéns pela postagem, você foi claro é direto, estou aqui do Brasil implementado seu tutorial em um circuito de controle industrial. Abraços
Hola Antonio
Gracias por su sensacional trabajo. He realizado el circuito descrito, pero no me funciona. Lo he probado con un Arduino Uno, Nano y un Mega2560, y con ninguno de ellos me ha llegado a funcionar. Los X9C103P los he adquirido en China.. podria ser ese el problema?. Gracias y saludos
Hola amigo. Cómo sabes que no te funciona?
Pues que a la salida de las patillas con un multimetro puesto y pulsando el 1, no cambia el valor….
Hola, pues he conectado el multimetro y no varia el valor de la resistencia.
Muestrame tus conexiones
Hola. Gracias por el aporte. Estoy creando una fuente y deseo regular el voltaje con digipot y pulsadores. La cuestión funciona a medias.
1- Usando la librería. Estas obligado a llamar al método reset() de ella, antes de empezar. En caso contrario, el digipot se inicia con valor de 255 y de ahí no se mueve.
2- Lo mas importante para mi, es mantener el ultimo valor.(Si ese que dice almacenar 100 años). pero es imposible. Al apagar tiene el problema de que, si no haces reset, vuelve con el valor de 255, y si lo hace, valor 0…..
3- He intentado pasar de la librería y usarlo a pecho, definiendo las conexiones una a una, y aplicando los cambio por patilla, no hace caso ninguno a ningún cambio.
Os pongo el programa mezclado. usando la librería y en forma directa. Si podéis arrojar algo de luz al tema, quedaría agradecido. Objetivo principal es que arranque con el ultimo valor……
#include
DigiPot potAmp(2,3,4);
int botonLAmp = A0;
int botonRAmp = A1;
int pot = 0;
int inc = 2;
int u_d = 3;
int cs = 4;
void setup() {
pinMode( botonLAmp , INPUT) ; //botón Izquierdo Amperios
pinMode( botonRAmp , INPUT) ; //botón Derecho Amperios
pinMode( inc , OUTPUT) ;
pinMode( u_d , OUTPUT) ;
pinMode( cs , OUTPUT) ;
Serial.begin(9600);
// potAmp.reset();
// potAmp.set(50);
}
void loop() {
int ampL = digitalRead(botonLAmp) ; // leemos el valor de boton Izq Amp
int ampR = digitalRead(botonRAmp) ; // leemos el valor de boton Der Amp
if (!ampR){
digitalWrite(cs ,LOW);
potAmp.increase(1);
digitalWrite(inc,HIGH);
digitalWrite(u_d,HIGH);
digitalWrite(cs ,HIGH);
Serial.print(«Derecha = «);
Serial.println(ampR);
pot = potAmp.get();
Serial.print(«Pot = «);
Serial.println(pot);
delay(200);
}
if (!ampL){
digitalWrite(cs ,LOW);
potAmp.decrease(1);
digitalWrite(inc,HIGH);
digitalWrite(u_d,LOW);
digitalWrite(cs ,HIGH);
Serial.print(«Izquierda = «);
Serial.println(ampL);
pot = potAmp.get();
Serial.print(«Pot = «);
Serial.println(pot);
delay(200);
}
}
Podrías estimar le posición del potenciómetro a través de un divisor de voltaje
bnas noches mi querido amigo
solicito tu gran ayuda no soy experto pero estoy experimentando con arduino y necesito una mano…
tengo un potenciometro digital conectado a una placa arduino uno y tengo problemas con el codigo…
lo que quiero hacer es que desde un scrollbar de app inventor poder subir o bajar el potenciometro digital…
estoy haciendo un mapeo en el codigo arduino pero no me funciona muy bien, si puedes echarme una mano gracias….
#include
DigiPot potAnt(2,3,4);
int input;
int potsube, potbaja;
int inc = 2;
int u_d = 3;
int cs = 4;
void setup(){
Serial.begin (9600);
pinMode( inc , OUTPUT) ;
pinMode( u_d , OUTPUT) ;
pinMode( cs , OUTPUT) ;
}
void loop() {
while ( Serial.available()>0){
input = Serial.read();
input = map(potsube, 0, 1023, 0,9);
potAnt.increase(potsube);
delay(150);
input = map(potbaja, 0, 1023, 99, 0);
pot.decrease(potbaja);
delay(200);
}
}
Hola. No estoy seguro como funciona tu potenciómetro. No tengo forma de probar tu código
/*
* DigiPot.pde – Example sketch for Arduino library for managing digital potentiometers X9C1xxx (xxx = 102,103,104,503).
* By Timo Fager, Jul 29, 2011.
* Released to public domain.
*
* For this example, connect your X9C103P (or the like) as follows:
* 1 – INC – Arduino pin 2
* 2 – U/D – Arduino pin 3
* 3 – VH – 5V
* 4 – VSS – GND
* 5 – VW – Output: 150 Ohm resistor -> LED -> GND
* 6 – VL – GND
* 7 – CS – Arduino pin 4
* 8 – VCC – 5V
*
**/
#include
String inData = «»;
boolean toggleComplete = false;
boolean toggleComplete2 = false;
int estat = 0;
DigiPot pot(2,3,4);
void setup() {
Serial.begin(9600);
pinMode(13,OUTPUT);
/*
for (int i=0; i<100; i++) {
Serial.print("Increasing, i = ");
Serial.println(i, DEC);
pot.increase(1);
delay(200);
}
for (int i=0; i 0 && toggleComplete == false && toggleComplete2 == false) {
while(Serial.available() > 0){
char received = Serial.read();
//Serial.println(«RECIBIDO»);
String received1 =»»;
received1.concat(received);
if(received == ‘E’){ // end character for toggle LED
toggleComplete = true;
Serial.println(«E DETECTED»);
}else if(received == ‘A’){ // end character for toggle LED
toggleComplete2 = true;
Serial.println(«A DETECTED»);
}else if(received == ‘F’){ // end character for toggle LED
control = 1;
Serial.println(«F DETECTED»);
}
else if(received!=’E’ && received1.toInt()>=0 && received1!=» » && received1!=»» && received1!=»\r» && received1!=»\n» && received!= ‘A’ && received != ‘E’ && received1!=»\r\n»){
inData.concat(received1);
//dato.concat(received);
if(estatus==0){Serial.println(«OK»); dato1.concat(received);estatus++; }
else if(estatus==1){ dato2.concat(received) ; estatus++; }
else if(estatus==2){ dato3.concat(received);estatus++;dato3.concat(dato2);dato3.concat(dato1); }
Serial.print(«ESCRITO EL NUMERO –> «);
Serial.println(received);
Serial.print(«Y GUARDADO HASTA AHORA -> «);
Serial.print(dato3);
}
}
// Serial.println(«INTO WHILE»);
}
estatus = 0;
//Serial.println(«OUTWHILE»);
toggleComplete = false;
toggleComplete2 = false;
if(inData!=»»){
Serial.println(inData);
}
if(inData!=»» && control!=1){pot.increase(inData.toInt());Serial.print(«incremento»);Serial.println(inData.toInt());}
else if(inData!=»» && control!=0){pot.decrease(inData.toInt()); control=0;;Serial.print(«decremento»);Serial.println(inData.toInt());}
/*
for(int i= 0 ; i<= inData.toInt()/100;i++){
digitalWrite(13,HIGH);
delay(200);
digitalWrite(13,LOW);
delay(200);
}
for (int i=0; i<100; i++) {
Serial.print("Increasing, i = ");
Serial.println(i, DEC);
pot.increase(1);
delay(200);
}
*/
/*
//Serial.println("Starting");
for (int i=0; i<100; i++) {
Serial.print("Increasing, i = ");
Serial.println(i, DEC);
pot.increase(1);
delay(200);
}
for (int i=0; i<100; i++) {
Serial.print("Decreasing, i = ");
Serial.println(i, DEC);
pot.decrease(1);
delay(200);
}
*/
}
Hola es muy bueno
Para controlar el voltaje de salida de una fuente regulada 0-30V 5A SERIA IDEAL
Si no fuese así, un circuito para controlar el voltaje de salida de una fuente regulada 0-30V 5A
TOUCH (Potenciómetro táctil )
saludos
Como hago para el ESP32 de 38 pines? es el mismo código?? Lo estoy programando en el mismo IDE de Arduino