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ć?

Guilherme Garcia da Rosa
źródło
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.

Przechodzień
źródło
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?

James cameron
źródło
1
pinMode (pin, INPUT_PULLUP);
jippie