Arduino Andmelogia

Hiljuti ehitasin ühe akutoitelt töötava kõrvaklapivõimendi. Võimendi töötab akult ja sellel on integraalskeem mis lülitab seadme välja, kui akupinge alla 2,5V kukub. Sellega seoses tahtsin kontrollida:

  1. Kui kaua kulub aega enne kui aku tühjaks saab?
  2. Kas akupinget valvav süsteem lülitab ennast enam vähem õigel pingel?

Isegi suurendatud koormusega võtab täis aku tühjaks laadimine mitu tundi. Ma kindlasti ei jaksa nii kaua stopperiga multimeetri kõrval istuda ja väljalülitust oodata.

Lahenduseks kasutasin Arduino analoog-digitaalmuunduri ja Arduino arenduskeskkonna jadaliidese monitori. Kirjeldan siin kuidas selline süsteem püsti panna.

Elektroonika ja ühendused

Analoog-digitaalmuundur (Analog-digital converter: ADC) on mikrokontrolleri alamsüsteem, mis muudab pingeväärtuse vastavaks digitaalväärtuseks. Selle kasutamise juures tuleb esimesena silmas pidada, et pinged, mis sa mikrokontrolleri sisendile annad ei ületaks konkreetse seadme maksimaalset lubatut. Tavaliselt on maksimaalne lubatud sisendpinge pisut suurem kui toitepinge.

Näiteks kui tahad uurida Li-Ion aku pinget laadimise/tühjaks laadimise ajal (2,5V – 4,2V), aga su Arduino mikrokontrolleri toitepinge on 3,3V, tuleb kasutada pingejagurit.

Meeldetuletuseks:

C1 esimene töö on tagada, et ADC võendamise hetkel oma sisendil pingelangu ei tekitaks. On küllalt levinud, et ADC-d sisaldavad endas võendamiskondensaatoreid. Need on mikrokontrolleri sisesed väikesed kondensaatorid, mida ühendatakse kindla sagedusega ADC sisendi ja muunduri vahel. Kondensaator laetakse täis sinu antud signaali pingest ja ühendatakse seejärel muunduri külge, mis sinu signaaliga võrdse pinge digitaalseks suuruseks muudab. Kui aga juhtub, et see pinge on suure impedantsiga allikast (nt selle ees on mitme kilo-oomine takisti) tekitab selle väikese kondensaatori laadimine signaalis pingelangu ja mõõtetäpsus väheneb.

Samal ajal tuleb jälgida, et R1-st ja C1-st tekkiv madalpääsfilter ei hakkaks signaali summutama. Madalpääsfiltri murdesageduse saab arvutada selle valemiga

Üks variant on välja mõelda, mis sagedusel sa oma signaali mõõtma hakkad. Kui tihti sa kavatsed teostada AD muundust. Toatemperatuuri või valgustugevust õues ei ole vast mõtet mõõta tihedamini kui kord sekundis (f = 1Hz). Helisüsteemides on küllalt tavaline võendamissagedus 44,1 kHz.

Kui võendamissagedus esialgu selge ei ole, siis võid filtri murdesageduse seada veidi kõrgemale, kui maksimaalne ADC võendamissagedus. Minu Arduino M0-il oleva mikrokontrolleri maksimaalne võendamissagedus on 350 kHz. Üsna tihti kasutatakse Hz asemel ühikut sps (samples per secpond) – võendust sekundis.

See on väga tavaline ADC kasutamise viis. Sõidukitega seotud elektroonikas on väga tavaline, et 5V või 3,3V mikrokontroller peab jälgima 12V või 24V süsteemi pingeid.

Programm ja andmehõive

Arduino programmeerimiskeskkonnas on ADC väärtuste hankimine väga lihtsaks tehtud. Kasutada tuleb funktsiooni analogRead() ja selle argumendiks käib analogsisendi number, mille leiad oma Arduino plaadilt.

Ehk siis, kui tahad teada mis on analoogpinge digitaalne väärtus sisendil A0, tuleb välja kutsuda funktsioon

analogRead(A0);

Selle funktsiooni kohta tuleb teada järgmist:

  1. Referentspinge on alati sinu konkreetse Arduino mikrokontrolleri toitepinge.
  2. Vaikimisi kasutab see funktsioon alati ADC muunduri 10 bitti, isegi siis kui mikrokontroller tegelikult rohkemaks võimeline on.

Arduino M0 puhul siis jagatakse 3,3V 1023 pingevahemikuks. Iga ühik loetud ADC registrist vastab ligikaudu 3,23 mV. Seega näiteks: kui analogRead() annab sulle väärtuse 100, siis saad välja arvutada, et sisendil A0 on pinge 323mV

Selleks, et kontrollida võendamissagedust kasutan funktsiooni delay(). See funktsioon viivitab programmi järgmist sammu argumendiks oleva ajahulga võrra. Aega mõõdab funktsioon millisekundites.

Näites, mis ma annan, tahtsin võendamissagedust 1Hz.

Viimaseks tuleb kogutud digitaalväärtused Arduinost kätte saada ja kasulikule kujule viia. Selle jaoks on Arduino arenduskeskkonnal jadaliidese monitor. Nupp selle käivitamiseks on programmiakna ülemises paremas nurgas.

Selleks, et monitorile mingeid kasulike andmeid tekiks, tuleb jadaliides esiteks seadistada. Tavaliselt on selleks järgmine programmirida:

SerialUSB.begin(9600);

Sellele järgneb funktsioon SerialUSB.print(), mille argumendiks lähevad andmed, mida sa soovid jadaliidese kaudu välja anda.

Kogu kood on all. Mine loe kindlasti iga funktsiooni toimimise kohta Arduino veebilehelt.

int i=0;

void setup() {

// put your setup code here, to run once:

SerialUSB.begin(9600);

}

void loop() {

delay(1000);

SerialUSB.print (i);

SerialUSB.print (” “);

SerialUSB.print (analogRead(A0));

SerialUSB.print (” “);

SerialUSB.println (analogRead(A1));

i++;

}

Kui andmed on jadaliidese monitori ekraanil, saad sa need sealt mõnda tabelarvutusprogrammi kopeerida

Arvutused ja andmetöötlus

All on näide ülaloleva koodi genereeritud andmetest.

Tulbad A0 ja A1 on töödeldud andmed ja vastavad ADC poolt mõõdetud pingetele. Et mõlemal sisendil oli ees pingejagur teguriga kaks, siis olid valemid ühesugused

Oma arvutuses pead loomulikult valima selle pingejaguri teguri, mida tegelikult kasutad.

Kui see töö tehtud, saad mõõtetulemusi uurida ja esitada graafiliselt. All on toodud akupinge laadimise käigus. X telg on aeg sekundites

Kokkuvõte

Selline lühike jutt seekord AD muunduritest ja sellest kuidas Arduinost lihtne andmehõivesüsteem ehitada. Tekib ka kohe ideid kuidas luua Arduino lisaseade, mis sisaldaks endas pingejagureid millest sobiv valida. Samuti kaitsedioode, mis mikrokontrollerit liigse pinge eest kaitseksid.

Arduino arenduskeskkonna jadaliidese monitor on küllalt primitiivne. See ei salvesta andmeid jooksvalt. Kui juhtub, et monitori aken sulgub või kui unustad aknas oleva kopeerida, on su andmed kadunud.

Kui oled usin võid üritada kirjutada pythoni programmi, mis jadaliidese andmed tekstifaili kirjutab. Kui sa nii usin ei ole võid proovida seda tasuta tarkvara, mis näib sama tööd tegevat. https://www.com-port-monitoring.com/#free-monitor