Oko Arduino czyli o fotorezystorze a nie mitologii Tolkiena

Oko Arduino – to brzmi jak cytat z J. R. Tolkiena, a chodzi o podłączenie do Arduino fotorezystora. Tym postem mam zamiar zacząć krótki cykl artykułów o podstawach elektroniki.

Fotorezystor to układ, którego oporność zmienia się w zależności od natężenia światła padającego na niego. Pozostaje tylko zmierzyć to w jakiś sposób. W jaki?

Dla zabawowego zastosowania pominiemy na razie zupełnie dokładność pomiaru a jedynie nas będzie interesowała bardzo uproszczona wersja.

Jak to wygląda?

Prosty układ, zmontowany na płytce prototypowej

Prosty układ, zmontowany na płytce prototypowej (kliknij na obrazek aby zobaczyć notki na zdjęciu na stronie Flickra)

Schemat układu jest taki:

Schemat podłączenia Arduino do fotorezystora

 

Schemat podłączenia Arduino do fotorezystora

To co tutaj jest narysowane to tak zwany dzielnik napięcia. Poczytaj na Wikipedii jak dokładnie działa.

W skrócie napięcie w punkcie pomiędzy dwoma rezystorami będzie się zmieniać w zależności od zmieniającej się rezystancji foto rezystora. I to właśnie będziemy mierzyć  naszym programem.

Oto jego kod:

// pin z którego odczytujemy wartość napięcia
int photoPin = 0;
//idczytana wartość
int val = 0;

//początkowa konfiguracja
void setup()
{
  pinMode(photoPin, INPUT); // ustawienie pinu jako wejscie
  Serial.begin(57600);
}

void loop()
{
  //odczytujemy i normalizujemy do przedziału 0-7
  val = analogRead(photoPin)/128;
  for (int i=0;i<=val;i++) {
    Serial.print(".");
  }
  Serial.println();
  delay(90);
}

Program (jak prawie każdy na Arduino) składa się z części przygotowywującej układ do działania (setup) oraz głównej pętli (loop) wykonującej się póki prąd w Arduino…

W głównej pętli mierzymy napięcie, przekształcamy odczytaną wartość w zakres liczb od 0 do 7 (bo Arduino odczytuje napięcie jako liczbę od 0 1023, więc po podzieleniu na 128 i zaokrągleniu w dół dostajemy wynik od 0 do 7) i tyle ile wyszło, tyle kropek wyświetlamy. Chwila przerwy i pętla trwa…

Rezultat działania:

Arduino IDE w trakcie pracy naszego programu

Arduino IDE w trakcie pracy naszego programu

W trakcie pracy zakrywam ręką fotorezystor, zmieniając jego rezystancję a w rezultacie napięcie odczytywane przez Arduino na PIN 0. Ilość kropek jest proporcjonalna do odczytanego napięcia.

Wykaz części

Już wkrótce – jak można fizycznie pokazać zmieniający się odczyt.

20 thoughts on “Oko Arduino czyli o fotorezystorze a nie mitologii Tolkiena

  1. Pingback: Starter Kit » Diody LED czyli jak migac i świecić

  2. Pingback: Starter Kit » Arduino - gramy!

  3. Pingback: Arduino – play! | Starter Kit

  4. Pingback: LED diodes – how to flash and light | Starter Kit

  5. wariat

    w kwestii formalnej, rozgryzam zabawkę powoli bo czasu mało. Czy jest jakikolwiek powód dla którego rezerwowana jest pamięć na numer pinu:
    int photoPin = 0;
    W wersji oryginalnej kod po skompilowaniu zajmuje 2820 bajtów

    Przecież on tam jest wpięty i zostanie na stałe czyli jeśli dobrze rozumiem można:
    #define photoPin 0

    zmieniając powyższe oraz rezerwując zmienną val w pętli loop:
    int val = analogRead( photoPin )/128;

    oszczędzić można całe 10 bajtów … ok to nic, ale jednak. Nie pytam generalnie czy to co mówię działa (wiem, że działa) pytam czy jest jakiś powód aby rezerwować zmienne wcześniej, czy w normalnych projektach to ma sens i warto mieć jednak taki nawyk?

    Odpowiedz
  6. wariat

    Bo jeśli nie chodzi o miejsce w pamięci to można też tak:

    void loop()
    {
    //odczytujemy i normalizujemy do przedziału 0-7
    int val = analogRead( photoPin ) / 128;
    char analog[] = “xxxxxxx”;
    analog[val] = ”;
    Serial.println(analog);

    delay(90);
    }

    Odpowiedz
  7. netmaniac Autor wpisu

    @wariat
    Uwaga jak najbardziej słuszna – użycie #define jest w tym miejscu zasadne i oszczędza pamięć, której jest często mało.

    Odpowiedz
  8. Artur

    Witam.
    To moje początki z arduino i chciałbym rozwiac pewne wątpliwości.

    I
    Jak powinno się podlączać elementy do arduino aby go nie uszkodzić:
    a) tylko i wyłącznie gdy arduino nie jest zasilane.
    b) można gdy arduino jest zasilane.

    II
    Co w przypadku takim.
    1 Podłączamy jakis układzik (kilka LEDów)
    2 zgrywamy na arduino program, diodki swiecą
    3 zrobiliśmy nowy układ, (np: w miejscu gdzie poprzednio był digital OUT, teraz ma być digital IN)
    4 i tu mój problem. żeby wgrać nowy program, trzeba podłączyć zasilanie do Arduino (kabel USB), a wtedy uruchomi się stary program. Czy nie uszkodzimy nic? Czy nie powinniśmy jakoś wyczyścić pamięć po poprzednim programie zanim podłączymy nasz nowy układ?
    Dziękuję za pomoc.
    Pozdrawiam
    Artur

    Odpowiedz
  9. Kuba

    Mi cały czas pokazuje wartość 7 (1023 bez dzielenia), bez względu jaki rezystor dam na dzielnik…

    Odpowiedz
  10. netmaniac Autor wpisu

    @Kuba
    Skoro pokazuje 1023 to znaczy ze ma tam +5V. Pewny jesteś że w dobrym miejscu pin 0 podłączyłeś? Między dwa rezystory a nie między fotorezystor i +5V?

    Jak dasz dwa zwykłe rezystory zamiast rezystora i fotorezystora to co odczyta Ci pin 0 (analogowy pin)? Przy dwóch takich samych rezystorach (np 2k2) powinno być około 500.

    Jeśli jest 500 a po zmianie jednego rezystora na fotorezystor jest 1023 wygląda to na uszkodzony fotorezystor…

    Masz zwykły multimetr? Żeby sprawdzić jaką ma rezystancję fotorezystor? Czy zmienia się ze zmianą oświetlenia?

    Odpowiedz
  11. Pingback: Starter Kit » Samochodzik, czyli jak wykorzystać modem Xbee. » Starter Kit

    1. netmaniac Autor wpisu

      Tak, bez problemu – w tym przypadku opis jest jak najbardziej aktualny, mimo upływu czasu

      Odpowiedz
  12. Verdeski

    Dzięki ;)
    Nie byłem pewien, bo czytałem, że komunikacja USB podobno jest tylko na Due i Leonardo ;)

    Odpowiedz
  13. netmaniac Autor wpisu

    @Verdeski
    Nie wiem co ktoś miał na myśli. W Leonardo masz możliwość łatwego podłączenia przez USB do komputera jako inne urządzenie niż Serial (np klawiatura, mysz itp). W wypadku UNO to też jest możliwe ale nie tak proste jak z Leonardo. Może to miał ktoś na myśli.

    Odpowiedz
  14. Sobsz

    @Artur:
    I
    Najbezpieczniej jest podłączać/odłączać diody/fotorezystory/rezystory/buzzery/itp., kiedy Arduino jest odłączone.
    II
    W Arduino Uno (dawne Duemilanove) jest przycisk “Reset” do czyszczenia pamięci, poza tym, kiedy podłączysz i jest uruchomione Arduino IDE, może się automatycznie resetować.

    Odpowiedz
  15. Damian

    czy mógłby mi ktoś napisać kod który sprawia że dioda led świeci tylko gdy jest ciemno przy użyciu fotorezystora. Chciałbym również prosić o schemat do kodu. Z góry dziękuję.

    Odpowiedz

Pozostaw odpowiedź Verdeski Anuluj pisanie odpowiedzi

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.