Talaan ng mga Nilalaman:

DS1803 Dual Digital Potentiometer Sa Arduino: 5 Hakbang
DS1803 Dual Digital Potentiometer Sa Arduino: 5 Hakbang

Video: DS1803 Dual Digital Potentiometer Sa Arduino: 5 Hakbang

Video: DS1803 Dual Digital Potentiometer Sa Arduino: 5 Hakbang
Video: Mailbag! DS1803 Digital Pot and Other Silicon 2024, Nobyembre
Anonim
DS1803 Dual Digital Potentiometer Sa Arduino
DS1803 Dual Digital Potentiometer Sa Arduino

Gusto kong ibahagi ang paggamit ng isang DS1803 digital potmeter sa isang Arduino. Naglalaman ang IC na ito ng dalawang digital potmeters na maaaring makontrol sa isang dalawang interface ng kawad, para dito ginagamit ko ang wire.h library.

Maaaring palitan ng IC na ito ang isang normal na analog potmeter. Sa ganitong paraan nagagawa mong makontrol halimbawa ang isang amplifier o power supply.

Sa itinuturo na ito kinokontrol ko ang ningning ng dalawang LED upang maipakita ang gumagana.

Binibilang ng arduino ang mga pulso ng isang rotary encoder at inilalagay ang halaga sa variable pot [0] at pot [1]. Kapag naitulak mo ang switch sa encoder, maaari kang lumipat sa pagitan ng palayok [0] at palayok [1].

Ang aktwal na halaga ng mga kaldero ay binabasa muli mula sa DS1803 at inilagay sa variable potValue [0] at potValue [1] at ipinapakita sa isang LCD.

Hakbang 1: Mga koneksyon ng DS1803

Mga koneksyon ng DS1803
Mga koneksyon ng DS1803

Makikita mo rito ang mga koneksyon ng DS1803. Ang H ay ang mataas na bahagi ng potensyomiter, L ang mababang bahagi at W ang wiper. Ang SCL at SDA ang mga koneksyon sa bus.

Sa koneksyon A0, A1 at A2 maaari mong ibigay sa DS1803 ang sariling adress, sa ganitong paraan maaari mong makontrol ang mas maraming mga aparato sa pamamagitan ng isang bus. Sa aking halimbawa ay binigyan ko ang DS1803 adres 0 sa pamamagitan ng pagkonekta sa lahat ng mga pin sa lupa.

Hakbang 2: Command Byte

Command Byte
Command Byte

Ang paraan ng pagpapatakbo ng DS1803 ay maaaring magamit sa byte ng utos. Kapag pinili mo ang "isulat ang potentiometer-0" ang parehong potentiometers ay napili, kapag nais mo lamang ayusin ang potentiometer-0, kailangan mo lamang ipadala ang unang byte ng data. Ang "isulat ang potentiometer-1" ayusin lamang ang potmeter-1. Ang "Sumulat sa parehong mga potensyal" ay nagbibigay sa parehong mga potensyal sa parehong halaga.

Hakbang 3: Pagkontrol sa DS1803

Pagkontrol ng DS1803
Pagkontrol ng DS1803

Ang control byte (figure 3) ay may isang pagkakakilanlan ng aparato, mananatili itong laging pareho. Sa aking halimbawang A0, A1 at A2 ay 0 dahil pipiliin namin ang mga adre sa pamamagitan ng paglalagay ng lupa sa lahat ng mga A-pin. Ang huling bit R / W ay itatakda sa 0 o 1 sa pamamagitan ng utos na "Wire.beginTransmission" at "Wire.requestFrom" sa Arduino. Sa pigura 5 maaari mong makita ang buong telegram. Ang binasang telegram ay ipinapakita sa larawan 4.

Hakbang 4: Mag-set up

Mag-set up
Mag-set up

Ipinapakita ng circuit na ito kung paano ikonekta ang lahat. Magagamit ang Nokia LCD na may iba't ibang mga koneksyon, siguraduhin na ikinonekta mo ang tama. Gayundin ang rotary encoder ang kanyang iba't ibang mga bersyon, ang ilan ay may karaniwan sa gitnang pin na iba hindi. Naglagay ako ng isang maliit na network ng filter (470 Ohm risistor na may cap na 100nF) upang salain ang mga signal ng output ng A at B ng encoder. Kailangan ko ng filter na ito dahil ang output ay mayroong maraming ingay. Naglagay din ako ng isang debounce timer sa aking programa upang kanselahin ang ilang ingay. Para sa natitirang palagay ko malinaw ang circuit. Maaaring mag-order ang LCD sa pamamagitan ng Adafruit

Hakbang 5: Ang Programa

Para sa paggamit ng 2-wire bus isinasama ko ang Wire.h library. Upang magamit ang LCD isinasama ko ang Adafruit library na maaari mong i-download mula sa https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library din ang Adafruit_GFX.h library ay magagamit dito https:// github. com / adafruit / Adafruit-GFX-Library.

# isama

# isama

# isama

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

Makikita mo rito ang lahat ng mga variable. Kontrolin ang byte at command byte tulad ng inilarawan dati. Maaaring ayusin ang deBounceTime depende sa ingay sa iyong encoder.

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bits, byte commandByte = B10101001; // huling 2 piraso ay pagpipilian ng potmeter. byte potValue [2]; int i = 0; int deBounceTime = 10; // Ayusin ang halagang ito depende sa ingay const int encoder_A = 8; Const int encoder_B = 9; Const int buttonPin = 2; unsigned mahabang bagongDebounceTime = 0; unsigned matagal na ang datingTime; pinindot ang boolean = 0; bilang ng boolean = 1;

Sa pag-setup tinutukoy ko ang mga tamang pin at ilagay ang static na teksto sa 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 (BLACK); display.setCursor (0, 10); display.println ("POT 1 ="); display.setCursor (0, 22); display.println ("POT 2 ="); display.display ();

}

Sa loop ko muna suriin kung ang agwat ay higit sa 500ms, kung oo na-update ang LCD. Kung hindi ang pindutan sa encoder ay naka-check. Kung pinindot ang toggleBuffer tumawag. Pagkatapos nito ay naka-check ang encoder. Kung ang input 0 ay mababa (nakita ang pag-ikot) Sinusuri ko ang input B, kung ang input B ay 0 I increment pot , ang iba ay nababawasan ako. Pagkatapos nito, ipapadala ang halaga sa DS1803 sa pamamagitan ng wire.write.

void loop () {

agwat ();

kung (digitalRead (buttonPin) == 1 && (pinindot == 0)) {toggleBuffer ();} kung (digitalRead (buttonPin) == 0) {pinindot = 0;}

kung (digitalRead (encoder_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {if (digitalRead (encoder_B) == 0) {pot ++; kung (palayok > 25) {pot = 25;}} iba pa {pot -; kung (palayok <1) {palayok = 1;}} bilangin = 1; newDebounceTime = millis ();

Wire.beginTransmission (controlByte); // simulang magpadala

Wire.write (commandByte); // pagpili ng potmeters Wire.write (palayok [0] * 10); // send 1st byte of potmeter data Wire.write (palayok [1] * 10); // send 2nd byte of potmeter data Wire.endTransmission (); // stop transmitting} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {pinindot = 1; kung (i == 0) {i = 1;} iba pa {i = 0;}}

Una kong linisin ang lugar kung saan kailangan kong magsulat ng mga varibles. Ginagawa ko ito upang gumuhit ng isang rektanggulo sa lugar na ito. Pagkatapos nito isulat ko ang mga variable sa screen.

walang bisa ang magsulatToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // read first potmeter byte potValue [1] = Wire.read (); // basahin ang pangalawang potmeter byte display.fillRect (40, 0, 40, 45, WHITE); // clear variable screen sa LCD display.setCursor (40, 10); display.print (potValue [0]); // isulat ang unang halaga ng potmeter sa LCD display.setCursor (40, 22); display.print (potValue [1]); // isulat ang ika-2 na halaga ng potmeter sa LCD display.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// interval timer upang magsulat ng data sa LCD kung ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Inirerekumendang: