Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Jako laika w temacie nurtuje mnie jedno pytanie. Dlaczego fotorezystor podłączony jest do arduino jako dzielnik napięcia? W moim naiwnym rozumowaniu wygląda to tak. Arduino pracuje z napięciem 5V (pomijamy jakieś małe wachania). Podpinam fotorezystor bezpośrednio do +5V i pinu analogowego. Fotorezystor w swych skrajnych zakresach podaje na pin analogowy albo 0V albo 5V. Po co więc jest dzielnik napięcia?

Link do komentarza
Share on other sites

@Ilona witam na forum 🙂

1 godzinę temu, Ilona napisał:

Fotorezystor w swych skrajnych zakresach podaje na pin analogowy albo 0V albo 5V.

I tu Cię zaskoczę, fotorezystor w Twojej konfiguracji zawsze podaje 5V, ponieważ niewielkie zmian rezystancji nic tu nie zmieniają. Arduino rejestruje zmiany napięcia czyli potrzebny jest dzielnik napięcia 🙂 

  • Lubię! 1
Link do komentarza
Share on other sites

@Ilona pamiętaj, że fotorezystor działa podobnie jak rezystor - a rezystor ogranicza prąd, a nie napięcie. Dopiero korzystając z prawa Kirchhoffa, po zbudowanie dzielnika napięcia możemy właśnie wykorzystać rezystory do zmiany napięcia. Zerknij na poniższe dwa filmy:

 

 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Cześć wszystkim. Namęczyłem się z zadaniem 4.6. Działa, ale znając życie, błędy czy niedopatrzenia są więc proszę o sugestie.

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  Serial.begin(9600);
}

// zmienne do odczytu wartosci z fotorezystorow
int fotoLewy;
int fotoPrawy;

void loop() {

  for (int i = 2; i <= 6; i++){
    digitalWrite(i, LOW); // gaszenie diod
  }
  
  fotoLewy = analogRead(A4);
  fotoPrawy = analogRead(A5); 

  // usredniona wartosc odczytow z fotorezystorow, bo u mnie byly spore roznice
  int sredniaFoto = (fotoLewy + fotoPrawy) / 2;

  int jednaDioda; // przechowa wartosc potrzebna do zaswiecenia jednej diody
  jednaDioda = sredniaFoto/3; 
  // kazdy fotorezystor ma "swoje" 2 diody plus jedna "wspolna"
  // wiec beda trzy przedzialy i w zaleznosci... 

  int roznicaOdczytow = fotoLewy - fotoPrawy; // ...od roznicy odczytow z fotorezystorow...

  // ...obliczymy numer diody do zapalenia
  int ktoraDioda = roznicaOdczytow / jednaDioda;

  if (ktoraDioda == 0) 
    digitalWrite(4, HIGH); // srodkowa dioda
    
  if (ktoraDioda == 1)
    digitalWrite(5, HIGH); // pierwsza w lewo od srodkowej
    
  if (ktoraDioda > 1)
    digitalWrite(6, HIGH); // skrajna lewa
    
  if (ktoraDioda == -1)
    digitalWrite(3, HIGH); // pierwsza w prawo od srodkowej
    
  if (ktoraDioda < -1)
    digitalWrite(2, HIGH); // skrajna prawa
}

foto.thumb.JPG.554b031ed2b2824f190a6d112866eb6d.JPG

Czy w ogóle mój tok myślenia jest opdowiedni?

  • Lubię! 1
Link do komentarza
Share on other sites

@badbit fajnie że kombinujesz z różnicą sygnałów, idziesz w dobrą stronę. Choć nie do końca rozumiem po co ta średnia, chyba lepiej działać na staych wartościach (progach), bo nie jestem pewny czy możesz teraz ustalić przybliżoną odległość (czy jest coś blisko/daleko).

Możesz spróbować obliczyć dla każdej diody odległość (cos jak odległość 2 punktów na płaszczyźnie i na tej podstawie dla każdej diody wyznaczyć świecenie (a nawet jasność jak dasz PWM). Możesz też pozbyć się warunków jak zapakujesz dane w tablice - o tym możesz poczytać w sieci, albo przeszukać komentarze pod tym wątkiem 😉 

Edytowano przez Gieneq
  • Lubię! 1
Link do komentarza
Share on other sites

Cześć,

Mam stałe skoki napięcia na Fotorezystorze czy to jest normalne? 

Wartości skaczą mi w zakresie 150-400 przechodząc powoli od 150 do 400 i odwrotnie przy normalnym świetle. Po zasłonięciu fotorezystora niewiele się zmienia, wartości skaczą wtedy 100-350.

Co może być powodem?

#define zielonaD 7

int wartoscFoto = 0;


void setup() {
  pinMode(zielonaD, OUTPUT);

  digitalWrite(zielonaD, LOW);
  Serial.begin(9600);
}

void loop() {
  wartoscFoto = analogRead(A5);

  if (wartoscFoto < 200) {
    digitalWrite(zielonaD, HIGH);
  } else {
    digitalWrite(zielonaD, LOW);
  }
  Serial.println(wartoscFoto);
  delay(50);
}

 

Pozdrawiam

IMG-5844.JPG

Link do komentarza
Share on other sites

@Achtenbob nie powinieneś mieć aż takich skoków. Sprawdź dla pewności czy problemem nie jest płytka stykowa (może gdzieś jest słabe połączenie). Oprócz tego, jeśli masz miernik to sprawdź proszę czy rezystor działa poprawnie tj. czy zmienia się jego opór względem oświetlenia.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

@Stark wybacz brak odpowiedzi - musiało nam umknąć 🙂 Problem wynika prawdopodobnie  z ustawień Twojego terminala - miałeś tam wybraną opcję, że na końcu danych wysyłany jest znak nowej linii. Jeśli ustawisz tam, aby terminal nie dodawał żadnych znaków na końcu linii to problem zniknie.

  • Lubię! 1
Link do komentarza
Share on other sites

@Treker super, dziękuję!

Oczywiście nic się nie stało - otrzymałem wtedy odpowiedzi na mój post, jednak nie otrzymałem odpowiedzi na to konkretne pytanie.

Czy mógłbyś przybliżyć w jaki sposób to działa? Rozumiem to tak, że pobierana zostaje wartość, którą wpisałem tj. dana liczba po czym wykonuje się pętla i zostaje pobrana kolejna wartość tj. nic przez to, że nastąpiło przejście do kolejnej linii?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.