Skocz do zawartości
Komentator

Kurs Arduino II - #4 - przerwania, kontaktron, czujnik PIR

Pomocna odpowiedź

@Treker Dzięki za odpowiedź ! 

Dioda była podłączona na tak jak na rysunku niżej. Dziwi mnie to, że jej wpięcie sypało przerwanie. Dołączyłem ją w celu sprawdzenia jak długo czujnik wystawia stan wysoki.

pir_dioda_przerwanie.jpg

Udostępnij ten post


Link to post
Share on other sites
10 godzin temu, Merfinius napisał:

Dziwi mnie to, że jej wpięcie sypało przerwanie. Dołączyłem ją w celu sprawdzenia jak długo czujnik wystawia stan wysoki.

Czujnik ten (wg. dokumentacji) w stanie wysokim ma 3,3 V niezależnie od zasilania które może wynosić od 4-12 V. Jest to dobre całkiem dobre gdyż czujnik da się podłączyć do urządzeń na niższe napięcia, ale możliwe że dla Arduino UNO które posługuje się logiką 5 V jest to na granicy i podłączenie dodatkowego obciążania w postaci LED powoduje że spada poniżej granicy 1 logicznej,

Udostępnij ten post


Link to post
Share on other sites
46 minut temu, Gieneq napisał:

 podłączenie dodatkowego obciążania w postaci LED powoduje że spada poniżej granicy 1 logicznej,

Dlaczego napięcie do PINu Arduino miało by spaść? Wydaje mi się, że przy takim podłączeniu LED'a potencjał przed rezystorem i wejściem na PIN Arduino jest takie samo. 

Udostępnij ten post


Link to post
Share on other sites

Nie mogę znaleźć konkretnie jaki jest maksymalny prąd, ale jeżeli jest on rzędu kilku mA to nawet taki mały LED może spowodować że nastąpi spadek napięcia.

Źródło prądu/napięcia w tym przypadku PIR ma swoje parametry: napięcie w stanie jałowym (bez obciążenia) i maksymalny prąd.

Jeżeli podłączysz coś niewielkiego względem maksymalnego prądu (coś co pobierze np. 10% maksymalnego prądu) to napięcie niewiele się zmieni i urządzenie pracuje wtedy jako źródło napięcia, ale jeżeli przesadzisz i dasz coś większego co pobierze maksymalny prąd, to dopóki coś się nie uszkodzi to urządzenie będzie pracować jako źródło prądowe - prąd będzie stały ale napięcie spadnie z racji problemów z wydajnością.

Podłączając 2 urządzenia: LED i Arduino możliwe, że tworzy się niewielki spadek napięcia ale jednak wystarczający aby przestać wyraźnie interpretować 3,3 V jako 1 logiczną. Dla pewności weź miernik i sprawdź co tam się dzieje. A jak nie masz miernika to może podłącz do ADC 🙂 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Gieneq 

Jest to całkiem możliwe dioda bardzo słabo świeciła w porównaniu z połączeniem ze źródłem zasilania 5VDC. Dzięki za zaangażowanie!

Swoją drogą możliwe, że czujnik wystawia stan wysoki przez podciągniecie przez rezystor przez to ten prąd jest mocno ograniczony 🧐

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
7 minut temu, Merfinius napisał:

Swoją drogą możliwe, że czujnik wystawia stan wysoki przez podciągniecie przez rezystor

To się nazywa wyjście open-collector i wątpię że jest to w tym czujniku, bo aktywowałby sygnał poprzez sink (nie źródło tylko to drugie... zlew?) oznacza to że prąd spływa do czujnika, a dokładnie do kolektora tranzystora na wyjściu.

Jeżeli chcesz mieć koniecznie LED to możesz PIRem sterować tranzystor z LEDem w kolektorze i np. od kolektora podać sygnał na Arduino - zrobi się wtedy negacja i tranzystor będzie wystawiał sygnał poprzez ściągnięcie sygnału do masy.

Edytowano przez Gieneq

Udostępnij ten post


Link to post
Share on other sites

Witam serdecznie

Od dwóch dni męczę się z tymi przerwaniami i nadal nie chcą działać :(  Nie mam pojęcia już co mogę robić źle. Poniżej zamieszczam bardzo prosty kod z przerwaniem który i tak nie działa poprawnie (zaraz po uruchomieniu urządzenia, dioda zielona mignie na kilka milisekund i odpala się od razu dioda czerwona, mimo że przycisk nie został wciśnięty). Przycisk (zwykły microswitch) jest podłączony do pinu 2 i GND.

#define green 6
#define red 7
#define syg 13

void setup(){
  pinMode(syg, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(red, OUTPUT);
  pinMode(PIR, INPUT);

  digitalWrite(syg, LOW);
  digitalWrite(red, LOW);
  digitalWrite(green, HIGH);

  attachInterrupt(0,alarm, FALLING);
}

void loop(){
  digitalWrite(syg, HIGH);
  delay(1000);
  digitalWrite(syg, LOW);
  delay(1000);
}

void alarm(){
  digitalWrite(red, HIGH);
  digitalWrite(green, LOW);
}

 

Udostępnij ten post


Link to post
Share on other sites

@catalyst jeśli przycisk podłączony jest na Pinie 2 to czemu w kodzie usiłujesz wskazac PIN 0 jako ten odpowiedzialny za przerwanie? Zmień linijkę:

attachInterrupt(0,alarm, FALLING);

Na

attachInterrupt(digitalPinToInterrupt(2), alarm, FALLING)

Czemu nie korzystasz z funkcji digitalPinToInterrupt? Odpowiada ona za dobranie odpowiedniego pinu przerwań zależnie od płytki. Wtedy taki kod zadziała na każdym rodzaju płytki. 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
53 minuty temu, BHBmacieg napisał:

jeśli przycisk podłączony jest na Pinie 2 to czemu w kodzie usiłujesz wskazac PIN 0

W kwestii formalnej: nie PIN 0 a przerwanie numer 0.

Jest to poprawne, chociaż niewskazane.

 

Udostępnij ten post


Link to post
Share on other sites
27 minut temu, ethanak napisał:

W kwestii formalnej: nie PIN 0 a przerwanie numer 0.

Jest to poprawne, chociaż niewskazane.

 

W takim razie mea culpa. Źle zrozumiałem wpis na blogu. Dziękuję za uwagę. przeczytałem wpis na blogu raz jeszcze i teraz rozumiem. Na podstawie tego co napisałeś wynika, że kod @catalyst powinien działać, a mimo to nie działa. Bo przecież wskazuje przerwanie numer 0, a ono w przypadku UNO przypisane jest do pinu 2. Popraw mnie jeśli nie mam racji?

Ja korzystam z funkcji digitalPinToInterrupt i za każdym razem przerwania działają u mnie jak należy. 

 

Udostępnij ten post


Link to post
Share on other sites

Nie wiem czy ten kod powinien działać czy nie - w kodzie jest odniesienie do jakiegoś niezdefiniowanego PIR, brak pinMode dla pinu 2.

Kod jest niekompletny i w ogóle nie powinien się skompilować.

Jeśli przypadkiem PIR to pin 2 i gdzieś to znikło - to w przypadku przycisku powinno być pinMode(PIR, INPUT_PULLUP) a nie INPUT.

Po poprawieniu powinien działać.

 

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Chcę użyć kilku przerwań PCINT z jednego portu. Jak zachowa się uC jeśli w trakcie obsługi przerwania nastąpi zmiana stanu na kolejnym pinie. Czy po zakończeniu przerwania zostanie wygenerowane ponownie? Jeśli tak to po jakim czasie? Nie mogę nigdzie znaleźć informacji na ten temat.   

Udostępnij ten post


Link to post
Share on other sites

Witam

Mam problem z kontaktronem. Kiedy jest przy nim magnes, wszystko jest ok, ale gdy go nie ma, dioda zaczyna mrygać zamiast zmienić kolor. Żeby lepiej zrozumieć w czym problem, dodałem komunikaty do portu szeregowego i tak to wygląda:

ok.thumb.png.3f3f83eb0a27cd3454f7a097e0c93f9a.png

Gdy kontaktron jest "zamknięty".

alarm.thumb.png.9126e34d20ede722c9b97c882c7f597d.png

Oraz gdy jest "otwarty".

Ciągle przeskakuje ze stany wysokiego na niski i odwrotnie.

Oto program:

#define LED_R 10
#define LED_G 11
#define LED_B 13

#define KONTAKTRON 7

void setup() {
  pinMode(LED_R, OUTPUT); //Piny sterujące diodą RGB jako wyjścia
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);

  pinMode(KONTAKTRON, INPUT_PULLUP);  //Kontaktron jako wejście (jak przycisk)

  digitalWrite(LED_R, LOW); //Dioda wyłączona
  digitalWrite(LED_G, LOW);
  digitalWrite(LED_B, LOW);

  Serial.begin(9600);

}

void loop() {
  if (digitalRead(KONTAKTRON) == LOW) { //Jeśli czujnik zwarty
    digitalWrite(LED_R, LOW); //Stan OK - dioda zielona
    digitalWrite(LED_G, HIGH);
    Serial.println("Stan OK");
  } else {
    digitalWrite(LED_R, HIGH);  //Stan ALARM - dioda czerwona
    digitalWrite(LED_G, LOW);
    Serial.println("ALARM");
  }

}

Co może być przyczyną?

Udostępnij ten post


Link to post
Share on other sites

@Kurczak92 ciężko powiedzieć, bo widzę że masz PULLUP.

Może spróbuj dać opóźnienie, ze 100ms pod koniec loop(). Zamienić na chwilę kontaktron na przycisk. Jeżeli to drugie pomoże to możliwe że kontaktron jest jakiś nie taki albo masz skąś pole magnetyczne które powoduje problemy. Może przepuściłeś przez niego spory prąd i się uszkodził.

Udostępnij ten post


Link to post
Share on other sites

@Gieneq

Niestety ani opóźnienie ani zamiana na przycisk nie działa. Co prawda przy opóźnieniu 1s jest większe prawdopodobieństwo na trafienie w prawidłowy odczyt, ale problem pozostaje.

Udostępnij ten post


Link to post
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...