Pins Digitais do Arduino

Os pins do Arduino podem ser configurados tanto como entrada quanto saída. Esse artigo explica o funcionamento desses pins nos dois modos. Apesar do título do artigo se referir à pins digitais, é importante observar que a gande maioria dos pins analógicos do Arduino (ATmega) podem ser configurados e usados exatamente da mesma forma que os digitais.

Propriedades dos Pins Configurados como INPUT

Os pins do Arduino (Atmega) são por padrão configurados para entrada de dados, de forma que eles não precisam ser declarados explicitamente como entrada com o comando pinMode() quando você for usa-los para entrada de dados. Pins configurados dessa forma são referenciados como estando em um estado de alta impedância. Pins de entrada criam demandas extramamente pequenas no circuito que eles estiverem conectados, equivalente a uma série de resistores de 100 megaohms na frente do pin. Isso significa que é necessária uma corrente muito pequena para que o pin de entrada saia de um estado para outro,  o que pode tornar os pins úteis para implementar um  sensor de toque capacitivo, ler um LED como um foto-diodo, ou ler um sensor analógico com esquemas como um RCTime.
Isso também significa, porém, que pins configurados como pinMode(pin, INPUT) com nada conectados à eles, ou com fios conectados à eles que não estejam conectados à outros circuitos, irão reportar alterações aparentemente aleatórias no estado do pin, captando ruídos elétricos do ambiente, ou capacitivamente se ligando ao estado de um pin próximo.

Resistores Pullup como Pins configurados como INPUT

Frequentemente é útil direcionar um pin de entrada para um estado conhecido caso nenhuma entrada esteja presente. Isso pode ser feito pela adição de um resistor pullup (de até +5V), ou um resistor pulldown (resistor para o aterramento) na entrada. Um resistor de 10K é um resistor desse tipo.

Propriedades dos Pins Configurados como INPUT_PULLUP

Existem resistores pullup de 20K embutidos no chip ATmega que podme ser acessados por software. Esses resistores pullup embutidos são acessados pelo ajuste de pinMode() como INPUT_PULLUP. Isso efetivamente inverte o comportamento do modo INPUT, onde HIGH passa a indicar que o sensor está desligado, e LOW passa a indicar que o sensor está ligado.
O valor desse resistor pullup depende do microcontrolador usado. Na maioria das placas baseadas no AVR, o valor é garantidamente entre 20kΩ e 50kΩ. No Arduino Due, fica entre 50kΩ e 150kΩ. Para o valor exato, consulte a planilha do microcontrolador de sua placa.
A conectar um sensor em um pin configurado como INPUT_PULLUP, a outra ponta precisa ser conectada ao aterramento. No caso de um interruptor simples, isso faz com que o pin recebe o valor HIGH quando o interruptor está aberto, e LOW quando ele é pressionado.
O resistor pullup fornece corrente suficiente para iluminar vagamente um LED conectado à um pin que foi configurado como entrada. Se os LEDs de um projeto parecerem estar funcionando, mas de forma muito baixa, isso deve ser o que está acontecendo com eles.
Os resistores pullup são controlados pelos menos registradores (locais da memória do chip) que controlam se um pin está no estado HIGH ou LOW. Consequentemente, um pin que é configurado para que os resistores pullup sejam ligados quando o pin esteja configurado como INPUT, terá o pin ajustado para HIGH se o pin passar para o modo OUTPUT com pinMode(). Isso funciona na outra direção também, e um pin de saída que é deixado em um estado HIGH terá resistores pullup ajustados se passarem para o modo de entrada com pinMode().
Nas versões do Arduino anteriores à 1.0.1, era possível configurar os resistores pullups internos da seguinte maneira:

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors

OBSERVAÇÃO: O pin digital 13 é mais difícil de ser usado como entrada do que os outros pins digitais porque ele tem um LED e um resistor anexados a ele, que são soldados na placa na maioria delas. Se você ativar seu resistor pullup de 20k interno, ele irá ficar com 1,7V ao invés dos 5V esperados, pois o LED e o resistor puxam a voltagem para baixo, significando que ele irá sempre indicar LOW. Se você precisar mesmo usar o pin 13 como entrada digital, ajuste  seu pinMode() para INPUT e então use um resistor pulldown esterno.

Propriedades dos Pins Configurados como OUTPUT

Pins configurados como OUTPUT com pinMode() são referenciados como estando em um estado de baixa impedância. Isso signidica que eles podem fornecer uma quantidade substancial de corrente para outros circuitos. Pins ATmega podem gerar (fornecerem corrente positiva) ou sugar (fornecer corrente negativa) de até 40 mA (miliamps) de corrente para outros circuitos. Isso é corrente suficiente para iluminar um LED (não se esqueça do resistor em série), ou executar vários sensores, por exemplo, mas não é corrente suficiente para executar a maioria dos relés, solenoides ou motores.
Curtos circuitos em pins do Arduino, ou tentativas de executar dispositivos de alta corrente neles, podem danificar ou destruir os transistores da saída do pin, ou danificar o chip ATmega. Frequentemente isso pode resultar em um pin “morto” no microcontrolador, mas o restante do chip irá funcionar de forma adequada. Por essa razão, é uma boa ideia conectar pins de saída para outros dispositivos com resistores de 470Ω ou 1k, a menos que a corrente máxima direcionada pelos pins seja necessária para uma aplicação em particular.

traduzido de arduino.cc