Spisu treści:

DS1803 Podwójny potencjometr cyfrowy z Arduino: 5 kroków
DS1803 Podwójny potencjometr cyfrowy z Arduino: 5 kroków

Wideo: DS1803 Podwójny potencjometr cyfrowy z Arduino: 5 kroków

Wideo: DS1803 Podwójny potencjometr cyfrowy z Arduino: 5 kroków
Wideo: Lesson 10: Using Potentiometer reading voltage, Analog and Digital 2024, Listopad
Anonim
DS1803 Podwójny potencjometr cyfrowy z Arduino
DS1803 Podwójny potencjometr cyfrowy z Arduino

Lubię dzielić wykorzystanie cyfrowego potencjometru DS1803 z Arduino. Ten układ scalony zawiera dwa cyfrowe potencjometry, które mogą być sterowane przez interfejs dwuprzewodowy, do tego celu używam biblioteki wire.h.

Ten układ scalony może zastąpić normalny potencjometr analogowy. W ten sposób możesz sterować np. wzmacniaczem lub zasilaczem.

W tej instrukcji kontroluję jasność dwóch diod LED, aby pokazać działanie.

Arduino zlicza impulsy enkodera obrotowego i umieszcza wartość w zmiennych pot[0] i pot[1]. Po naciśnięciu przełącznika na enkoderze możesz przełączać się między pot[0] i pot[1].

Rzeczywista wartość potencjometrów jest odczytywana z DS1803 i umieszczana w zmiennej potValue[0] i potValue[1] i wyświetlana na wyświetlaczu LCD.

Krok 1: Połączenia DS1803

Połączenia DS1803
Połączenia DS1803

Tutaj możesz zobaczyć połączenia DS1803. H to górna strona potencjometru, L niska strona, a W wycieraczka. SCL i SDA to połączenia autobusowe.

Przy połączeniu A0, A1 i A2 możesz nadać DS1803 własny adres, w ten sposób możesz sterować większą liczbą urządzeń za pomocą jednej magistrali. W moim przykładzie podałem adres DS1803 0, podłączając wszystkie piny do masy.

Krok 2: Bajt polecenia

Bajt polecenia
Bajt polecenia

Sposób działania DS1803 można wykorzystać w bajcie polecenia. Po wybraniu "zapisz potencjometr-0" oba potencjometry są wybrane, gdy chcesz tylko wyregulować potencjometr-0, musisz tylko wysłać pierwszy bajt danych. "Zapisz potencjometr-1" dostosuj tylko potencjometr-1. "Zapisz do obu potencjometrów" daje obu potencjometom tę samą wartość.

Krok 3: Kontrola DS1803

Sterowanie DS1803
Sterowanie DS1803

Bajt kontrolny (rysunek 3) ma identyfikator urządzenia, który pozostaje zawsze taki sam. W moim przykładzie A0, A1 i A2 są równe 0, ponieważ wybieramy adres, umieszczając wszystkie piny A na ziemi. Ostatni bit R/W zostanie ustawiony na 0 lub 1 poleceniem „Wire.beginTransmission” i „Wire.requestFrom” w Arduino. Na rysunku 5 widać cały telegram. Telegram odczytu pokazano na rysunku 4.

Krok 4: Konfiguracja

Ustawiać
Ustawiać

Ten obwód pokazuje, jak wszystko połączyć. Wyświetlacz LCD Nokia jest dostępny z różnymi połączeniami, upewnij się, że podłączasz prawidłowo. Również enkoder obrotowy ma różne wersje, niektóre mają wspólne na środkowym pinie inne nie. Umieściłem małą sieć filtrów (rezystor 470 Ohm z nasadką 100nF) do filtrowania sygnałów wyjściowych A i B enkodera. Potrzebuję tego filtra, ponieważ na wyjściu było dużo szumów. W moim programie umieściłem również licznik czasu odbicia, aby anulować niektóre szumy. Co do reszty myślę, że obwód jest czysty. Wyświetlacz LCD można zamówić za pośrednictwem Adafruit

Krok 5: Program

Do wykorzystania magistrali 2-przewodowej dołączam bibliotekę Wire.h. Do korzystania z wyświetlacza LCD dołączam bibliotekę Adafruit, którą można pobrać z https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, dostępna jest również biblioteka Adafruit_GFX.h tutaj https://github. com/adafruit/Adafruit-GFX-Library.

#włączać

#włączać

#włączać

Wyświetlacz Adafruit_PCD8544 = Adafruit_PCD8544(7, 6, 5, 4, 3);

Tutaj możesz zobaczyć wszystkie zmienne. Bajt kontrolny i bajt polecenia, jak opisano wcześniej. DeBounceTime można regulować w zależności od szumu kodera.

pula bajtów[2] = {1, 1};bajt kontrolnyByte = B0101000; // 7 bitów, bajt commandByte = B10101001; // ostatnie 2 bity to wybór potencjometru. bajt potValue[2]; int i = 0; int czas odbicia = 10; // Dostosuj tę wartość w zależności od hałasu const int encoder_A = 8; const int koder_B = 9; const int przyciskPin = 2; unsigned long newDebounceTime = 0; niepodpisany długi oldTime; wciśnięty logiczny = 0; liczba logiczna = 1;

W setupie definiuję właściwe piny i umieszczam statyczny tekst na LCD

void setup() { Wire.begin(); Serial.początek(9600); pinMode(koder_A, WEJŚCIE); pinMode(koder_B, WEJŚCIE); pinMode(buttonPin, INPUT); nowyCzasOdbicia = millis();

wyświetl.rozpocznij();

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

}

W pętli najpierw sprawdzam, czy interwał jest dłuższy niż 500ms, jeśli tak, zaktualizuje się LCD. Jeśli nie, przycisk na enkoderze jest zaznaczony. Jeśli zostanie naciśnięty, toggleBuffer zostanie wywołany. Następnie sprawdzany jest koder. Jeśli wejście 0 jest niskie (wykryto obrót) sprawdzam wejście B, jeśli wejście B wynosi 0, zwiększam pot, inne zmniejszam. Następnie wartość zostanie wysłana do DS1803 przez wire.write.

pusta pętla () {

interwał();

if(digitalRead(buttonPin)== 1 && (wciśnięty == 0)){toggleBuffer();} if(digitalRead(buttonPin)== 0){wciśnięty = 0;}

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

Wire.beginTransmission(bajt kontrolny); // rozpocznij transmisję

Wire.write(commandByte); // wybór potencjometrów Wire.write(pot[0] * 10); // wyślij pierwszy bajt danych z potencjometru Wire.write(pot[1] * 10); // wyślij drugi bajt danych z potencjometru Wire.endTransmission(); // zatrzymaj transmisję }else if (digitalRead(encoder_A) == 1 && digitalRead(encoder_B) == 1 && count == 1 && (millis() - newDebounceTime > deBounceTime)){ count = 0; nowyCzasOdbicia = millis(); } }

void toggleBuffer(){ wciśnięty = 1; jeśli (i == 0){i = 1;}else{i = 0;} }

Najpierw oczyszczam obszar, w którym mam wpisać zmienne. Robię to, aby narysować prostokąt w tym obszarze. Następnie zapisuję zmienne na ekranie.

void writeToLCD(){ Wire.requestFrom(controlByte, 2); potValue[0] = Wire.read(); // odczytaj pierwszy bajt potmeter potValue[1] = Wire.read(); // odczytaj drugi bajt potencjometru display.fillRect(40, 0, 40, 45, WHITE); // wyczyść ekran zmiennych na wyświetlaczu LCD.setCursor(40, 10); display.print(potValue[0]); // zapis pierwszej wartości potencjometru na wyświetlaczu LCD.setCursor(40, 22); display.print(potValue[1]); // zapisz drugą wartość potencjometru do wyświetlacza LCD.setCursor(60, (10 + i * 12)); display.print("<"); display.display(); }

void interval(){ // zegar interwału do zapisu danych na wyświetlaczu LCD if ((millis() - oldTime) > 500) { writeToLCD(); staryCzas = mili(); } }

Zalecana: