Sadržaj:

DS1803 Dvostruki digitalni potenciometar s Arduinom: 5 koraka
DS1803 Dvostruki digitalni potenciometar s Arduinom: 5 koraka

Video: DS1803 Dvostruki digitalni potenciometar s Arduinom: 5 koraka

Video: DS1803 Dvostruki digitalni potenciometar s Arduinom: 5 koraka
Video: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, Srpanj
Anonim
DS1803 Dvostruki digitalni potenciometar s Arduinom
DS1803 Dvostruki digitalni potenciometar s Arduinom

Volim podijeliti korištenje DS1803 digitalnog mjerača udaljenosti s Arduinom. Ovaj IC sadrži dva digitalna potmetra koji se mogu kontrolirati putem dvožičnog sučelja, za to koristim knjižnicu wire.h.

Ovaj IC može zamijeniti uobičajeni analogni mjerač udaljenosti. Na taj način možete kontrolirati, na primjer, pojačalo ili napajanje.

U ovom uputstvu kontroliram svjetlinu dvije LED diode kako bih pokazao rad.

Arduino broji impulse rotacijskog davača i postavlja vrijednost u promjenjivi lonac [0] i lonac [1]. Kada pritisnete prekidač na davaču, možete se prebacivati između lonca [0] i lonca [1].

Stvarna vrijednost lonaca očitana je s DS1803 i stavljena u promjenjivu potValue [0] i potValue [1] te prikazana na LCD -u.

Korak 1: Spajanje DS1803

Priključci DS1803
Priključci DS1803

Ovdje možete vidjeti veze DS1803. H je visoka strana potenciometra, L niska strana i W brisač. SCL i SDA su autobusne veze.

S priključcima A0, A1 i A2 DS1803 možete dati vlastitu adresu, na taj način možete kontrolirati više uređaja putem jedne sabirnice. U svom primjeru dao sam DS1803 adres 0 povezivanjem svih pinova na tlo.

Korak 2: Naredbeni bajt

Naredbeni bajt
Naredbeni bajt

Način rada DS1803 može se koristiti u naredbenom bajtu. Kad odaberete "upiši potenciometar-0", odabrani su oba potenciometra, a samo želiš podesiti potenciometar-0, moraš poslati samo prvi bajt podataka. "Zapisivanje potenciometra-1" podesite samo mjerač-1. "Zapisi na oba potenciometra" daje oba potenciometra istu vrijednost.

Korak 3: Upravljanje DS1803

Upravljanje DS1803
Upravljanje DS1803

Kontrolni bajt (slika 3) ima identifikator uređaja, koji ostaje uvijek isti. U mom primjeru A0, A1 i A2 su 0 jer odabiremo adrese stavljajući sve A-pinove na zemlju. Zadnji bit R/W bit će postavljen na 0 ili 1 naredbom "Wire.beginTransmission" i "Wire.requestFrom" u Arduinu. Na slici 5 možete vidjeti cijeli brzojav. Pročitani telegram prikazan je na slici 4.

Korak 4: Postavite

Postaviti
Postaviti

Ovaj krug pokazuje kako spojiti sve. Nokijin LCD zaslon dostupan je s različitim priključcima, pazite da pravilno povežete svoj. Također rotacijski koder njegove različite inačice, neke imaju zajedničko na srednjem pinu, druge nemaju. Stavio sam malu mrežu filtera (otpornik od 470 Ohma sa 100nF kapom) za filtriranje izlaznih signala A i B davača. Trebam ovaj filter jer je izlaz imao mnogo buke. Također sam u svoj program stavio tajmer za debounce za poništavanje neke buke. U ostalom mislim da je sklop jasan. LCD se može naručiti putem Adafruit

Korak 5: Program

Za korištenje 2-žične sabirnice uključujem knjižnicu Wire.h. Za korištenje LCD-a uključujem biblioteku Adafruit koju možete preuzeti s https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, a biblioteka Adafruit_GFX.h dostupna je ovdje https:// github. com/adafruit/Adafruit-GFX-Library.

#uključi

#uključi

#uključi

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

Ovdje možete vidjeti sve varijable. Kontrolni bajt i naredbeni bajt kako je prije opisano. Vrijeme deBounceTime može se prilagoditi ovisno o šumu na vašem koderu.

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bitova, naredba bajtaByte = B10101001; // posljednja 2 bita je odabir mjerača udaljenosti. byte potValue [2]; int i = 0; int deBounceTime = 10; // Podesite ovu vrijednost ovisno o šumu const int enkoder_A = 8; const int enkoder_B = 9; const int buttonPin = 2; unsigned long newDebounceTime = 0; nepotpisano dugo oldTime; logičko pritisnuto = 0; logički broj = 1;

U postavljanju definiram desne pinove i stavljam statički tekst na LCD

void setup () {Wire.begin (); Serial.begin (9600); pinMode (enkoder_A, ULAZ); pinMode (enkoder_B, ULAZ); pinMode (buttonPin, INPUT); newDebounceTime = millis ();

display.begin ();

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

}

U petlji prvo provjeravam je li interval veći od 500 ms, ako da, LCD se ažurira. Ako nije, gumb na koderu je provjeren. Ako pritisnete toggleBuffer, pozovite. Nakon toga se koder provjerava. Ako je ulaz 0 nizak (otkrivena rotacija) provjeravam ulaz B, ako je ulaz B 0 povećavam pot , ostale smanjujem. Nakon toga vrijednost će se poslati na DS1803 putem wire.write.

void loop () {{100} {101}

interval();

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

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

Wire.beginTransmission (controlByte); // započeti prijenos

Wire.write (commandByte); // odabir potmetara Wire.write (pot [0] * 10); // šalje 1. bajt podataka o metru Wire.write (pot [1] * 10); // šalje 2. bajt podataka o metru Wire.endTransmission (); // zaustavljanje prijenosa} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

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

Prvo očistim područje u koje moram upisati varijable. Ovo radim da nacrtam pravokutnik u ovom području. Nakon toga zapisujem varijable na zaslon.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // čita prvi bajtmetar potmetValue [1] = Wire.read (); // čitanje drugog prikaza bajtmetra.fillRect (40, 0, 40, 45, BIJELO); // brisanje promjenjivog zaslona na LCD zaslonu.setCursor (40, 10); display.print (potValue [0]); // zapisujemo prvu vrijednost mjerača na LCD zaslon.setCursor (40, 22); display.print (potValue [1]); // zapisujemo drugu vrijednost mjerača na LCD zaslon.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// intervalni mjerač vremena za zapis podataka na LCD ako ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Preporučeni: