Hitrost utripanja LED diode v odvisnosti od napetosti

Izdelali bomo program, ki bo omogočal spreminjanje hitrosti utripanja LED diode v odvisnosti od napetosti, priključene na analogni vhod A0 razvojne plošče Intel Galileo. Napetost na A0 bomo spreminjali z zasukom potenciometra. Če bo napetost na A0 večja od 2,5 V, naj se vklopi piskač. Dogajanje bomo spremljali na serijskem monitorju.

Poglejmo skico priključitve posameznih elementov na razvojno ploščo Intel Galileo:

Slika 1: Prikaz povezave elementov na razvojno ploščo Intel Galileo.


R = 470 Ω

Rpot = 10 kΩ

Hitrost utripanja LED diode, priključene na digitalni pin 11 je odvisna od napetosti na analognem vhodu A0. Napetost na analognem vhodu A0 spreminjamo s potenciometrom Rpot. V odvisnosti od zasuka potenciometra se zvezno spreminja napetost na A0 od 0 V do 5 V.

Analogno vrednost napetosti na A0 Intel Galileo pretvori v digitalno vrednost. Temu pravimo analogno digitalni pretvornik (A/D pretvornik). Ko vrtimo potenciometer, dobimo na A0 zelo veliko različnih napetosti v območju od 0 V do 5 V.

Slika 2: Pretvorba analognega signala v digitalni s 3-bitnim pretvornikom.


Če ta analogni signal pretvorimo v digitalnega s 3-bitnim A/D pretvornikom, dobimo 8 različnih binarnih (dvojiških) števil, ki predstavljajo različne napetostne nivoje:

Slika 3: Različni napetostni nivoji 3-bitnega AD pretvornika.


Intel Galileo deluje z 10-bitnim AD pretvornikom kar pomeni, da napetost od 0 V - 5 V pretvori v 1024 napetostnih nivojev (1024 stopničk). Lahko rečemo, da je resolucija AD pretvornika zelo visoka. Analogni vhod A0 bo zaznal spremembo napetosti, ki bo večja od 4,88 mV (0,00488 V).

Program za hitrost utripanja LED v odvisnosti od napetosti:

//Program za hitrost utripanja LED v odvisnosti od napetosti:

/*

Hitrost utripanja LED diode v odvisnosti od napetosti na analognem vhodu A0.

Napetost na A0 spreminjamo s potenciometrom 10 kohm (lahko tudi s fotouporom LDR v odvisnosti od svetlobe).

Če naraste napetost na analognem vhodu A0 nad nastavljeno mejo (v našem primeru 2,5 V), vklopi piskač.

Vključen je serijski monitor, kjer lahko opazujemo dogajanje.

Avtor: Milan Ivič, oktober 2014

*/

 //Definiranje priključnih pinov:

 #define Potenciometer_Pin    A0      //Napetost spreminjamo na A0

 #define LED_Pin    11                //LED dioda je priključena na pin 11

 #define Piskac_Pin 2                 //Piskač je priključen na pin 2

 //Deklariranje spremenljivke z imenom Potenciometer_vrednost:

 int Potenciometer_vrednost;

 //Funkcija void setup() se izvede 1 krat:

 void setup()

 {

   Serial.begin(19200);

   Serial.println("Napetost na analognem vhodu A0: ");

  

   //Pina za LED diodo in piskač sta izhodna pina:

   pinMode(LED_Pin, OUTPUT);

   pinMode(Piskac_Pin, OUTPUT);

 }

 //Funkcija void loop() se neprestano izvaja:

 void loop()

 { 

   //Branje vrednosti na pinu A0 in shranjevanje te vrednosti v spremenljivko Potenciometer_vrednost:

   Potenciometer_vrednost = analogRead(Potenciometer_Pin);

   int Vrednost = analogRead(A0);

   float napetost = Vrednost*(5.0 / 1024.0);

   Serial.print("Napetost na analognem vhodu A0 znasa: ");

   Serial.print(napetost);

   Serial.println(" V");

 

   //Vklop LED diode:

   digitalWrite(LED_Pin, HIGH); 

 

   //Prekinitev, katere dolžina je odvisna od nastavitve (zasuka) potenciometra:

   delay(Potenciometer_vrednost);  

 

   //Izklop LED diode:       

   digitalWrite(LED_Pin, LOW);  

 

   //Prekinitev, katere dolžina je odvisna od nastavitve (zasuka) potenciometra::

   delay(Potenciometer_vrednost); 

 

   //Če je napetost na A0 večja od 2,5 V, vklopi piskač:

     if (Potenciometer_vrednost > 511)     //1024/2 = 512 => 2,5 V

     {

       digitalWrite(Piskac_Pin, HIGH);

       Serial.print("Piskac vklopljen, napetost je vecja od 2,5 V!    ");    

     }

     else

     {

       digitalWrite(Piskac_Pin, LOW);

     }

 }

Priključne pine smo tokrat definirali z direktivo #define. Zraven direktive napišemo ime elementa (ime spremenljivke) in pin, na katerega bomo določen element priključili.

V funkciji void setup() smo odprli komunikacijo s serijskim monitorjem, ki nam prikazuje dogajanje na portu, kamor je preko USB priključena razvojna plošča Intel Galileo. Hitrost komunikacije smo določili 19200 bitov na sekundo. Kar hočemo dobesedno izpisati na serijski monitor pišemo med narekovajema:

Serial.println("Napetost na analognem vhodu A0: ");

V tem primeru se bo na serijskem monitorju izpisalo: Napetost na analognem vhodu A0: in na koncu pesledek. Presledek je napisan zato, da bo vrednost napetosti izpisana s presledkom odmaknjema od napisa.

V funkciji void setup() določimo še izhodna pina za LED diodo in piskač.

Opis glavne funkcije void loop(), ki se neprestano izvaja:

V spremenljivko Potenciometer_vrednost shranjujemo binarno vrednost napetosti, ki jo dobimo na potenciometru. Ta je odvisna od zasuka potenciometra in znaša pri napetosti 5 V 1024, pri 2,5 V 512, pri 0 V pa 0.

Nato smo deklarirali dve lokalni spremenljivki, Vrednost in napetost. V spremenljivko Vrednost, ki je tipa int se shranjuje vrednost napetosti na A0 (binarna vrednost). V spremenljivko napetost, ki je tipa float (vanjo lahko shranjujemo realna števila, to so števila z decimalno vejico) pa se shranjuje vrednost napetosti v decimalnem številskem sistemu. Pretvorbo v decimalni sistem dobimo z izračunom:

Največja vrednost napetosti, ki jo lahko dobimo na A0 je 5 V, kar predstavlja binarni podatek (10-bitni) 1024.

.

napetost = vrednost x 5,0 / 1024

Če je vrednost na A0 512, je napetost = 512 x 5,0 / 1024 = 2,5 V.

Z ukazom delay in parametrom Potenciometer_vrednost določimo zakasnitev v izvajanju programa. Ker se vrednost parametra spreminja v odvisnosti od napetosti na A0 (od zasuka potenciometra), spreminjamo tudi hitrost utripanja LED diode.

Z if stavkom določimo pogoj (Potenciometer_vrednost > 511) za vklop piskača. Če je pogoj resničen (če je napetost večja od 2,5 V), vklopimo piskač in na serijski monitor pošljemo napis Piskac vklopljen, napetost je vecja od 2,5 V!   . V nasprotnem primeru je piskač izklopljen.

Z ukazom Serial.print() pišemo v vrstico podatek, ki je podan med ().

Z uazom Serial.println() pišemo v novo vrstico podatek, ki je podan med ().

Serial.print(napetost);

Parameter napetost ni med narekovajema, zato se izpiše vrednost te spremenljivke, v kateri se shranjuje vrednost napetosti na analognem vhodu A0.

Serijski monitor vklopimo s klikom na ikono v orodni vrstici, ki se nahaja skrajno desno.

Slika 4: Ikona za serijski monitor.

Prikaz na serijskem monitorju pri različnih napetostih na A0 (različnih zasukih potenciometra):

Slika 5: Izpis na serijskem monitorju.

Slika 6: Povezava elementov vezja z razvojno ploščo Intel Galileo.