Oko Arduino czyli o fotorezystorze a nie mitologii Tolkiena

piątek, marzec 20, 2009 0:33 by netmaniac | Filled in arduino, dla początkujących, howto, projekty, sklep, Uncategorized

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 układu

Schemat układu

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.

You can leave a response, or trackback from your own site.

Komentarze: 8 to Oko Arduino czyli o fotorezystorze a nie mitologii Tolkiena

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

    kwiecień 14th, 2009 at 14:25

    [...] zajmowaliśmy się tym jak Arduino może odczytać wartość z zewnętrznego czujnika (fotorezystora). Teraz będziemy starać się odczyt [...]

  2. Starter Kit » Arduino - gramy! says:

    wrzesień 29th, 2009 at 02:04

    [...] odczytywać wartości z fotorezystora pisałem w jednym z wcześniejszych postów. Buzzer jest pobudzany przez odpowiednie przykładanie napięcia niskiego i wysokiego. Dla [...]

  3. Arduino – play! | Starter Kit says:

    wrzesień 13th, 2010 at 19:33

    [...] wrote, how to read values from photoresistor in one of previous posts. Buzzer is stimulated to play by properly applied high and low voltage. For (Arduino output port) [...]

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

    wrzesień 14th, 2010 at 22:07

    [...] we were dealing with reading from external sensor (photoresistor). Now we will try to show this [...]

  5. wariat says:

    marzec 31st, 2011 at 00:15

    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?

  6. wariat says:

    marzec 31st, 2011 at 00:54

    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);
    }

  7. netmaniac says:

    marzec 31st, 2011 at 22:09

    @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.

  8. Artur says:

    listopad 10th, 2011 at 18:19

    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

Dodaj komentarz