Inhaltsverzeichnis:

DS1803 Duales digitales Potentiometer mit Arduino - Gunook
DS1803 Duales digitales Potentiometer mit Arduino - Gunook

Video: DS1803 Duales digitales Potentiometer mit Arduino - Gunook

Video: DS1803 Duales digitales Potentiometer mit Arduino - Gunook
Video: DFT_#A92 DOUBLE POTENTIOMETRE NUMERIQUE - I2C - DS1803 - ATTINY85 2024, November
Anonim
DS1803 Duales Digitalpotentiometer mit Arduino
DS1803 Duales Digitalpotentiometer mit Arduino

Ich teile gerne die Verwendung eines digitalen Potmeters DS1803 mit einem Arduino. Dieser IC enthält zwei digitale Potmeter, die über eine Zweidrahtschnittstelle angesteuert werden können, dafür verwende ich die Bibliothek wire.h.

Dieser IC kann ein normales analoges Potmeter ersetzen. Auf diese Weise können Sie beispielsweise einen Verstärker oder ein Netzteil steuern.

In diesem anweisbaren steuere ich die Helligkeit von zwei LEDs, um das Arbeiten zu zeigen.

Das Arduino zählt die Impulse eines Drehgebers und legt den Wert in die Variablen pot[0] und pot[1]. Wenn Sie den Schalter am Encoder drücken, können Sie zwischen Pot[0] und Pot[1] umschalten.

Der Istwert der Potis wird vom DS1803 zurückgelesen und in die Variablen potValue[0] und potValue[1] gelegt und auf einem LCD angezeigt.

Schritt 1: Anschlüsse des DS1803

Anschlüsse des DS1803
Anschlüsse des DS1803

Hier sehen Sie die Anschlüsse des DS1803. H ist die hohe Seite des Potentiometers, L die niedrige Seite und W der Schleifer. SCL und SDA sind die Busverbindungen.

Mit den Anschlüssen A0, A1 und A2 können Sie dem DS1803 eine eigene Adresse geben, so können Sie mehrere Geräte über einen Bus steuern. In meinem Beispiel habe ich der DS1803-Adresse 0 gegeben, indem ich alle Pins mit Masse verbunden habe.

Schritt 2: Befehlsbyte

Befehlsbyte
Befehlsbyte

Die Arbeitsweise des DS1803 kann im Befehlsbyte verwendet werden. Wenn Sie "potentiometer-0 schreiben" wählen, sind beide Potentiometer ausgewählt, wenn Sie nur Potentiometer-0 einstellen möchten, müssen Sie nur das erste Datenbyte senden. "Potentiometer-1 schreiben" nur Potentiometer-1 verstellen. "Auf beide Potentiometer schreiben" gibt beiden Potentiometern den gleichen Wert.

Schritt 3: Steuerung des DS1803

Steuerung des DS1803
Steuerung des DS1803

Das Control-Byte (Bild 3) hat eine Gerätekennung, diese bleibt immer gleich. In meinem Beispiel sind A0, A1 und A2 0, weil wir die Adresse auswählen, indem wir alle A-Pins auf Masse legen. Das letzte Bit R/W wird durch die Befehle "Wire.beginTransmission" und "Wire.requestFrom" im Arduino auf 0 oder 1 gesetzt. In Abbildung 5 sehen Sie das gesamte Telegramm. Das Lesetelegramm ist in Abbildung 4 dargestellt.

Schritt 4: Einrichten

Erstellen
Erstellen

Diese Schaltung zeigt, wie man alles verbindet. Das Nokia LCD ist mit verschiedenen Anschlüssen erhältlich, stellen Sie sicher, dass Sie Ihre richtig anschließen. Auch der Drehgeber hat seine verschiedenen Ausführungen, einige haben den gemeinsamen Stift am Mittelstift, andere nicht. Ich habe ein kleines Filternetzwerk (470 Ohm Widerstand mit 100nF Kappe) eingebaut, um die A- und B-Ausgangssignale des Encoders zu filtern. Ich brauche diesen Filter, weil die Ausgabe viel Rauschen hatte. Ich habe auch einen Entprell-Timer in mein Programm eingebaut, um etwas Rauschen zu unterdrücken. Für den Rest denke ich, dass die Schaltung klar ist. Das LCD kann über Adafruit https://www.adafruit.com/product/338 bestellt werden.

Schritt 5: Das Programm

Für die Nutzung des 2-Draht-Busses füge ich die Bibliothek Wire.h hinzu. Um das LCD zu verwenden, füge ich die Adafruit-Bibliothek hinzu, die Sie von https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library herunterladen können. Außerdem ist die Adafruit_GFX.h-Bibliothek hier https://github verfügbar. com/adafruit/Adafruit-GFX-Bibliothek.

#enthalten

#enthalten

#enthalten

Adafruit_PCD8544-Anzeige = Adafruit_PCD8544(7, 6, 5, 4, 3);

Hier sehen Sie alle Variablen. Steuerbyte und Befehlsbyte wie zuvor beschrieben. Die deBounceTime kann je nach Rauschen Ihres Encoders angepasst werden.

Bytepot[2] = {1, 1};Byte controlByte = B0101000; // 7 Bit, Byte commandByte = B10101001; // Die letzten 2 Bits sind die Potmeter-Auswahl. Byte-PotValue[2]; int i = 0; int deBounceTime = 10; // Passen Sie diesen Wert abhängig vom Rauschen an const int encoder_A = 8; const int Encoder_B = 9; const int buttonPin = 2; unsigned long newDebounceTime = 0; lange alte Zeit ohne Vorzeichen; boolesch gedrückt = 0; boolesche Zahl = 1;

Im Setup definiere ich die richtigen Pins und lege den statischen Text auf das LCD

Void setup () { Wire.begin (); Serial.begin (9600); pinMode (Encoder_A, INPUT); pinMode (Encoder_B, INPUT); pinMode (buttonPin, INPUT); newDebounceTime = millis();

display.begin();

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

}

In der Schleife überprüfe ich zuerst, ob das Intervall mehr als 500 ms beträgt, wenn ja, wird das LCD aktualisiert. Wenn nicht, wird die Schaltfläche am Encoder überprüft. Wenn gedrückt, wird der toggleBuffer aufgerufen. Danach wird der Encoder überprüft. Wenn Eingang 0 niedrig ist (Drehung erkannt) überprüfe ich Eingang B, wenn Eingang B 0 ist, inkrementiere ich pot, andere dekrementiere ich. Danach wird der Wert per wire.write an das DS1803 gesendet.

Leere Schleife () {

Intervall();

if(digitalRead(buttonPin)== 1 && (gedrückt == 0)){toggleBuffer();} if(digitalRead(buttonPin)== 0){gedrückt = 0;}

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

Wire.beginTransmission(controlByte); // beginne zu senden

Wire.write (BefehlsByte); // Auswahl der Potmeter Wire.write (pot[0] * 10); // 1. Byte Potmeterdaten senden Wire.write (pot [1] * 10); // 2. Byte Potmeterdaten senden Wire.endTransmission (); // Stoppen Sie die Übertragung} sonst if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis() - newDebounceTime > deBounceTime)) {count = 0; newDebounceTime = millis(); } }

Void toggleBuffer () { gedrückt = 1; wenn (i == 0){i = 1;}sonst{i = 0;} }

Zuerst räume ich den Bereich frei, in den ich die Variablen schreiben muss. Ich tue dies, um ein Rechteck in diesem Bereich zu zeichnen. Danach schreibe ich die Variablen auf den Bildschirm.

Void writeToLCD () { Wire.requestFrom (controlByte, 2); potValue[0] = Wire.read(); // Erstes Potmeterbyte lesen potValue [1] = Wire.read (); // zweites Potmeter-Byte lesen display.fillRect (40, 0, 40, 45, WEISS); // Variablenbildschirm auf LCD-Display löschen.setCursor (40, 10); display.print(potValue[0]); // 1. Potmeterwert auf LCD-Display schreiben.setCursor (40, 22); display.print (potValue[1]); // 2. Potmeterwert auf LCD-Display schreiben.setCursor (60, (10 + i * 12)); display.print("<"); display.display(); }

Void interval () {// Intervall-Timer zum Schreiben von Daten auf das LCD if ((millis (- oldTime) > 500) { writeToLCD (); oldTime = millis(); } }

Empfohlen: