Porta analógica lendo valores incorretos

147 views
Skip to first unread message

Paulo Coutinho

unread,
Feb 16, 2012, 11:58:40 PM2/16/12
to ardu...@googlegroups.com, arduino-...@googlegroups.com
Ola

Estou tentando fazer minha porta analogica 0 e 1 ler o valor de uma porta digital que está sempre ligada (HIGH) com 5V.

Porém ao colocar no console o resultado, a leitura da porta fica escalando pra cima e pra baixo direto, +/- assim:

0
200
450
790
980
1023
1023
1023
976
654
578
245
100
0
200
450
790
980
1023
1023
1023
976
654
578
245
100
0
....

O que eu fiz foi isso:

#include <IRremote.h>

int BUTTON_LIGHT_SENDER = 2;
int BUTTON_LIGHT_READER = 0;
int LED_LIGHT = 12;

void setup() {                
  pinMode(BUTTON_LIGHT_SENDER, OUTPUT);  
  digitalWrite(BUTTON_LIGHT_SENDER, HIGH);
  pinMode(LED_LIGHT, OUTPUT);  
  
  Serial.begin(9600);
}

void loop() 
{
  digitalWrite(BUTTON_LIGHT_SENDER, HIGH);
  
  // verifica botao da luz
  int buttonLightPressed = analogRead(A1);
  Serial.println(buttonLightPressed);
  
  if (buttonLightPressed >= 1023)
  {
    if (digitalRead(LED_LIGHT) == 0)
    {
      digitalWrite(LED_LIGHT, HIGH);
    }
    else 
    {
      digitalWrite(LED_LIGHT, LOW);
    }
  }
  
  delay(100);
}

Coloquei um fio da porta 12 digital para a porta 1 analógica (na verdade o fio passa por um botão), quando pressiono a porta fica com 1023 direto, fora isso fica variando como falei cima.

Se eu tirar todos os fios a porta continua variando a leitura, parece estar ignorando quando a carga não chega até a porta por algum motivo :(



--
Atenciosamente,
Paulo Coutinho.
Blog: www.prsolucoes.com/blog
Site: www.prsolucoes.com
Msn:  pa...@prsolucoes.com
Skype: paulo.prsolucoes
Telefone: +55 21 9386-0010
Consultor Certificado Bindows

Maurício Féo

unread,
Feb 17, 2012, 12:59:04 AM2/17/12
to ardu...@googlegroups.com, arduino-...@googlegroups.com
Pra solucionar:  Ligue um resistor de 10k do pino ao Gnd.

Pra entender: 

O Arduino faz a leitura da tensão no pino, que é proporcional à carga contida no pino.
Se ligarmos o pino aos 5V, o pino se encherá de carga até sua tensão chegar aos 5V. O Arduino lerá HIGH.
Se ligarmos a 0V, toda carga sairá do pino e o Arduino lerá LOW.

Porém, se deixarmos o pino em aberto, não tem como prever se a carga continuará no pino ou não. O Arduino lerá valores aleatórios que dependem do meio. Com o pino em aberto, o simples fato de você encostar na placa influenciará a carga no pino alterando a leitura analógica.
Esse estado em aberto é chamado na eletrônica digital como "Alta Impedância".

Para resolver isso se usa o que chamam de resistores pull-down. Que funciona como um dreno de carga quando o pino está em aberto.
Teste colocar um resistor de 10k~20k ligando o pino ao Gnd. (Se fosse ao 5V seria pull-up) Se apertar o botão carregará o pino e lerá ALTO. Quando soltar o botão, a carga "escoará" pelo resistor para o Gnd e a leitura ficará estável no valor BAIXO.

O Arduino tem um resistor interno de pull-up em cada pino que é acionado quando escrevemos HIGH num pino configurado como input, mas acho que só funciona quando fazendo leitura digital, nunca testei com analogRead()

Abraços,
--
Maurício Féo Rivello
engenheirando.com

Carlos Eduardo "Mascote" Garcia de Carvalho

unread,
Feb 17, 2012, 1:26:11 AM2/17/12
to ardu...@googlegroups.com
Maurício,

no caso dele que a ligação atual está

PINO DIGITAL -------(botão)----- PINO ANALóGICO

ele terá que colocar o resistor do pino analógico ao terra correto?

PINO DIGITAL -------(botão)--+------ PINO ANALóGICO
                                          \------(resistor)--- GND

Seria isso?

---
Carlos Eduardo "Mascote" Garcia de Carvalho
"Reconhece-o em todos os teus caminhos, e ele endireitará as tuas veredas." Provérbios 3.6
(21) 8125-1737
Skype: carloseduardo.gc


2012/2/17 Maurício Féo <mauri...@gmail.com>

Webert Oliveira

unread,
Feb 17, 2012, 5:56:56 AM2/17/12
to ardu...@googlegroups.com, arduino-...@googlegroups.com
Mauricio muito boa a explicação,
Mas acho que o erro está sendo mais simples ainda.
 
Paulo, você está usando o pino Analogico ou Digital?
 
Na declaração:
Pino digital do arduino = 0;
Pino analogico arduino = A0;
 
talvez você declarou o pino errado, e está tentando fazer a leitura no local errado.
teste isso e siga as dicas do Mauricio e tudo sairá bem.
Abraços

Paulo Coutinho

unread,
Feb 17, 2012, 7:25:58 AM2/17/12
to ardu...@googlegroups.com, arduino-...@googlegroups.com
Falae,

O pino está certo, tanto que quando aperto o botão ele fica HIGH (1023) direto. O problema é que o simples fato do fio estar encostando no botão, ele fica variando tipo uma onda direto, então deve ser esse vazamento que a galera falou.

Vou fazer como falaram e posto os resultados aqui.

Segue algumas imagens de como está ficando:

Webert Oliveira

unread,
Feb 17, 2012, 7:32:38 AM2/17/12
to ardu...@googlegroups.com
Como você coloca o Pino como HIGH se ele é de leitura? Ou voc~e quer dizer quando coloca um valor de entrada HIGH nele, é isso ?  

Maurício Féo

unread,
Feb 17, 2012, 8:02:34 AM2/17/12
to ardu...@googlegroups.com
Bom dia pessoal,

Mascote, é isso mesmo que você desenhou.

Webert, essa pergunta foi sobre minha explicação?
Quando digo escrever HIGH num INPUT é fazer de fato o digitalWrite(HIGH) mesmo o pino sendo INPUT. O Arduino entende e ao invés de fixar valor HIGH nele (como seria sendo output), apenas habilitará o resistor de pull-up interno e ele lerá valor HIGH só quando o pino estiver em aberto.

Abraços,


Em 17 de fevereiro de 2012 10:32, Webert Oliveira <wertol...@gmail.com> escreveu:
Como você coloca o Pino como HIGH se ele é de leitura? Ou voc~e quer dizer quando coloca um valor de entrada HIGH nele, é isso ?  



Izaias Cabral

unread,
Feb 17, 2012, 8:09:34 AM2/17/12
to ardu...@googlegroups.com
hummm!!!!!!    Gostei disso!


--
Izaias Cabral
61  8117 9365

Webert Oliveira

unread,
Feb 17, 2012, 8:13:18 AM2/17/12
to ardu...@googlegroups.com
Não Mauricio, digo pelo que o Paulo falou,  entendi que havia uma declaração de setup do mesmo pino, tanto para entrada quanto para saida. Ai daria merda mesmo...  rsrsrrs
Mas massa saber essa do pino ai tb.

Paulo Coutinho

unread,
Feb 20, 2012, 11:45:41 AM2/20/12
to arduino-...@googlegroups.com, ardu...@googlegroups.com
Falae pessoal,

Obrigado a todos pelas resposta. Funcionou perfeitamente, era isso mesmo. Coloquei um de 10K.





Em 18 de fevereiro de 2012 01:33, Lucas Fragomeni <lucasfr...@gmail.com> escreveu:

Acho que o Maurício está correto. Precisa de um resistor aterrando a entrada para cortar as oscilações (igual a qualquer botão que se liga numa porta digital).

Eu uso 10k.

--
Você recebeu esta mensagem porque está inscrito no
Grupo "arduino-brasília" nos Grupos do Google.
E-mail: arduino-...@googlegroups.com
Url: http://groups.google.com.br/group/arduino-brasilia?hl=pt-BR
Sair: arduino-brasil...@googlegroups.com

--
Você recebeu esta mensagem porque está inscrito no
Grupo "arduino-brasília" nos Grupos do Google.
E-mail: arduino-...@googlegroups.com
Url: http://groups.google.com.br/group/arduino-brasilia?hl=pt-BR
Sair: arduino-brasil...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages