Analóg bemenet használata

Analóg bemenetre akkor lehet szükségünk, ha valamilyen eszköz vagy alkatrész kivezetésein szeretnénk megmérni a feszültséget. Az Arduino Uno-ban található analóg bemeneteknek eléggé korlátozottak a képességei. A teljes feszültség mérési tartományt 1024 részre tudja felbontani (10 bit). Azért ez elég sok esetben bőven elég. A chip-ben egy analóg-digital konverter (ADC) található, de elé építettek egy olyan kapcsolást, ami egyszerre csak egy bemenet köt az ADC-re. Ez a multiplexer! Ebből következik, hogy ha 6 jelet akarsz egyszerre mérni, azt csak egyenként sorban egymás után tudod megtenni. Egy mérés nem tart sokáig. Azt olvastam valahol, hogy egy csatornán másodpercenként több mint 10.000 mérést tudsz csinálni. Ennyi adat feldolgozásához már komoly memória és számítási teljesítmény kell. Mivel hang és videó képfeldolgozás egyenlőre nem célom, így ezzel a kérdéskörrel nem is foglalkoznék tovább.

Ahhoz, hogy az analóg bemenetek használatát megtanulhassuk, újra hardvert kell építeni. Be kell szerezni egy potenciométert. Természetesen az elektronikai boltokban ez is fillérekért kapható. Pl. egy 10kohm körüli darab pont megteszi. Nem feltétlenül kell tengellyel ellátott komolyabb darab. Én egy áramkörbe forraszthatót vettem, ennek ára 100Ft alatt van. Igaz, így csavarhúzóval kellett tekergetni, de a jelen feladatra éppen megfelelt így is.

Így néz ki a kapcsolás:

Ha mindez készen van, lehet megírni a programot. Annyit érdemes még tudni, hogy az Arduino Uno alaplapon az analóg bemeneteket A0..A5 jelöléssel látták el. Ezek a bemenetek is használhatók természetesen digitális ki és bemenetnek, ha éppen analóg mérésre nincs szükséged.

Az analóg feszültség értéket a chip egy 0..1023 közötti számként adja vissza. Értelem szerűen a 0 jelenti a 0V bemenő feszültséget. Az 1023-at akkor kapunk eredményül, ha a bemenő feszültségünk pontosan megegyezik egy referencia feszültséggel. Ennek értéke alapértelmezetten 5V (a tápfeszültség). A referencia feszültség lehet a 1,1V is az ATmega328P chip esetén, amit egy belső referencia tápegység szolgáltat. Ekkor Arduino Uno esetén 0..1,1V tartományban tudunk mérni. Ha pontosabb mérésre van szükség, akkor azonban külső referencia feszültséget kell kapcsolnunk a chip 21-es kivezetésére. Nagyon pontos mérések esetén az analóg konverternek külön tápfeszt is kell adni a chip 20-as kivezetésén, de ezzel kezdőként nem érdemes foglalkoznunk. Arra is vigyázzunk, hogy az analóg bemenetre semmiképpen nem kerülhet nagyobb feszültség, mint a chip tápfeszültsége (5V), mert tönkremegy az áramkör. Természetesen a földhöz képest negatív feszültséget is kerülni kell.

Mielőtt az analóg bemeneteket megismernénk érdemes egy kis kitérőt tennünk az Arduino Uno és a PC közötti sorosporti kommunikáció irányába. Erre azért lesz szükségünk, mert az analóg jelszintek mérésekor keletkező számadatokat nagyon nehezen tudnánk a kivezetéseken LED-ek vezérlésével láthatóvá tenni. Sokkal egyszerűbbnek tűnik beolvasni a PC-be és megnézni a képernyőn. Ha a mikrovezérlővel analóg jelet mérünk és nem akarjuk PC-n megjeleníteni a mért értéket, akkor könnyedén kiírhatjuk egy LCD kijelzőre, de most még nem akartam bonyolítani a programot az LCD kijelző programozásával. A soros kommunikáció beállítása és használta nagyon egyszerű, a kommentezett programsorok teljesen elegendőek a működés megértéséhez. A soros adatátviteli protokollokról itt olvashatunk részletesebben, de most még nyugodtan kihagyhatod, a következőkhöz nincs rá szükség.

És most végre jöhetnek a programkódok. Soros kommunikációt használtam arra, hogy megjelenjen a soros monitoron (illetve BASCOM-ban a terminál emulátorban) a mért értékek. Mérés közben természetesen tekergettem a potenciométert és az értékek szépen változtak. Érdemes kipróbálni, hogy mi történik, ha átállítjuk a referencia feszültséget, ezért benne is hagytam a forrás programokban kommentezve a másik lehetséges belső referencia értéket. Remélem a programsorokhoz írt kommentek itt is eléggé beszédesek. C-ben a programban kommenteket a “//” dupla dőlt zárújel után írhatunk. Ezt a fordító program nem veszi figyelembe, csak magunknak jegyzetelgethetünk.

Arduino C

Az itt megjelenő programrészlet már egy önmagában működőképes, futtatható program. Van “setup” és “loop” része, amiről már esett szó. A setup csak egyszer fut le, és a loop az ami ciklikusan ismétlődik. A “{” és a “}” zárójelek jelzik a setup illetve loop elejét és végét. Ez igaz minden függvény felépítésére, amiket a jövőben használni fogunk.

void setup() {
  Serial.begin(9600);                          //Soros port inicializálás
  Serial.println("Indul...");                //kiírjuk a soros portra, hogy indul a mérés
  analogReference(DEFAULT);       //A tápfeszt veszi referenciának (5V)
 //analogReference(INTERNAL);  //Atmega168 és ATmega328 esetén a belső referencia 1,1V, most nem ezt használjuk                                          
}
void loop() {
  Serial.println(analogRead(A0));      //az A0 bemeneten végzünk egy mérést és rögtön kiküldjük az eredményt a soros portra                                                                 
  delay(1000);                            //várakozunk 1 másodpercet a következő mérésig
}


Default referencia feszültség esetén a potenciométert teljesen végállásba kell tekerni ahhoz, hogy 1023-at lássunk mért értékként, míg ’INTERNAL” esetén már a potenciométer kis eltekerésével elérjük ugyanezt az adatot, hiszen a belső referencia 1,1V, és ehhez kb. 20%-ot kell forgatnunk csak.

Következzen egy kis gyakorlatias átalakítás! Gyakran arra használom az analóg bemenetet, hogy fejlesztés során mért értékeket szimuláljak a programban, és kipróbáljam a működést tág értékhatárok között. Pl. gyakran mérek hőmérsékletet, de valós hőmérő esetén nem szeretném megvárni a telet a negatív értékek kipróbáláshoz. Íme egy példa, amiben a mért értéket kb. -50 és +50 fok közötti értékre alakítja a program egy tizedes jegy felbontással:

float homerseklet;             //a homerseklet valtozó float típusú, ami negatív is lehet
void setup() {
  Serial.begin(9600);          //Soros port inicializálás
  Serial.println("Indul...");  //kiírjuk, hogy indula mérés 
  Reference(DEFAULT);          //A tápfeszt veszi referenciának (5V)
  //analogReference(INTERNAL); //Atmega168 és ATmega328 esetén a belső referencia 1,1V
}

void loop() {
  homerseklet=((float)analogRead(A0)/10)-50;  //(float) konvertálja az egész számot lebegőpontos számmá, jelen esetben a mért egész értéket. Ez után már lehet osztani 10-el, hogy legyen tizedes értékünk is!
  Serial.println(homerseklet);   //az A0 bemeneten végzünk egy mérést és rögtön kiküldjük az eredményt a soros portra                                                   
  delay(1000);                              //várakozunk 1 másodpercet a következő mérésig
}


Az analóg bemenet programozható digitális ki és bemenetnek is. Ekkor egyszerűen csak a setup részben a következőt kell megadni:
            pinmode(A0,INPUT);     //analog bemenet digitális bemenetre konfigurálása
            digitalread(A0); //olvasás a bemenetről

BASCOM

BASCOM-ban a program kommenteket egy ‘ szimpa idézőjel mögé írhatjuk! A kommenteket dőlt betűvel is megjelöltem, hogy jobban elkülönüljenek a program utasításoktól.

BASCOM-ban először az analóg konvertert be kell állítani

Config Adc=Single, Prescaler=Auto  Reference=INTERNAL ‘beállítjuk az analóg konvertert

Itt is sok minden magyarázatra szorul. A konverter beállítható úgy, hogy csak egy mérést végezzen (Adc=single), és úgy is, hogy folyamatosan mérjen (Adc=free). Folyamatos mérés beállítása esetén így néz ki egy mérés.

Start Adc                 ‘elindítjuk az analóg konverter részegységet
w=Getadc(0)          ‘mérünk egyet a 0 csatornán
Stop Adc                  ‘leállítjuk az analóg konvertert

A program tehát így néz ki:

$regfile = "m328pdef.dat"    'ATmega3218P chipet használunk
$crystal = 16000000             'órajel 16Mhz
$baud = 9600                          'sorosport sebességet ’9600boud-ra állítjuk
'Config Adc = Single , Prescaler = Auto , Reference = Avcc    
          'ADC konfigurálás, single mód,
           'referencia a tápfesz (5V), ez most
           'komment, mert nem 
           'így használom
Config Adc = Single , Prescaler = Auto , Reference = Internal   
           'ADC konfigurálás, single 
           'mód, referencia a tápfesz (1,1V)
Start Adc                            'ADC elindítása
Do
  Print Getadc(0)        'mérünk egyet és rögtön kiírjuk a soros portra
  Waitms 1000            'várakozunk 1 másodpercet a következő mérés előtt
Loop
End


Az Arduino ki és bemenetek konfigurálásával sokféle eszközt kezelhetünk. Világíthatnak LED-ek, meghúzhatunk egy relét, ami elindítja a szivattyút, beolvashatjuk egy potméter állását, megmérhetjük egy fényellenálláson eső feszültséget, ami sötétedéskor bekapcsolja a világítást stb. Ezek az egyszerű kiegészítők.

Ha valamilyen bonyolultabb kütyüt szeretnénk készíteni, akkor az eddig megismert ki és bemenetek kevésnek fognak bizonyulni. Sokkal nagyobb tudású eszközöket is használnunk kell, melyek már kommunikálni akarnak egymással. Érdemes összefoglalóan megismerni a kommunikációs lehetőségeket, amiket az Arduino biztosít számunkra. Kattints ide, ha még ez is érdekel!

Mennyire volt hasznos amit olvastál? Értékelés után szövegesen is leírhatod megjegyzéseidet és véleményedet!

Kattints egy csillagra az értékeléshez!

Szövegesen is leírhatod véleményedet! Ha kérdésed van, ne felejtsd el megadni az email címedet!