Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Witam

Mam pytanie:

Dlaczego w programach które piszesz w tym artykule nie dostajesz wiersza typu:

pinMode (A5, INPUT);

Arduino jak sprawdzaniem poprawnie działa zarówno z dodaniem tego wiersza jak i bez niego, dlaczego tak się dzieje??

Dla przykładu kiedy się pominie wiersz typu:

pinMode (diodaLed, OUTPUT);

To już arduino (dioda do tego pinu poprawnie podłączona) niedziała.

Pozdrawiam Mikołaj - Wrocław 🙂

Link do komentarza
Share on other sites

Bo wejścia procesora Arduino są domyślnie w trybie INPUT po włączeniu zasilania. Tak jest bezpieczniej dla całego otoczenia, bo procesor nie wymusza żadnych sygnałów (i dzięki temu nie powoduje konfliktów) na pinach, które mogłyby być w układzie sterowane przez coś innego.

Link do komentarza
Share on other sites

Cześć jestem tu nowy i chcę o coś zapytać.

Ostatnio wpadłem na pomysł aby zrobić prosty miernik prędkości wiatru. Znalazłem silniczek od napędu CD, po rozkręceniu go do 1300obr/min nie przekroczył granicy 5V, więc na początek nie ma sie czym przejmować zbyt dużym napięciem na wejściu analogowym. Skleiłem całość, dodatkowo zastosowałem zabezpieczenie, aby w przypadku przeciwnych obrotach silnika nie podać na arduino odwrotnego napięcia.

Cóż chciałem zobaczyć cóż arduino mi powie. Jak się okazało klapa (spodziewałem sie tego).

Czysto teoretycznie jeśli ten mini silniczek potraktujemy jako prądnicę, która wraz ze wzrostem prędkości obrotowej zwiększa swoje napięcie to teoretycznie w arduino na wejściu analogowym pojawi się napięcie zależne od tych obrotów. Powinno nam to dać możliwość odczytu prędkości obrotowej ów silnika czyli mówiąc w uproszczeniu wiatru.

wywołałem odczyt poleceniem analogRead(A2) - na pinie A2 mam wpięty przewód od silniczka.

Całość odczytuje za pomocą portu szeregowego. W monitorze szeregowym bez względu na obroty silnika widnieje wartość ok 100. Nie mam pojęcia jak się za to dalej zabrać 🙁

Jeśli chodzi o prawdziwe mierniki wiatru dla arduino to są one trudno dostępne i drogie.

Proszę o pomoc.

Pozdrawiam

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

4funrc, a mierzyłeś multimetrem jakie masz tam napięcie?

Bez obrotów -> 0V

przy ruszeniu palcem -> ok 0,11V

przy ok 1300obr/min -> ok. 1,5 ~ 1,7V

przy ok 3000obr/min -> ok. 4 ~ 5V

Teraz tak sobie myślę, że może arduino nie jest w stanie odczytać takich niskich wartości, ale przy doświadczeniach z dzielnikiem napięcia działa, więc nie wiem.

Ogólnie rzecz biorąc na arduino mam zrobioną całą stacje pogodową, włącznie z czujnikami deszczu itp itd i chciałem dodać sobie tan prosty wiatromierz.

A może występuje zbyt duży spadek napięcia i sygnał nie dociera do arduino? Może lepiej będzie jak np. tam zamiast silnika podłącze jakąś baterie AA i zobacze odczyt na arduino jaki i czy w ogóle występuje spadek napięcia?

Pozdrawiam serdecznie

Link do komentarza
Share on other sites

Bo wejścia procesora Arduino są domyślnie w trybie INPUT po włączeniu zasilania. Tak jest bezpieczniej dla całego otoczenia, bo procesor nie wymusza żadnych sygnałów (i dzięki temu nie powoduje konfliktów) na pinach, które mogłyby być w układzie sterowane przez coś innego.

To również po prostu zalecenie Arduino, Twórcy projektu w dokumentacji piszą o tym, że w przypadku odczytywaniu stanów przez ADC nie jest konieczna konfiguracja pinów (jedno wynika z drugiego) 😉 Ale dodaję dla formalności, że nie jest to wiedza tajemna.

4funrc, sprawdź też dla pewności, czy te piny ADC nadal działają - np. wykorzystując zwykły dzielnik napięcia. Może jednak pojawiają się szpilki wyższego napięcia, które uszkodziły te wejścia?

Link do komentarza
Share on other sites

4.5

Da się prościej/ krócej ?

#define yellow 9
#define red 8
#define button 7

int potencjometr = 0;
String wpisanaLiczba = "";
int dana = 0;
int proby = 3;
int widelki = 40;

void setup() {
 pinMode(green, OUTPUT);   //Przypisanie pinów
 pinMode(yellow, OUTPUT);
 pinMode(red, OUTPUT);
 pinMode(button, INPUT_PULLUP);

 Serial.begin(9600); //Rozpoczęcie konwersacji

}

void loop() {
 if (digitalRead(button) == LOW) {     //Czy jest wciśnięty przycisk
   potencjometr = analogRead(A5);      //Odczytanie wskazania potencjometru
   String potencjometrString = String(potencjometr);
   Serial.println("Zgadnij liczbe z zakresu 0-1023!");   //Komunikaat
   while (Serial.available() == 0) {}; //Czekaj do czasu wpisania
   delay(200);
   wpisanaLiczba = Serial.readStringUntil('\n');   //Wczytanie liczby
   dana = wpisanaLiczba.toInt();
   Serial.println("Twoja liczba to: " + wpisanaLiczba); //Wypisanie liczby użytkownika

   while ((proby > 1) && ((dana >= (potencjometr + widelki)) || (dana <= (potencjometr - widelki)))) {    //Spróbuj jeszcze raz
       proby = proby - 1;
       digitalWrite(yellow, HIGH);
       if ((dana - potencjometr) < 0) {
         Serial.println("Za malo");
       } else {
         Serial.println("Za duzo");
       }
       Serial.println("Try again");
       delay(2000);
       digitalWrite(yellow, LOW);
       while (Serial.available() == 0) {};
       wpisanaLiczba = Serial.readStringUntil('\n');   //Wczytanie liczby 
       dana = wpisanaLiczba.toInt();  
       Serial.println("Twoja liczba to: " + wpisanaLiczba); //Wypisanie liczby użytkownika
   }
   if (((dana <= (potencjometr + widelki)) && (dana >= (potencjometr - widelki)))) {                   //Wygrana
       Serial.println("You won!");
       digitalWrite(green, HIGH);
       delay(2000);
       digitalWrite(green, LOW);
       proby = 3;
       Serial.println("Dokladnie: " + potencjometrString);
   } else {                            //Przegrana
   Serial.println("Sorry, you lost!");
   Serial.println("Poprawna odpowiedz to: " + potencjometrString);
   digitalWrite(red, HIGH);
   delay(2000);
   digitalWrite(red, LOW);
   proby = 3;
   }
 }
}

4.6

Czym kod był dłuższy tym, program gorzej działał 😉 (wpisałem if, else if, else gdzie else nie miało możliwości zajść Hahahahahha, 2 dni zachodziłem w głowę co jest nie tak)

#define left 9
#define middle 8
#define right 7

int rezLeft = 0;
int rezRight = 0;
int roznica = 0;
int czulosc = 30;

void setup() {
 pinMode(left, OUTPUT);
 pinMode(middle, OUTPUT);
 pinMode(right, OUTPUT);
 pinMode(A4, INPUT_PULLUP);
 pinMode(A5, INPUT_PULLUP);
}

void loop() {
 rezLeft = analogRead(A4);
 rezRight = analogRead(A5); 

 roznica = abs(rezLeft - rezRight);

if  ((rezLeft > rezRight) && (roznica > czulosc)) {
   digitalWrite(left, HIGH);
   delay(500);
   digitalWrite(left, LOW);
} else if ((rezLeft < rezRight) && (roznica > czulosc)) {
   digitalWrite(right, HIGH);
   delay(500);
   digitalWrite(right, LOW);
} else {
   digitalWrite(middle, HIGH);
   delay(500);
   digitalWrite(middle, LOW); 
 }
}
Link do komentarza
Share on other sites

Da się prościej/ krócej ?

Prawie zawsze da się coś skrócić/uprościć, ale czasami nie ma to sensu, bo może tylko zaciemnić program. Tutaj masz napisane wszystko jasno i przejrzyście, jeśli działa poprawnie, to nie ma większego sensu na siłę czegoś skracać - szczególnie, że całość jest stosunkowo krótka 🙂

Link do komentarza
Share on other sites

Witam, nie rozumiem gdzie popełniłem błąd w próbie rozwiązania zadania 4.4. Proszę o pomoc.

int odczytanaWartosc; //Zmienna do przechowywania odczytu ADC
int prog; //Próg włączenia światła - ustawiany potencjometrem
float napiecie;
boolean swiatlo = false;
void setup() {
 pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED
 Serial.begin(9600);
}

void loop() {
 odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC
 prog = analogRead(A4);//Odczytanie wartości z ADC
 napiecie = odczytanaWartosc * (5.0/1023.0);

 if (odczytanaWartosc < prog) { //Czy jest ciemniej od ustawionego progu?
    digitalWrite(8, HIGH);//Włączenie diody
    if(swiatlo == false){
     Serial.println(napiecie);
     swiatlo = true;    
    }
 }else{
    swiatlo = false;
    digitalWrite(8, LOW);//Wyłączenie diody        
 }
}
Link do komentarza
Share on other sites

Elsefor, w takim przypadku najlepiej spróbować sobie pomóc przez dodanie większej ilości miejsc, w której wysyłasz informacja do komputera. Zacznij np. od wyświetlania wartości obu zmierzonych wyjść A4 i A5. Sprawdź później, czy program wchodzi w odpowiednie warunki właśnie wtedy, gdy się tego spodziewasz. Sprawdzaj krok, po kroku. Dla ułatwienia możesz na końcu pętli dodać sobie opóźnienie, aby danych wysyłanych do komputera było mniej - dzięki temu łatwiej będzie analizować Ci, to co pojawi się w terminalu.

Link do komentarza
Share on other sites

Zastanawia mnie jedna rzecz, dlaczego mój monitor portu szeregowego pokazuje mi tylko 750 kombinacji?

Dodam, że korzystam z Arduino Nano i zasilam swoją płytkę stykową z diodami napięciem 3.3 V. To raczej nie ma wpływu na ilość kombinacji. Bo domyślam się że przetwornik jest również 10 bitowy, bo gdyby był 8 to dochodziło by do 256 kombinacji. Jeśli się mylę, poprawcie mnie.

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.