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?


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.


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?


11
pinMode (pin, INPUT_PULLUP);
jippie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.