Arduino digital Odczyt odczytu nieprawidłowy


10

Skonfigurowałem Arduino UNO z 4 przewodami wejściowymi, łączą się one z portem 10, 11, 12, 13, są podłączone do mojej płyty pilśniowej tylko na przewodzie.

Mój kod będzie po prostu:

Serial.println(digitalRead(13));
Serial.println(digitalRead(12));
Serial.println(digitalRead(11));
Serial.println(digitalRead(10));

Chodzi o to, że po krótkim podłączeniu styku do 5V lub 3V3 odczyt zaczynałby wariować: 1 0 0 1 0 1 1 1 0 1 0 1 1 0 Bez sensu! Bez podłączania jakiegokolwiek przewodu bezpośrednio do mojego VCC (5 V lub 3 V 3) odczyt ciągle się zmienia, kiedy powinien wynosić zero!

Czy moje Arduino nie żyje? Jak mogę to naprawić?


Po prostu podłącz sworzeń wyzwalający do masy, gdy nie zostanie wyzwolony!

Odpowiedzi:


18

To, co masz, nazywa się Floatingszpilką. Piny wejścia cyfrowego są bardzo wrażliwe na zmiany i chyba że zostaną pozytywnie ustawione w jednym lub drugim stanie (wysokim lub niskim), wychwycą zbłąkaną pojemność z pobliskich źródeł, takich jak płyty do krojenia chleba, ludzkie palce, a nawet powietrze. Każdy podłączony do niego przewód będzie działał jak mała antena i spowoduje zmianę stanu wejścia. Mam na myśli dowolny drut, ślad na płycie, drut do deski do krojenia, szpilkę do płyty chlebowej, a nawet metalową szpilkę samego układu scalonego.

Odnosi się to do strony referencyjnej Arduino:

Jeśli pin nie jest podłączony do niczego, digitalRead () może zwrócić WYSOKI lub NISKI (a to może się zmieniać losowo).

Jeśli spojrzysz na samouczek Arduino Digital Pin :

Oznacza to jednak również, że piny wejściowe bez podłączonych do nich przewodów lub z przewodami podłączonymi do nich, które nie są podłączone do innych obwodów, będą zgłaszać pozornie przypadkowe zmiany stanu styków, wychwytywanie szumu elektrycznego z otoczenia lub pojemnościowe sprzężenie stanu pobliskiej szpilki.

Często przydatne jest sterowanie pinem wejściowym do znanego stanu, jeśli nie ma wejścia. Można tego dokonać, dodając na wejściu rezystor podciągający (do + 5 V) lub rezystor rozwijany (rezystor do masy), przy czym 10K jest wspólną wartością. Istnieją również wygodne rezystory pullup 20K wbudowane w układ Atmega, do których można uzyskać dostęp z poziomu oprogramowania. Te wbudowane rezystory podciągające są dostępne w następujący sposób.

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors

Te rezystory o niskim obciążeniu wymuszają stan styku wejściowego w znanym stanie i łatwo można je zastąpić silniejszymi napięciami wejściowymi, takimi jak bezpośrednie połączenie z masą lub + 5 V.


2
A może wspomnieć pinMode(pin, INPUT_PULLUP)? Jest łatwy do zapamiętania i bardzo trudny do zepsucia.
piojo,

6

To normalne. O ile wejście nie jest podłączone do czegoś, pokaże WYSOKI lub NISKI lub ciągle się zmienia. Jest to opisane na stronie referencyjnej digitalRead na stronie internetowej Arduino.

Pin wejściowy zachowuje się z niewielką pojemnością, więc krótkie podłączenie do 3V3 lub 5V spowoduje naładowanie pojemności. Możesz znaleźć podobny efekt za pomocą gołego palca.

Możesz uniknąć tego problemu, dodając rezystor o dużej wartości między pinem a GND.

Zadaj sobie pytanie, dlaczego oczekujesz zera?


1
pinMode (pin, INPUT_PULLUP);
jippie
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.