Warning: mysqli_select_db() expects parameter 1 to be mysqli, string given in /home/itstreet/public_html/classes/CMySQL.php on line 22

Warning: mysqli_query() expects at least 2 parameters, 1 given in /home/itstreet/public_html/classes/CMySQL.php on line 24
ITstreet -Arduino i potenciometri
Preskoči na sadržaj

ITstreet postovi

Arduino i potenciometri

S raznim varijantama potenciometara se srećemo svakodnevno. Dovoljno je da pojačamo zvuk na radiju u kolima (mada je sve više punih digitalaca). U Arduino svetu potenciometri imaju čestu primenu. Bilo kao regulatori pozadinskog osvetljenja LCD ekrana, bilo u raznim drugim projektima. U suštini to su varijabilni otpornici gde se vrednost otpornosti menja po potrebi. Postoje razne vrste potenciometara ali osnovna podela je na algoritamske i linearne. Cene se kreću od nekoliko desetina centi do dolar-dva.

Arduino očitava vrednosti potenciometra preko analognih pinova i vidi ih u rasponu od 0-1023, što uz početnu nulu čini 1024 digitalnih vrednosti. U pitanju je 10-bitna rezolucija. Očitavanja sa analognog pina idu u Analogno Digitalni konvertor (ADC) koji vrednosti prebacuje u digitalni format i koje mi kasnije koristimo u projektu. To znači da ako potenciometar povežemo na 5V i GND, i ako je "zavijen" do kraja, na analognom pinu ćemo imati 0 i imaćemo očitanu digitalnu vrednost 0, ali ako je "odvijen" do kraja (5V) imaćemo 1023. Takođe je bitno sa koje strane potenciometra dovodimo 5V, zavisiće na kojoj strani ćemo imati minimalnu otpornost a na kojoj maksimalnu.



Očitavanje Analognog ulaza

Najprostije je da izlaz potenciometra (obično srednja nožica) povežemo na analogni ulaz Arduina.



void setup() {
  Serial.begin(9600);
}
void loop() {
  int sensorValue = analogRead(A0);
  Serial.println(senzorValue);
  delay(5);        
}


Na ovaj način ćemo na serial monitoru prikazati očitane digitalne vrednosti uz 5 milisekundi razmaka. Kako zakrećemo klizač na potenciometru, tako se i dobijene vrednosti menjaju.



Praktična upotreba očitanih vrednosti

Ako u blink skeču dobijene vrednosti unesemo u delay() funkciju možemo kontrolisati vreme treptanja LED po našoj želji. Povezivanje ide po šemi ispod.



int senzorPin = A0;
int ledPin = 13;
int senzorVrednost = 0;
void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  senzorVrednost = analogRead(senzorPin);
  digitalWrite(ledPin, HIGH);
  Serial.println(senzorVrednost);
  delay(senzorVrednost);
  digitalWrite(ledPin, LOW);
  Serial.println(senzorVrednost);
  delay(senzorVrednost);
}



Praktična primena - primer

Ako očitane vrednosti potenciometra koje primi ADC pomnožimo sa 0,00488 dobijamo dosta približne vrednosti napona u Voltima. Ovde je stavljeno 0,00489 iz razloga da nam poslednja LED zasigurno zasvetli na samom kraju klizača potenciometra. Povezivanje prema šemi ispod. U skeču prvo označavamo ulazne i izlazne pinove i dajemo početne vrednosti promenljivima. U loop funkciji pretvaramo očitavanja u napon i u zavisnosti koliko je Volti palimo određene LED. Potrebno je 6 LED, 6 otpornika 220R, potenciometar 10K, malo žica i Uno.



int senzorPin = A0;
int ledPin1 = 2;
int ledPin2 = 3;
int ledPin3 = 4;
int ledPin4 = 5;
int ledPin5 = 6;
int ledPin6 = 7;
int senzorVrednost = 0;
int napon = 0;
void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  senzorVrednost = analogRead(senzorPin);
  napon = senzorVrednost*0.00489; //pretvaramo očitane vrednosti u napon u V
  if (napon == 0){
    digitalWrite(ledPin1, HIGH);
    Serial.println("Napona nema");
    }else{
      digitalWrite(ledPin1, LOW);
      }
  if (napon >= 1){
    digitalWrite(ledPin2, HIGH);
    Serial.print("Napon postoji i iznosi ");
    Serial.print(napon);
    Serial.println("V");
    }else{
      digitalWrite(ledPin2, LOW);
      }
  if (napon >= 2){
    digitalWrite(ledPin3, HIGH);
    Serial.print("Napon postoji i iznosi ");
    Serial.print(napon);
    Serial.println("V");
    }else{
      digitalWrite(ledPin3, LOW);
      }
  if (napon >= 3){
    digitalWrite(ledPin4, HIGH);
    Serial.print("Napon postoji i iznosi ");
    Serial.print(napon);
    Serial.println("V");
    }else{
      digitalWrite(ledPin4, LOW);
      }
  if (napon >= 4){
    digitalWrite(ledPin5, HIGH);
    Serial.print("Napon postoji i iznosi ");
    Serial.print(napon);
    Serial.println("V");
    }else{
      digitalWrite(ledPin5, LOW);
      }  
  if (napon == 5){
    digitalWrite(ledPin6, HIGH);
    Serial.print("Napon postoji i iznosi ");
    Serial.print(napon);
    Serial.println("V");
    }else{
      digitalWrite(ledPin6, LOW);
      }    
delay(100);
}



Na kraju da kažem da se potenciometri razlikuju i po otpornosti. Najčešće se koriste oni od 10K (kiloma) ali se mogu sresti i razni drugi. Poređenja radi, 10K potenciometar će prema Omovom zakonu (I=V/R) na 5V vući maksimalno 0,5mA. Onaj od 10 oma će u tom slučaju vući 500mA. Iz ovoga vidimo da što je manja otpornost potenciometra on proporcionalno vuče više struje. Neko će reći zašto onda ne uzmemo 10.000K? Razlog tome je šum. Što veća vrednost potenciometra to je proporcionalno veći šum. Iz tog razloga se najčešće koristi 10K kao zlatna sredina. ADC na Arduinu bi trebalo da vuče 0 Volti ali u stvarnosti on ipak vuče neku minimalnu količinu i taj šum koji se javlja dovešće do "čudnih" očitavanja.

Kako rešiti šum?
Da bi se eliminisao šum potrebno je filtriranje. Zatim, treba izbeći projekte koji direktno zavise od strogo preciznih vrednosti potenciometra. Za filtriranje se koristi EMA algoritam. EMA je skraćeno od Exponential Moving Average.



    int senzorPin = A0;
    int senzorVrednost = 0; //promenljiva očitana vrednost potenciometra, jednaka EMA Y
    float emaA = 0.6; //EMA alpha
    int emaS = 0; //EMA S
 
void setup(){
    Serial.begin(9600);
    emaS = analogRead(senzorPin);
}
 
void loop(){
    senzorVrednost = analogRead(senzorPin);
    emaS = (emaA*sensorVrednost) + ((1-emaA)*emaS);//filtriranje kroz EMA
    Serial.println(emaS);//filtrirana očitana vrednost
    delay(50);
}

Do sledećeg skeča...

Ostavite poruku

Vaša mejl adresa neće biti objavljena.Označena polja su obavezna*