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 :
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 :
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 !
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
Valeu Allan !
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…
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 !
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