Este shield é uma boa alternativa para trabalhar em sala de aula. Tem preço acessível, evita que o aluno tenha que fazer conexões elétricas, pois basta encaixá-lo sobre a placa do Arduíno. Possui praticamente todo o hardware para se trabalhar os conceitos de programação para microcontroladores.

Mapeamento de Hardware
Pino (PORTC) | Função | Pino (PORTD) | Função | Pino (PORTB) | Função | ||
A0 (PORTC0) | POT | D0 (PORTD0) | RX | D8 (PORTB0) | DISP DATA | ||
A1 (PORTC1) | SW1 | D1 (PORTD1) | TX | D9 (PORTB1) | PWM | ||
A2 (PORTC2) | SW2 | D2 (PORTD2) | J4 ESQ | D10 (PORTB2) | LED4 | ||
A3 (PORTC3) | SW3 | D3 (PORTD3) | BUZZER | D11 (PORTB3) | LED3 | ||
A4 (PORTC4) | J4 DIR | D4 (PORTD4) | DISP LATCH | D12 (PORTB4) | LED2 | ||
A5 (PORTC5) | SINAL | D5 (PORTD5) | PWM | D13 (PORTB5) | LED1 | ||
D6 (PORTD6) | PWM | ||||||
D7 (PORTD7) | DISP CLK |
Pinagem Arduino

Teoria Atmega328P
Aula 1 – Entradas e Saídas Digitais
O ATmega328 possui 3 conjuntos de pinos de entrada e saída (I/Os): PORTB, PORTC e PORTD; respectivamente, pinos PB7 .. PB0, PC6 .. PC0 e PD7 .. PD0, todos com a função Lê – Modifica – Escreve.
Isso significa que a direção de um pino pode ser alterada sem mudar a direção de qualquer outro pino do mesmo PORT (instruções SBI e CBI). Da mesma forma, os valores lógicos dos pinos podem ser alterados individualmente, bem como a habilitação dos resistores de pull-up para os pinos configurados como entrada.
Cada PORT possui um registrador de saída com características simétricas, isto é, com a mesma capacidade para drenar ou suprir corrente, suficiente para alimentar LEDs diretamente (20 mA por pino). Um cuidado que se deve ter é respeitar a máxima corrente total que o componente e que cada PORT suporta, 200 mA e 100 mA, respectivamente20. Todas os pinos têm resistores de pull-up internamente e diodos de proteção entre o VCC e o terra, além de uma capacitância de 10 pF, como indicado na figura a seguir:



Os registradores responsáveis pelos pinos de I/O são:
- PORTx: registrador de dados, usado para escrever nos pinos do PORTx.
- DDRx: registrador de direção, usado para definir se os pinos do PORTx são entrada ou saída.
- PINx: registrador de entrada, usado para ler o conteúdo dos pinos do PORTx.
Em resumo, para o uso de um pino de I/O, deve-se primeiro definir se ele será entrada ou saída escrevendo-se no registrador DDRx. Então, a escrita no registrador PORTx alterará o estado lógico do pino se ele for saída, ou poderá habilitar o pull-up interno, se ele for entrada. Os estados lógicos dos pinos do PORT são lidos do registrador PINx.
Se algum pino não for utilizado é recomendado que o seu nível lógico seja definido. Entradas com nível flutuante devem ser evitadas para evitar o consumo de corrente quando o pino não estiver sendo empregado. Neste caso a Atmel recomenda a habilitação do pull-up (para maiores detalhes ver o manual do fabricante).

Projeto 1 – Uso de Botões, led e Buzzer
O primeiro projeto utilizará os botões SW1 e SW2 para acionar os leds Led1 e Led2, e ao mesmo tempo fazer com que o buzzer emita um som. Neste programa efetuaremos a escrita e leitura das portas digitais dos botões (portas digitais A1 e A2), dos leds (D12 e D13) e do buzzer (D3).
Como estão conectados no shield:



//Objetivo: Uso de botoes, led e buzzer
//Definicao dos pinos
#define SW1 A1 // ou 15
#define SW2 A2 // ou 16
#define Led1 13
#define Led2 12
#define Buzzer 3
//Armazena estado dos botoes
int est_SW1, est_SW2;
void setup()
{
//Pinos led e buzzer como saida
pinMode(Led1 , OUTPUT);
pinMode(Led2 , OUTPUT);
pinMode(Buzzer, OUTPUT);
//Pinos botoes SW1 e SW2 como entrada
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
}
void loop()
{
//Verifica se o botao SW1 foi acionado
est_SW1 = digitalRead(SW1);
if (est_SW1 == 0) // mesmo que if(!est_SW1)
{
//Acende o led1
digitalWrite(Led1, HIGH);
//Aciona o buzzer
tone(Buzzer, 50,30);
}
else
{
//Desliga o led1 e o buzzer
digitalWrite(Led1, LOW);
noTone(Buzzer);
}
//Verifica se o botao SW2 foi acionado
est_SW2 = digitalRead(SW2);
if (est_SW2 == 0) // mesmo que if(est_SW2)
{
//Acende o led2
digitalWrite(Led2, HIGH);
//Aciona o buzzer
tone(Buzzer, 900,50);
}
else
{
//Desliga o led2 e o buzzer
digitalWrite(Led2, LOW);
noTone(Buzzer);
}
}
Funções de Entrada/Saída Digital:
pinMode (): Configura um pino específico para ser entrada ou saída digital.
Sintaxe: pinMode (pino, modo)
Parâmetros:
pino: deve-se colocar o número correspondente ao pino que se deseja configurar, conforme placa que está trabalhando.
modo: deve-se colocar o modo que deseja configurar o pino. INPUT (entrada), OUTPUT (saída), INPUT_PULLUP (entrada com resistor de pull up).
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 (nível alto – 5Vcc) ou LOW (nível baixo – 0V).
digitalRead(): Lê o valor presente em um pino digital.
Sintaxe: digitalRead(pino)
Parâmetros: Pino: valor correspondente ao pino que se deseja ler.
Retorno: HIGH (nível alto – 5VCC) ou LOW (nível baixo – 0VCC).
tone() – Gera uma onda quadrada na frequência especificada (e duty cycle 50%) em um pino. A duração pode ser especificada, do contrário a onda continua até uma chamada de noTone(). O pino pode ser conectado a um buzzer piezo ou outro speaker para tocar tons.
Sintaxe : tone(pino, frequência)
tone(pino, frequência, duração)
Parâmetros:
pino: o pino do Arduino no qual se deseja gerar o tom,
frequência: a frequência do tom em Hertz – unsigned int,
duração: a duração do tom em milissegundos (opcional) – unsigned long
Estruturas de controle de fluxo – If

if (expressão ) // se expressão for verdadeira
{comandoA;} // executa bloco de instruções 1
else // caso seja falsa
{comandoB;} // executa bloco de instruções 2

if(condição1) comandoA;
else if(condição2) comandoB;
else if(condição3) comandoC;
.
.
else comandoD;
Registradores do ATmega 328P
Outra forma de configurar os pinos como entrada ou saída, alterar o estado das saídas e configurar os resistores de pull-ups:
// bits 76543210
DDRB = 0b00000000; //Configura os pinos do PORTB como entradas
PORTB = 0b00010100; //Ativa os pull-ups dos pinos PB2 e PB4
DDRC = 0b00000000; //Configura os pinos do PORTC como entradas
PORTC = 0b00001100; //Ativa os pull-ups dos pinos PC2 e PC3
DDRD = 0b11111111; //Configura os pinos do PORTD como saídas
PORTD = 0b00000000; //Apaga todos os leds ligados no PORTD
Abaixo, segue a sintaxe de todas as operações de máscaras de bits:
Operação | Opção 1 | Opção 2 |
Ativar um bit (1) | PORTD |= (1<<nr_bit); | PORTD = PORTD | (1<<nr_bit); |
Desligar um bit(0) | PORTD &= ~(1<<nr_bit); | PORTD = PORTD & (~(1<<nr_bit)); |
Inverter um bit | PORTD ^= (1<<nr_bit); | PORTD = PORTD ^ (1<<nr_bit); |
Testar um bit é diferente de 0 | if(PINC&(1<< nr_bit)) | |
Testar se um bit é igual à 0 | if(!(PINC&(1<< nr_bit))) |
Macros são definições do compilador utilizadas para evitar trechos repetitivos no código. Alguns exemplos comuns são as macros utilizadas para manipulação de bits (ligar, desligar, inverter e testar). Exemplos de criação das macros:
#define set_bit(y,bit) (y|=(1<<bit))//coloca em 1 o bit x da variável Y
#define clr_bit(y,bit) (y&=~(1<<bit))//coloca em 0 o bit x da variável Y
#define cpl_bit(y,bit) (y^=(1<<bit))//troca o estado lógico do bit x da variável Y
#define tst_bit(y,bit) (y&(1<<bit)) //retorna 0 ou 1 conforme leitura do bit
EXEMPLO: Troca o estado do Led ao apertar o botão:

O programa acima foi feito no programa MplabX e em linguagem C. É possível usar registradores normalmente na IDE do Arduino.