22 fevereiro 2013

Resistor de elevação

Por acaso você já montou um circuito básico pra acender um led, utilizando um botao, e ele não funcionou direito ? Tipo... acendeu quando não deveria e não acendeu quando deveria ? Pois é, isso pode ser culpa do resistor de elevação (ou resistor pull-up).

Opa ! O que é isso ?

Bom, resistor de elevação é um componente (resistor) que você coloca em determinado circuito, para que o circuito não fique "perdido" quando nada está acontecendo. Parece complicado ? Nem tanto, vamos a um exemplo prático. Você faz um circuito simples, como este abaixo :

resistor pull up arduino

usando o  seguinte programa :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// Projeto : Circuito teste resistor de elevacao
// Autor : Arduino & Cia

void setup()
{
  pinMode(10,OUTPUT); // Pino led
  pinMode(6,INPUT);   // Pino botão
}

void loop()
{ 
  int leitura=digitalRead(6);
  if (leitura == 0)
  { 
     digitalWrite(10,1);
  }
  else
  {
     digitalWrite(10,0);
  }
}

Quando vc está apertando o botão, tudo bem, o Arduino sabe que ali está passando corrente, etc e tal, e acende o led, mas e quando o botão não está apertado ? Qual o estado ? Positivo, negativo, ou indefinido ? É justamente nesse estado "indefinido" que as coisas começam a complicar, gerando resultados diversos, e o Arduino se perde para saber o que está acontecendo no circuito. O resultado é um led que fica meio aceso, meio apagado, piscando às vezes, ou seja, perdido.

Utilizando o circuito anterior e uma pequena resistência (destacada no círculo vermelho), o problema desaparece. Mas qual a mágica ? Não há mágica. Utilizando um resistor de elevação, como este componente é chamado, você define um estado (HIGH) para o botão, quando o mesmo não é pressionado. Veja o circuito abaixo :

Circuito com resistor de elevação / pull-up
Felizmente o Arduíno tem uma função que permite que você acione um resistor de elevação interno, sem precisar adicionar componentes à placa. Para ativa-lo, basta adicionar a linha abaixo no programa :

digitalWrite(6,HIGH);

Seu programa fica assim :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
void setup()

{
  pinMode(10,OUTPUT); // Pino led
  pinMode(6,INPUT);   // Pino botão
  digitalWrite(6,HIGH); // Ativa o resistor de elevação
}

void loop()
{
  //Codigo aqui
}

Desta maneira, você pode usar normalmente o circuito da figura 1, sem se preocupar em colocar mais componentes no circuito.

Obviamente existe uma resposta "eletrônica" para essa questão do resistor de elevação, mas achei que a explicação ficaria melhor em termos gerais, sem muitos detalhes técnicos.

Ah ! da mesma forma que o "pull-up", existe o resistor "pull-down", que ligado ao circuito, mantém o sinal em estado LOW (baixo). ;-)

Comentários para enriquecer o post serão bem vindos. Até a próxima !

5 comentários:

  1. Amigo, bom dia,
    percebi que o resistor de elevação não está ligado no positivo da alimentação.
    só o toque para confundir os iniciantes.
    obrigado pelo material, estava querendo entender o pull-up resistor e com a sua explicação, já foi o suficiente.
    grato

    ResponderExcluir
  2. Também não entendi a imagem. Olhando o circuito parece que o led vai sempre estar aceso.
    O pino 6 está em High, no que o botão interferiria neste caso ? Desculpe sou analista de sistemas mas não tenho conhecimento de eletrônica. Só o muito básico...

    ResponderExcluir
    Respostas
    1. Boa tarde Clebio ! Talvez o tutorial não esteja muito claro, mas no último exemplo de programa eu só coloco o Pino 6 em High para ativar o resistor de elevação interno do Arduino. Se você fizer isso e utilizar o primeiro programa do tutorial, verá que o circuito da Figura 1 funciona normalmente sem a necessidade de utilizar um resistor externo. Abraço !

      Excluir
    2. Olá Clebio. Boas noite.
      O que acontece é que a porta que recebe o sinal da chave não sabe o nível de sinal que está entrando. O resistor de pull up força o sinal alto na porta. Quando uma chave normalmente aberta é coloca nessa porta até o GND, quando pressionada, faz fluir o sinal para o GND através dela e a porta entende como sinal baixo. O resistor de pull down faz o contrario: Força o sinal da porta pra baixo e uma chave normalmente aberta entre a porta e o VCC injeta o sinal alto quando pressionada. Sem estes resistores o mCu mão consegue identificar o nível do sinal pois o condutor da chave e contatos elétricos funcionam como uma "antena" e os valores tendem a oscilar, fazendo o controle "enlouquecer".
      Obs.: O Arduino possui os resistores de pull-up internos e devem ser configurados no setup ou antes do digitalRead. A seguir, a sintaxe:
      pinMode(pino, INPUT_PULLUP);
      Com esta forma apenas um botão entre o pino e o GND é necessário pois um resistor de pull-up interno de valor entre 20k e 150k

      Excluir