Quando você adquire uma placa Arduino Uno, a primeira coisa que vem em mente é como ligar e desligar um equipamento ou eletrodoméstico, ou como ler uma tecla do computador para enviar comandos para a placa, ou seja, usar os pinos digitais do Arduino para controlar o mundo a sua volta.
Este artigo visa apresentar as funções de manipulação dos pinos digitais do Arduino para usá-los como entrada ou saída digital, exibindo os passos para correta configuração e por fim o seu uso em algumas aplicações.
Pinos digitais do Arduino UNO
A placa Arduino UNO possui 14 pinos que podem ser configurados como entrada ou saídas digitais conforme a necessidade de seu projeto. Estes pinos são numerados de 0 a 13, conforme destacado na figura a seguir:
Antes de utilizar cada um desses pinos em sua aplicação, você deve configurá-lo como entrada ou saída digital, conforme a necessidade. Por exemplo, para acionar um LED você deve configurar o pino como saída e para ler uma tecla você deve configurar o pino como entrada.
Por padrão os pinos digitais do Arduino estão configurados como entradas digitais, porém, para ficar mais explicito na programação, deve-se configurar o pino como entrada. Dessa forma o pino é colocado em um estado de alta impedância, equivalente a um resistor de 100 MegaOhms em serie com o circuito a ser monitorado. Dessa forma, o pino absorve uma corrente muito baixa do circuito que está monitorando. Devido a essa característica de alta impedância, quando um pino colocado com entrada digital encontrasse flutuando (sem ligação definida), o nível de tensão presente nesse pino fica variando não podendo ser determinado um valor estável devido a ruido elétrico e até mesmo capacitância de entrada do pino. Para resolver esse problema é necessário colocar um resistor de pull up (ligado a +5V) ou um resistor de pull down (ligado a GND) conforme a necessidade. Esses resistores garantem nível lógico estável quando por exemplo uma tecla não está pressionada. Geralmente utiliza-se um resistor de 10K para esse propósito. A seguir é exibida a ligação desses resistores no circuito para leitura de tecla:
O microcontrolador ATmega328, da placa Arduino UNO, possui resistores de pull-up internos ( 20 Kilohms) que facilitam a ligação de teclas, sensores sem a necessidade de conectar externamente um resistor de pull-up. A habilitação desses resistores é feita de maneira simples via software.
Quando um pino é configurado com saída, ele se encontra em estado de baixa impedância. Dessa forma, o pino pode fornecer ou drenar corrente para um circuito externo. A corrente máxima que um pino pode fornecer ou drenar é de 40 mA, porém a soma das correntes não pode ultrapassar 200 mA. Deve-se ficar atento a corrente maiores que este limite e a curto-circuitos que podem danificar o transistor de saída danificando o pino e até mesmo queimar o microcontrolador. Essa é uma característica perigosa para a placa Arduino e seria interessante se tivessem resistores ou algum tipo de proteção em todos os pinos utilizados como saída para limitar a corrente em uma situação anormal.
Funções para usos dos Pinos digitais do Arduino
A plataforma Arduino possui funções para trabalhar com entradas e saídas digitais que abstraem toda a configurações dos registradores que configuram e acessam os pino de I/O. Isso torna a programação do Arduino realmente fácil e esse é seu encanto. Essas funções são:
-
void pinMode();
Essa função é utilizada para configurar um pino como entrada ou saída digital. Ela geralmente é utilizada dentro da função setup(). Apresenta as seguintes características:
Sintaxe:
pinMode(pino, modo);
Parâmetros:
pino: Número correspondente ao pino que se deseja configurar, conforme a placa que está trabalhando. No caso da Arduino UNO pode ser de 0 a 13;
modo: Modo que deseja configurar o pino. INPUT, INPUT_PULLUP, OUTPUT.
-
INPUT: Entrada digital;
-
INPUT_PULLUP: Entrada digital com resistor de pull-up (ligado ao VCC) interno habilitado;
-
OUTPUT: Saída digital;
Retorno:
Essa função não tem retorno algum.
-
int digitalRead();
Essa função lê o valor presente em um pino digital. Este valor pode ser HIGH ou LOW. Apresenta as seguintes características:
Sintaxe:
digitalRead(pino);
Parâmetros:
pino: valor correspondente ao pino que se deseja ler.
Retorno:
HIGH ou LOW.
-
void digitalWrite();
A função digitalWrite() coloca um nível lógico Alto (HIGH, 5V) ou baixo (LOW, 0V) em um pino configurado como saída digital.
Sintaxe:
digitalWrite(pino, valor)
Parâmetros:
pino: Número correspondente ao pino;
valor: HIGH OU LOW
Retorno:
Essa função não tem retorno algum.
Exemplo
Para exemplificar a utilização de pinos de I/O digitais, vamos desenvolver uma aplicação de leitura de tecla e acionamento de LED, conforme o a montagem feita no software Fritzing exibida a seguir:
O esquema elétrico obtido a partir do Fritzing é exibido abaixo, note que no circuito há um resistor de pull-up que garante nível lógico alto quando tecla não está pressionada:
O exemplo consiste em ler a tecla S1 e ligar o LED caso a mesma estiver pressionada. Caso não esteja sendo pressionada, o LED deve permanecer desligado. O Sketch a seguir exibe a programação:
/*
Leitura de tecla
O exemplo le uma tecla conectada ao pino 2 e aciona um led conectado ao pino 13
*/
const int ledPin = 13; // cria uma constante com o numero do pino ligado ao LED
const int inputPin = 2; // cria uma constante com o numero do pino conectado a tecla
void setup()
{
pinMode(ledPin, OUTPUT); // declara o pino do led como saída
pinMode(inputPin, INPUT); // declara o pino da tecla como entrada
}
void loop()
{
int val = digitalRead(inputPin); // le o valor na entrada
if (val == LOW) // se valor está em zero( tecla pressionada)
{
digitalWrite(ledPin, HIGH); // Liga LED indicando tecla pressionada
}
else
{
digitalWrite(ledPin, LOW); // Desliga LED indicando tecla solta
}
}
A programação apresentada acima possui uma estrutura bem simples e serve de inicio para a manipulação de pinos de I/O digitais. Com as três funções apresentadas é possível aplicar em diversos projetos que necessitem de acionamento e leitura de sinais digitais. Agora para fixar os conceitos apresentados é necessário colocar a mão na massa!!! Fica como exercício o desenvolvimento de um sketch para leitura de tecla com resistor de pull up interno habilitado para o pino onde é conecta a tecla S1.
Saiba mais
Placas Arduino – trajetória até o UNO
Referências









Olá,
Estou a utilizar um Arduino Uno rev3 e preciso de accionar um relé que para isso precisa de 34mA.
Como cada I/O tem capacidade para fornecer 20mA, estou a pensar utilizar duas linhas de I/O, que podem fazer o drive de 40mA.
Como desconheço a arquitectura interna das portas de I/O, questiono se preciso de algum díodo de proteção para evitar problemas com o curto circuito das linhas.
Obrigado pela ajuda que me possam dar
Só pra ficar bem claro, de acordo com o início do texto o pino 13 precisa ser ALTO quando se tratar de entrada digital e BAIXO quando for saída?
Bom dia, sou novo na área, como faço pra mandar sinal de gnd nos pinos da saída, da placa uno, invés de sinal positivo nos pinos 0 a 7
Olá, estou com um modulo de GSM e um arduino, para fazer um botão de pânico pro carro da minha esposa. O problema é que após a partida do veículo e alimentação do circuito, tenho que pressionar um botão para enviar o GND pro BOOT do módulo GSM, só assim ele fica ativo, e posso pressionar o então botão de pânico.
Teria como o arduino enviar esse GND pro boot, depois de uns 2 segundos da alimentação do circuito?
estou usando um arduino uno, mas pretendo trocar pelo nano e o modulo gsm é o Neoway m590e.
Obrigado!
Olá Joni, você pode programar o Arduino para dar esse comando.
abraços
Olá Fábio.
Qual comando e porta eu uso? Já pesquisei e não encontrei nada.
Joni, é necessário ver o circuito. Você pode compartilhar?
Como faço para dizer ao arduino ler a entrada 2 e sair na 4, ler a 9 e sair na 10 especificamente?
Coloque os pins 2 e 9 como INPUT e 4 e 10 como OUTPUT.
Srs, sou curioso e sempre guarndo placas pcb que acho para reaproveitamento de peças, e já achei microcontroladores atmega 168 ou 328 , gostaria de saber como faço para transformar eles em uma placa arduino, tambem já achei placas de timers e outras placas comuns e gostaria de saber como faço para pegar essas placas e sacar os microcontroladores e transformar em arduino, ou até mesmo pegar a placa e reprogramar
Excelente pergunta. A resposta é procure no Google pelos termos Arduino Standalone. Vai encontrar diversos circuitos. Depois é só pesquisar por carregar bootloader no arduino (nesse caso talvez precise de outro Arduino ou um dispositivo de interface que permita fazer essa gravação). As peças mais difíceis de achar são o microcontrolador e o cristal (o restos são pecinhas comuns de encontrar).
Espero ter ajudado
Como seria se eu quisesse ler um sensor de nível que fecha o circuito quando atinge determinado nível?
Conectei um resistor na saída e liguei uma ponta no sensor e a outra ponta no +vcc.
Quando aciono o sensor (fecha o circuito), tenho a leitura de tensão alta, porém quando abro o circuito, o digitaRead continua retornando tensão alta.
Queria que ele retornasse tensão baixa quando o circuito estivesse aberto.
Olá bom dia
Quantos sensores dht 22 posso conectar ao mesmo tempo no arduino Uno ?
Olá…
Tem como fazer leituras com as entradas PWM parecidas com as feitas nas Analogicas?
Matheus,
Os pinos para PWM são configurados como saídas digitais. Você quer usá-los como entrada analógica? Se for isso, não é possível no Atmega328.
Fabio, estou com dificuldade de entender uma aplicação de entrada digital. Estou conectando um medidor de corente à uma ntrada digital. Porém apesar de a saída do medidor variar de acordo com a variação real de corrente do circuito a minha entrada digital só fica em HIGH.
Havia entendido que ao entrar com um valor de tensão (saida do meu medidor) nessa porta digital, ela faria a comparação com o VCC, definindo assim valor alto ou baixo.
Estou equivocado? Consegue me ajudar?
OLá Diego, um entrada digital só vai ler valores com nivel alto(HIGH) ou baixo(LOW) dependendo do dispositivo na entrada( botão, sensor, etc). No caso do sensor de corrente, ele provavelmente enviará um valor analógico( depende do sensor), dessa forma você deve ler na entrada analógica. Qual sensor está utilizando? abraços