Indholdsfortegnelse:

DS1803 dobbelt digitalt potentiometer med Arduino: 5 trin
DS1803 dobbelt digitalt potentiometer med Arduino: 5 trin

Video: DS1803 dobbelt digitalt potentiometer med Arduino: 5 trin

Video: DS1803 dobbelt digitalt potentiometer med Arduino: 5 trin
Video: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, November
Anonim
DS1803 Dual Digital Potentiometer Med Arduino
DS1803 Dual Digital Potentiometer Med Arduino

Jeg kan godt lide at dele brugen af en DS1803 digital potmeter med en Arduino. Denne IC indeholder to digitale potmetre, som kan styres over et to -leder interface, til dette bruger jeg wire.h biblioteket.

Denne IC kan erstatte en normal analog potmeter. På denne måde kan du styre f.eks. En forstærker eller strømforsyning.

I denne instruerbare styrer jeg lysstyrken på to LED'er for at vise arbejdet.

Arduinoen tæller pulserne fra en roterende encoder og placerer værdien i variabel pot [0] og pot [1]. Når du trykker på kontakten på encoderen, kan du skifte mellem pot [0] og pot [1].

Den faktiske værdi af gryderne læses tilbage fra DS1803 og placeres i variabel potValue [0] og potValue [1] og vises på en LCD.

Trin 1: Tilslutninger til DS1803

Tilslutninger til DS1803
Tilslutninger til DS1803

Her kan du se forbindelserne til DS1803. H er potentiometerets høje side, L den lave side og W viskeren. SCL og SDA er busforbindelserne.

Med forbindelse A0, A1 og A2 kan du give DS1803 sin egen adresse, på denne måde kan du styre flere enheder via en bus. I mit eksempel har jeg givet DS1803 -adressen 0 ved at forbinde alle stifter til jorden.

Trin 2: Kommando Byte

Kommando Byte
Kommando Byte

Den måde, DS1803 fungerer på, kan bruges i kommandobyten. Når du vælger "skriv potentiometer-0", er begge potentiometre valgt, når du kun vil justere potentiometer-0, skal du kun sende den første databyte. "Skriv potentiometer-1" juster kun potmeter-1. "Skriv til begge potentiometre" giver begge potentiometre den samme værdi.

Trin 3: Kontrol af DS1803

Kontrol af DS1803
Kontrol af DS1803

Kontrolbyten (figur 3) har en enhedsidentifikator, denne forbliver altid den samme. I mit eksempel A0, A1 og A2 er 0, fordi vi vælger adresse ved at sætte alle A-ben til jorden. Den sidste bit R/W sættes til 0 eller 1 ved kommandoen "Wire.beginTransmission" og "Wire.requestFrom" i Arduino. I figur 5 kan du se hele telegrammet. Det læste telegram er vist i figur 4.

Trin 4: Opsætning

Opsætning
Opsætning

Dette kredsløb viser, hvordan man forbinder alt. Nokia LCD'en fås med forskellige tilslutninger. Sørg for, at du tilslutter din rigtige. Også den roterende encoder hans forskellige versioner, nogle har det fælles på den midterste pin andre ikke. Jeg har sat et lille filternetværk (470 Ohm modstand med 100nF cap) til at filtrere A og B output signaler fra encoderen. Jeg har brug for dette filter, fordi output havde en masse støj. Jeg satte også en debounce -timer i mit program for at annullere noget støj. For resten tror jeg, kredsløbet er klart. LCD'et kan bestilles via Adafruit

Trin 5: Programmet

Til brug af 2-leder bussen inkluderer jeg Wire.h biblioteket. For at bruge LCD'en inkluderer jeg Adafruit-biblioteket, som du kan downloade fra https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library også Adafruit_GFX.h-biblioteket er tilgængeligt her https:// github. com/adafruit/Adafruit-GFX-Library.

#omfatte

#omfatte

#omfatte

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

Her kan du se alle variablerne. Kontrolbyte og kommandobyte som beskrevet før. DeBounceTime kan justeres afhængigt af støj på din encoder.

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bits, byte commandByte = B10101001; // sidste 2 bit er valg af potmeter. byte potValue [2]; int i = 0; int deBounceTime = 10; // Juster denne værdi afhængigt af støj const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; usigneret lang newDebounceTime = 0; usigneret lang oldTime; boolsk presset = 0; boolsk tælling = 1;

I opsætningen definerer jeg de rigtige ben og sætter den statiske tekst på LCD'et

ugyldig opsætning () {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 (SORT); display.setCursor (0, 10); display.println ("POT 1 ="); display.setCursor (0, 22); display.println ("POT 2 ="); display.display ();

}

I sløjfen tjekker jeg først, om intervallet er mere end 500 ms, hvis ja LCD'en bliver opdateret. Hvis ikke er knappen på encoderen markeret. Hvis der trykkes på skifteren, bliver opkaldet. Herefter kontrolleres encoderen. Hvis input 0 er lav (rotation registreret) kontrollerer jeg input B, hvis input B er 0 I stigningspotte , reducerer jeg andre. Efter dette vil værdien blive sendt til DS1803 via wire.write.

void loop () {

interval();

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

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

Wire.beginTransmission (controlByte); // begynde at sende

Wire.write (commandByte); // udvalg af potmetre Wire.write (pot [0] * 10); // send 1. byte af potmeter data Wire.write (pot [1] * 10); // send 2. byte af potmeter data Wire.endTransmission (); // stop med at sende} ellers hvis (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {presset = 1; hvis (i == 0) {i = 1;} andet {i = 0;}}

Først rydder jeg det område, hvor jeg skal skrive variablerne. Jeg gør dette for at tegne et rektangel i dette område. Derefter skriver jeg variablerne til skærmen.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // læs første potmeter byte potValue [1] = Wire.read (); // læs anden potmeter byte display.fillRect (40, 0, 40, 45, WHITE); // tydelig variabel skærm på LCD display.setCursor (40, 10); display.print (potValue [0]); // skriv 1. potmeterværdi til LCD display.setCursor (40, 22); display.print (potValue [1]); // skriv 2. potmeterværdi til LCD display.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// interval timer til at skrive data til LCD hvis ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Anbefalede: