Analóg kimenet

Néha szükség van arra, hogy a kimenő jel erősségét változtatni tudjuk, erre szolgálnak a Arduino
PWM kimenetei. Amolyan digitálisan szimulált analóg kimenetek. A működésük dióhéjban:
mivel digitális kimenetek ezért csak két értéket vehetnek fel (0,5V) ahhoz, hogy több értéket kitudjunk csiholni a kimenetből (analóggá tehessük azt) ezt az 5V-os tápfeszt másodpercenként
többször meg kell szakítanunk, négyszögjel impulzust kell létre hoznunk. A megszakítások időkitevője határozza meg a kimenő impulzus hosszát. Bővebben: *RGB led vezérlés 140408


Az Unon 6db PWM kimenet található ezeket az analogWrite() utasítással programozhatjuk.
Az utasítás két értéket használ: az első a digitális kimenet száma, a második az érték amit fel
szeretnénk vétetni vele, ez 0 és 255 közé eső szám lehet.

Nézzünk egy nagyon egyszerű kapcsolást, csak egy led és egy 270ohmos áramkorlátozó ellenállás szükséges hozzá.
Kössük a ledet az ellenálláson keresztül a 3 digitális kimenetre, a led másik kivezetését a gnd-re.


Töltsük fel a következő progit:

void setup(){
pinMode(3,OUTPUT);
}
void loop(){
for (int i=0;i<256;i++){
analogWrite(3,i);
delay(20);
}
}

Folyamatosan növeli a led fény erejét, majd max értéknél(255) újra kezdi.
Az Uno PWM kimenetei: 3,5,6,9,10,11-es digitális kimenetek.


Most ezt az analóg kimenetet összeszerkesztjük egy analóg bemenettel, ehhez már kellenek az előző
részben tanultak. Rá kötünk a kapcsolásunkra egy 10kohmos potenciamétert is amivel szabályozhatjuk a led fényerejét.
A poti középső kimenetét A0-ra, jobb oldalát +5V-ra, bal oldalát GND-re kötjük.

A kód:

void setup(){
pinMode(3,OUTPUT);
}
void loop(){
int analog = analogRead(A0); // beolvassuk analog bemenet értékét (0-1023)
int digit = map(analog,0,1023,0,255); //átalakítjuk kimeneti értékké (0-255)
analogWrite(3,digit); // kiíratjuk a hármas kimenetre
}

A potis fényerő szabályozásról ennyit, most nézzünk meg egy nyomógombosat is.
Bekötünk két nyomógombot, amik segítségével fogjuk a fényerőt szabályozni, ezek a 2-es és 4-es
kimenethez fognak kapcsolódni mindenféle felhúzó ellenállás nélkül, vagyis pontosabban a
beépített felhúzó ellenállást fogjuk használni.
A felhúzó ellenállások bekapcsolására a következő parancs szolgál: pinMode(kim,INPUT_PULLUP);
kim: a kimenet száma
INPUT_PULLUP: a felhúzó ellenállást bekapcsoló konstans

Nézzük a használatát: először a nyomógombokat kötjük be a 2-es 4-es kimenetre, a gombok másik felét a Gnd-re. Ha ez megvan a következő kódot töltsük fel:

int digit = 0;
void setup(){
pinMode(3,OUTPUT);
pinMode(2,INPUT_PULLUP); //felhúzó ellenállás bekapcsolása
pinMode(4,INPUT_PULLUP);

}
void loop(){

//csak akkor hajtódik végre az if ha 2-es bemenet magas állapotban és digit 255-nél kisebb
if(digitalRead(2)==HIGH && digit<255){
digit++;
analogWrite(3,digit);
delay(20);
}

//akkor hajtódik végre ha 4-es bemenet maga állapotban és digit nagyobb mint 0
if(digitalRead(4)==HIGH && digit>0){
digit--;
analogWrite(3,digit);
delay(20);
}
}


Vizsgáljuk meg egy kicsit közelebbről a következő sort:
if(digitalRead(2)==HIGH && digit<255)
ebben érdekesség a két & jel ez az összehasonlító kifejezések összekapcsolására szolgál logikai
és ként. Magyarul leírva: ha első kifejezés igaz ÉS a második kifejezés is igaz, csak is akkor
hajtódnak végre az if utasításai.

Logikai operátorok:

&& – és(and)

|| – vagy(or)

! – nem(not)

az és-t kitárgyaltuk, a vagy-nál elég ha csak egyik kifejezés igaz az if utasítások végrehajtódnak.
A nem egy külön állatfaj, itt az if akkor igaz ha a kifejezés hamis. Egy példa:
if(!digit) – csak akkor hajtódik végre ha digit értéke 0 .