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?
Schemat układu jest taki:
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:
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
- Arduino (tutaj było użyte Arduino Duemilanove, obecnie sprzedawane jest UNO)
- fotorezystor (ten użyty ma zakres rezystancji 16k do 47k )
- rezystor 10k
- kilka drucików montażowych
Już wkrótce – jak można fizycznie pokazać zmieniający się odczyt.
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?
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);
}
@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.
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
Mi cały czas pokazuje wartość 7 (1023 bez dzielenia), bez względu jaki rezystor dam na dzielnik…
@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?
Hej, komunikacja przez USB bedzie działała na UNO?
Tak, bez problemu – w tym przypadku opis jest jak najbardziej aktualny, mimo upływu czasu
Dzięki ;)
Nie byłem pewien, bo czytałem, że komunikacja USB podobno jest tylko na Due i Leonardo ;)
@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.
Dzięki ;)
@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ć.
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ę.
Damian: Dziękuję za pytanie.
Jasne, tu masz przykład:
https://gist.github.com/sprae/7319161
Dziekuje.
Cześć, mam nadzieję, że ktoś ten serwis utrzymuje ;-) mam banalne pytanie dla większości elektroników, ale dla mnie to jeszcze zagadka: dlaczego rezystor 10k, a nie 5k albo 220r? Czy to wynika ze specyfikacji tego konkretnego fotorezystora? Prawo Ohma znam, podzielnik jest dla mnie jasny. Ale dobór wartości w tym przypadku dla mnie to zagadka ;-)
Proszę o pomoc :-)
Nie ma ścisłej reguły, a wartość wynika z prawa Ohma i zasady działania dzielnika napięcia. Trzeba eksperymentalnie dobrać wartość (zmierzyć rezystancje fotorezystora w ciemności i mocno oświetlonego). Jak dasz małą wartość rezystora to uzyskasz pełną skalę odczytów na przetworniku ADC, ale w przypadku największego oświetlenia (gdy rezystancja fotorezystora spada do najmniejszej) prąd płynący przez układ może być spory. Np przy zasilaniu 5V dobierzesz rezystor 100 Ω – w pełnym świetle jakiś leżacy pod ręką fotorezystor ma rezystancję 200 Ω. Razem 300 Ω co daje ~16 mA prądu. Dużo czy nie zależy od zastosowania. Pin Arduino da radę tyle dostarczyć, jakiś nowszy procesor niekoniecznie (nawet przy 3.3V zasilania to będzie 11 mA). Ale jeżeli Twój układ pracuje na baterii to głupio tak marnować energię.
Dlatego zwykle daje się większą wartość. Fotorezystor (ten co go pod ręką mam) ma w ciemności 2 MΩ. 10k przy nim to i tak 0.5% więc w najgorszym przypadku (ciemności) tylko ~0.5% napięcia się odłoży na rezystorze pomiarowym. Czyli dla 5-cio woltowego Arduino jest to ok 25 mV. ADC w Arduino ma skok ok 4.8 mV na jeden odczyt, więc nawet w pełnej ciemności analogRead odczyta najniższą wartość 25/4.8 ~= 5.