Leia a leitura errada

10

Eu configurei o meu Arduino UNO com 4 fios de entrada, eles se conectam às portas 10, 11, 12, 13, eles são conectados à minha placa de ensaio com nada, exceto o fio.

Meu código seria simplesmente:

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

O problema é que, depois de conectar brevemente um pino a 5V ou 3V3, a leitura começaria a ficar louca, como: 1 0 0 1 0 1 1 1 0 1 0 1 1 0 Sem nenhum sentido! Sem ter nenhum fio conectado diretamente ao meu VCC (5V ou 3V3), a leitura muda constantemente, quando deve ser zero!

Meu Arduino está morto? Como posso consertar isso?

Guilherme Garcia da Rosa
fonte
Basta conectar seu pino de disparo ao terra quando não for disparado!

Respostas:

18

O que você tem é chamado de Floating alfinete. Os pinos de entrada digital são muito sensíveis à mudança e, a menos que sejam direcionados positivamente para um estado ou outro (Alto ou Baixo), captarão a capacitância perdida de fontes próximas, como tábuas de pão, dedos humanos ou até o ar. Qualquer fio conectado a ele funcionará como uma pequena antena e fará com que o estado de entrada mude. E quero dizer qualquer fio, o traço na placa, o fio na placa de ensaio, o pino da placa de ensaio, até o pino de metal do próprio CI.

Isso é consultado na página de referência do Arduino:

Se o pino não estiver conectado a nada, digitalRead () pode retornar HIGH ou LOW (e isso pode mudar aleatoriamente).

Se você olhar para o Tutorial do Arduino Digital Pin :

Isso também significa, no entanto, que pinos de entrada sem nada conectado a eles ou com fios conectados a eles que não estão conectados a outros circuitos, relatarão alterações aparentemente aleatórias no estado do pino, captando ruído elétrico do ambiente ou acoplando capacitivamente o estado de um alfinete próximo.

Frequentemente, é útil direcionar um pino de entrada para um estado conhecido, se nenhuma entrada estiver presente. Isso pode ser feito adicionando um resistor de pull-up (a + 5V) ou um resistor de pulldown (resistor ao terra) na entrada, com 10K sendo um valor comum. Também existem resistores de pull-up de 20K, integrados ao chip Atmega, que podem ser acessados ​​por software. Esses resistores de pull-up embutidos são acessados ​​da seguinte maneira.

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

Esses resistores de tração fracos forçam o estado do pino de entrada a um estado conhecido e são facilmente substituídos por tensões de entrada mais fortes, como uma conexão direta ao terra ou + 5v.

Transeunte
fonte
2
Que tal mencionar pinMode(pin, INPUT_PULLUP)? É fácil de lembrar e muito difícil de estragar.
Piojo
6

Isto é normal. A menos que uma entrada esteja conectada a algo, ela será exibida ALTA ou BAIXA ou mudando constantemente. Isso é descrito na página de referência digitalRead no site do Arduino.

O pino de entrada se comporta com alguma pequena capacitância, portanto, conectar brevemente a 3V3 ou 5V carregará a capacitância. Você pode encontrar um efeito semelhante usando um dedo nu.

Você pode evitar o problema adicionando um resistor de grande valor entre o pino e o GND.

Pergunte a si mesmo por que você espera zero?

James cameron
fonte
11
pinMode (pin, INPUT_PULLUP);
jippie