Tabla de contenido:

Potenciómetro digital dual DS1803 con Arduino: 5 pasos
Potenciómetro digital dual DS1803 con Arduino: 5 pasos

Video: Potenciómetro digital dual DS1803 con Arduino: 5 pasos

Video: Potenciómetro digital dual DS1803 con Arduino: 5 pasos
Video: Цифровые потенциометры и модуль на AD5245 2024, Mes de julio
Anonim
Potenciómetro digital dual DS1803 con Arduino
Potenciómetro digital dual DS1803 con Arduino

Me gusta compartir el uso de un potenciómetro digital DS1803 con un Arduino. Este IC contiene dos potenciómetros digitales que se pueden controlar a través de una interfaz de dos cables, para esto utilizo la biblioteca wire.h.

Este IC puede reemplazar un potenciómetro analógico normal. De esta forma puede controlar, por ejemplo, un amplificador o una fuente de alimentación.

En este instructable controlo el brillo de dos LED para mostrar el funcionamiento.

El arduino cuenta los pulsos de un codificador rotatorio y coloca el valor en la variable pot [0] y pot [1]. Cuando presiona el interruptor en el codificador, puede cambiar entre el potenciómetro [0] y el potenciómetro [1].

El valor real de los potenciómetros se lee desde el DS1803 y se coloca en potValue variable [0] y potValue [1] y se muestra en una pantalla LCD.

Paso 1: Conexiones del DS1803

Conexiones del DS1803
Conexiones del DS1803

Aquí puede ver las conexiones del DS1803. H es el lado alto del potenciómetro, L el lado bajo y W el limpiaparabrisas. SCL y SDA son las conexiones de bus.

Con las conexiones A0, A1 y A2 puedes darle al DS1803 su propia dirección, de esta manera puedes controlar más dispositivos a través de un bus. En mi ejemplo, le di al DS1803 una dirección 0 conectando todos los pines al suelo.

Paso 2: Byte de comando

Byte de comando
Byte de comando

La forma en que funciona el DS1803 se puede utilizar en el byte de comando. Cuando seleccionas "escribir potenciómetro-0" se seleccionan ambos potenciómetros, cuando solo quieres ajustar el potenciómetro-0, solo tienes que enviar el primer byte de datos. "Escribir potenciómetro-1" solo ajusta el potenciómetro-1. "Escribir en ambos potenciómetros" da a ambos potenciómetros el mismo valor.

Paso 3: Control del DS1803

Control del DS1803
Control del DS1803

El byte de control (figura 3) tiene un identificador de dispositivo, este permanece siempre igual. En mi ejemplo, A0, A1 y A2 son 0 porque seleccionamos direcciones poniendo todos los pines A a tierra. El último bit R / W se establecerá en 0 o 1 mediante el comando "Wire.beginTransmission" y "Wire.requestFrom" en el Arduino. En la figura 5 puede ver el telegrama completo. El telegrama leído se muestra en la figura 4.

Paso 4: configurar

Configurar
Configurar

Este circuito muestra cómo conectar todo. La pantalla LCD de Nokia está disponible con diferentes conexiones, asegúrese de conectar la suya correctamente. También el codificador rotatorio sus diferentes versiones, algunas tienen el común en el pin del medio y otras no. He puesto una pequeña red de filtros (resistencia de 470 ohmios con tapa de 100 nF) para filtrar las señales de salida A y B del codificador. Necesito este filtro porque la salida tenía mucho ruido. También puse un temporizador antirrebote en mi programa para cancelar algo de ruido. Por lo demás creo que el circuito está despejado. La pantalla LCD se puede solicitar a través de Adafruit

Paso 5: el programa

Para el uso del bus de 2 hilos incluyo la biblioteca Wire.h. Para usar el LCD, incluyo la biblioteca Adafruit que puede descargar de https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library también la biblioteca Adafruit_GFX.h está disponible aquí https:// github. com / adafruit / Adafruit-GFX-Library.

#incluir

#incluir

#incluir

Pantalla Adafruit_PCD8544 = Adafruit_PCD8544 (7, 6, 5, 4, 3);

Aquí puedes ver todas las variables. Byte de control y byte de comando como se describió anteriormente. El deBounceTime se puede ajustar según el ruido de su codificador.

potenciómetro de bytes [2] = {1, 1}; byte controlByte = B0101000; // 7 bits, byte commandByte = B10101001; // los 2 últimos bits son la selección del potenciómetro. byte potValue [2]; int i = 0; int deBounceTime = 10; // Ajusta este valor en función del ruido const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; unsigned long newDebounceTime = 0; unsigned long oldTime; booleano presionado = 0; recuento booleano = 1;

En la configuración, defino los pines correctos y coloco el texto estático en la pantalla LCD

configuración vacía () {Wire.begin (); Serial.begin (9600); pinMode (codificador_A, ENTRADA); pinMode (codificador_B, ENTRADA); pinMode (buttonPin, INPUT); newDebounceTime = millis ();

display.begin ();

display.setContrast (50); display.clearDisplay (); display.setTextSize (1); display.setTextColor (NEGRO); display.setCursor (0, 10); display.println ("POT 1 ="); display.setCursor (0, 22); display.println ("POT 2 ="); display.display ();

}

En el bucle, primero verifico si el intervalo es superior a 500 ms, si es así, la pantalla LCD se actualiza. Si no, el botón del codificador está marcado. Si se presiona, se llama al toggleBuffer. Después de esto, se comprueba el codificador. Si la entrada 0 es baja (rotación detectada), verifico la entrada B, si la entrada B es 0, incremento el potenciómetro , otras las reduzco. Después de esto, el valor se enviará al DS1803 a través de wire.write.

bucle vacío () {

intervalo();

if (digitalRead (buttonPin) == 1 && (presionado == 0)) {toggleBuffer ();} if (digitalRead (buttonPin) == 0) {presionado = 0;}

if (digitalRead (encoder_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {if (digitalRead (encoder_B) == 0) {pot ++; if (bote > 25) {bote = 25;}} else {bote -; if (bote <1) {bote = 1;}} cuenta = 1; newDebounceTime = millis ();

Wire.beginTransmission (controlByte); // empezar a transmitir

Wire.write (commandByte); // selección de potenciómetros Wire.write (pot [0] * 10); // envía el primer byte de los datos del potenciómetro Wire.write (pot [1] * 10); // envía el segundo byte de los datos del potenciómetro Wire.endTransmission (); // dejar de transmitir} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {presionado = 1; if (i == 0) {i = 1;} else {i = 0;}}

Primero despejo el área donde tengo que escribir las variables. Hago esto para dibujar un rectángulo en esta área. Después de eso, escribo las variables en la pantalla.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // lee el primer byte del potenciómetro potValue [1] = Wire.read (); // lee el segundo byte del potenciómetro display.fillRect (40, 0, 40, 45, WHITE); // borrar la pantalla variable en la pantalla LCD.setCursor (40, 10); display.print (potValue [0]); // escribe el primer valor del potenciómetro en la pantalla LCD.setCursor (40, 22); display.print (potValue [1]); // escribe el segundo valor del potenciómetro en la pantalla LCD.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// temporizador de intervalo para escribir datos en LCD if ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Recomendado: