niedziela, 26 lipca 2015

[3] Arduino - Diody led, ADC, fototranzysor

W tym poście przedstawię sposób podłączenia zestawu diod z [2] razem z fototranzystorem. Diody będą dynamicznie się zapalały w zależności od ilości światła jakie będzie pobierane przez fototranzystor.

WPROWADZENIE


Fotorezystor jest to element półprzewodnikowy, światłoczuły. Jego rezystancja ulega zmianie w zależności od ilości padającego światła.
Poprzez oświetlanie fotorezystora następuje zwiększenie przepływającego prądu, czyli zmniejszenie rezystancji.

Fotorezystor jest wykorzystywany do:
- pomiaru temperatury przez pomiar natężenia promieniowania,
- ostrzegania w systemach pomiarowych,.
- wykrywanie zanieczyszczeń w rzekach bądź zbiornikach wodnych,
- detekcja strat ciepła w budynkach.

Potencjometr - jest to regulowany rezystor. Posiada trzy wyprowadzenia, które odpowiadają wyprowadzeniom dzielnika napięcia. Jedno podłączamy do zasilania, drugi (środkowy) jest wyprowadzeniem wartości, trzeci pin podłączamy do masy.

Działanie potencjometru oparte jest na działaniu dzielnika napięcia. Stosuje się go do regulacji napięcia bądź prądu w urządzeniach elektrycznych.

ADC - Przetwornik analogowo cyfrowy (ang. Analog to Digital Converter) - jest to układ pozwalający na zmianę sygnału analogowego na cyfrowy. Co pozwala na przetwarznie wartości analogowych w urządzeniach elektronicznych. Sygnał analogowy zostaje uproszczony do postaci dyskretnej. Przetwarzanie składa się z trzech etapów czyli: próbkowanie, kwantowanie oraz kodowanie.
W Arduino Uno Rev3 zastosowano przetwonik 10-bitowy, który jest połączony z multiplekserem. Wobec tego mamy możliwość korzystania z jednego przetwornika posiadającego 6 kanałów od 0 do 5.

Przetwornik ADC jest 10 bitowy co pozwala na odczytanie wartości z zakresu od 0 do 1023, czyli 1024 kombinacje.

Pomiar napięcia poprzez ADC trwa w Arduino 0,0001 s. Więc pomiary dokonywane są w bardzo krótkim czasie. Pozwala to na wykonanie maksymalnie 10 tys pomiarów w ciągu sekundy.

Wejścia w Arduino mają tolerancję z zakresu od 0 do 5V. Podłączenie innego napięcia może spowodować nieodwracalne uszkodzenie płytki.

PRZYKŁAD 1 - ADC, potencjometr


Po inicjalizacji podstawowych parametrów w funkcji setup następuje zainicjalizowanie transmisji portem szeregowym. W funkcji loop zostaje odczytana i wyświetlona wartość z potencjometru.
Otrzymane wartości mieszczą się w zakresie od 0 do 1023. 
const int PotPin = 0;  //Deklaracja pinu
int Potencjometr;      //Zmienna na wartość
 
void setup()
{
  Serial.begin(9600);  //Rozpoczęcie transmiji 
}
 
void loop()
{
  Potencjometr = analogRead(PotPin);  //Odczytanie wartości
                                      //Wpisanie do zmiennej
  Serial.println(Potencjometr);       //Wyświetlenie wartości
  delay(100);
}

PRZYKŁAD 2 - fotorezystor


W celu odczytania wartości przetworzonej przez ADC wykonano przedstawiony poniżej program. Po inicjalizacji w pętli głównej następuje rozpoczęcie transmisji po porcie szeregowym (UART), z ustawioną prędkością transmisji wynoszącą 9600 b/s. Można także ustawić drugi parametr, który będzie odpowiedzialny za wielkość ramki. Jest on parametrem dodatkowym, w przypadku nie wybrania żadnego parametru automatycznie wpisywana jest wartość 8N1 (osiem bitów danych, brak kontroli parzystości, jeden bit stopu)

int PinRezys = 0;  //Przypisanie zmiennej pin
int Rezys;         //Zmienna przechowująca wartość
 
void setup()
{
  Serial.begin(9600);  //Rozpoczęcie transmisji 
                       //przez port szeregowy
}
 
void loop()
{
  Rezys = analogRead(PinRezys);  //Odczytanie wartości
  Serial.println(Rezys);         //Wyświetlenie
  delay(1000);                   //Opóźnienie
}

Odczytano następujące wartości minimalne oraz maksymalne dla fotorezystora: Min - 348 (normalnie); Max - 978 (latarka);

PRZYKŁAD 3 - fotorezystor, diody


Kontrolowanie pojedynczej diody w zależności od wartości otrzymanej z fotorezystora. Wartość odczytana z wejścia analogowego jest wpisywana do zmiennej, następnie następuje jej mapowanie, czyli zmiana przedziału (od 0 do 255). Kolejna funkcja constrain przetwarza tą wartość i wpisuje ją do tej samej zmiennej. W ostatnim kroku następuje zapalenie bądź zgaszenie diody.

Na rysunku 3.1. pokazałem sposób podłączenia samego fotorezystora bez diod, Sposób podłączenia diod przedstawiłem w [2].
Rys. 3.1. Podłączenie fotorezystora

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const int DiodePin1 = 2; //Dioda
 
const int PinRezys = 0;  //Przypisanie zmiennej pin
const int Min = 348;
const int Max = 977;
 
int Rezys;               //Zmienna przechowująca wartość
 
void setup()
{
  pinMode(DiodePin1, OUTPUT);  //Ustawienie pinu jako wyjście
}
 
void loop()
{
 
  Rezys = analogRead(PinRezys);  //Odczytanie wartości
  Rezys = map(Rezys, Min, Max, 0, 255); //Mapowanie otrzymanej
                                        //wartości od 0 do 255
  Rezys = constrain(Rezys, 0, 255);     //Przetworzenie wartości
 
  analogWrite(DiodePin1, Rezys); //Zapalenie (255) lub zgaszenie (0)
}

W tym przykładzie wykorzystam wartości z przykładu 2. Do Arduino podłącze 10 diod, które użyje do dynamicznego zapalania kolejnej z nich w miarę zwiększania się wartości otrzymanej z fotorezystora.

Zamiast fotorezystora można podłączyć także potencjometr.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Diody podłączone są do pinów od 2 do 11
const int DiodePin1 = 2;
const int DiodePin2 = 3;
const int DiodePin3 = 4;
const int DiodePin4 = 5;
const int DiodePin5 = 6;
const int DiodePin6 = 7;
const int DiodePin7 = 8;
const int DiodePin8 = 9;
const int DiodePin9 = 10;
const int DiodePin10 = 11;
 
const int PinRezys = 0;  //Przypisanie zmiennej pin
const int Min = 348;
const int Max = 977;
 
int PinDiode = 2;
int Rezys;               //Zmienna przechowująca wartość
 
void ResetDiodes(void);
void RunDiodes(void);
 
void setup()
{
  pinMode(DiodePin1, OUTPUT);  //Ustawienie pinu jako wyjście
  pinMode(DiodePin2, OUTPUT);
  pinMode(DiodePin3, OUTPUT);
  pinMode(DiodePin4, OUTPUT);
  pinMode(DiodePin5, OUTPUT);
  pinMode(DiodePin6, OUTPUT);
  pinMode(DiodePin7, OUTPUT);
  pinMode(DiodePin8, OUTPUT);
  pinMode(DiodePin9, OUTPUT);
  pinMode(DiodePin10, OUTPUT);
 
  Serial.begin(9600);
}
 
void loop()
{ 
  ResetDiodes();
  Rezys = analogRead(PinRezys);         //Odczytanie wartości
  Rezys = map(Rezys, Min, Max, 0, 255); //Mapowanie otrzymanej
                                        //wartości od 0 do 255
  Rezys = constrain(Rezys, 0, 255);     //Przetworzenie wartości
 
  Serial.println(Rezys);                //Wyświetlenie wartości
 
  RunDiodes();                          //Wejście do funkcji
 
  delay(200);                           //Opóźnienie
}
 
void ResetDiodes()
{
   for(PinDiode=11;PinDiode>=2;PinDiode--)
   {
     digitalWrite(PinDiode, LOW);
   }     
   PinDiode = 2; 
}
 
void RunDiodes()
{
  if(Rezys <= 254)
  {
    digitalWrite(DiodePin10, HIGH);
  }
  if(Rezys <= 225)
  {
    digitalWrite(DiodePin9, HIGH);
  }
  if(Rezys <= 200)
  {
    digitalWrite(DiodePin8, HIGH);
  }
  if(Rezys <= 175)
  {
    digitalWrite(DiodePin7, HIGH);
  }
    if(Rezys <= 150)
  {
    digitalWrite(DiodePin6, HIGH);
  }
  if(Rezys <= 125)
  {
    digitalWrite(DiodePin5, HIGH);
  }
    if(Rezys <= 100)
  {
    digitalWrite(DiodePin4, HIGH);
  }
  if(Rezys <= 75)
  {
    digitalWrite(DiodePin3, HIGH);
  }
  if(Rezys <= 50)
  {
    digitalWrite(DiodePin2, HIGH);
  }
  if(Rezys <= 25)
  {
    digitalWrite(DiodePin1, HIGH);
  }
}