Protoboard
Em cada coluna, os 5 furos de cima (a–e) são ligados entre si, assim como os 5 de baixo (f–j). O canal central separa as duas metades. Os trilhos + e − correm de ponta a ponta e distribuem 5 V e GND.
Curso de Ciência da Computação
Disciplina: Noções de Eletricidade e Eletrônica
Cinco montagens com Arduino e LEDs para você ligar, programar e ver funcionando. Da primeira piscada às cores do arco-íris: monte no seu ritmo, teste no simulador e entenda o que acontece em cada fio.
Quatro ideias que valem para todos os projetos. Leia uma vez e consulte sempre que ficar em dúvida.
Em cada coluna, os 5 furos de cima (a–e) são ligados entre si, assim como os 5 de baixo (f–j). O canal central separa as duas metades. Os trilhos + e − correm de ponta a ponta e distribuem 5 V e GND.
O LED tem polaridade: perna longa = ânodo (+), perna curta (lado chato) = cátodo (−). Nunca ligue um LED direto a um pino: use sempre um resistor em série (aqui, 220 Ω: vermelho, vermelho, marrom).
As colunas da protoboard são numeradas de 1 a 30 e as linhas vão de a a j. Fio vermelho = 5 V, fio preto = GND. Os pontinhos animados mostram o sentido convencional da corrente (do + para o −).
Instale a Arduino IDE, escolha Ferramentas → Placa → Arduino AVR Boards → Arduino Uno e a porta COM correta. Monte e altere os fios sempre com o cabo USB desconectado e confira tudo antes de ligar.
O “Olá, mundo!” da eletrônica: um LED que acende e apaga continuamente, um segundo em cada estado. Você vai ligar sua primeira saída digital do Arduino e aprender a controlar o tempo com código.
pinMode().digitalWrite().delay().↔ Deslize o diagrama para os lados para ver tudo.
Desconecte o cabo USB. Posicione o Arduino e a protoboard como na figura: trilhos + (vermelho) e − (azul) voltados para o Arduino.
Jumper preto: do pino GND do conector de energia (ao lado do 5V) até o trilho −, na coluna 4.
Uma perna na coluna 8, linha b e a outra na coluna 12, linha b. O resistor não tem polaridade: qualquer sentido serve.
Perna longa (ânodo, +) na coluna 12, linha e; perna curta (cátodo, −, lado chato) na coluna 13, linha e. O ânodo fica na mesma coluna do resistor: é assim que os dois ficam ligados em série.
Jumper preto: do trilho − (coluna 13) até a coluna 13, linha a, a mesma coluna do cátodo.
Jumper laranja: do pino digital 13 do Arduino até a coluna 8, linha a, a mesma coluna da perna esquerda do resistor.
Revise: resistor em série com o LED, ânodo do lado do resistor, cátodo voltado ao GND. Conecte o USB, abra a Arduino IDE, cole o código, escolha Arduino Uno e a porta e clique em Carregar. O LED deve piscar a cada segundo.
Não acendeu? Gire o LED: a polaridade provavelmente está invertida. Se continuar apagado, confira se os fios estão nas colunas e linhas indicadas.
// Projeto 1 – Piscar LED (Blink)
// Arduino Uno | LED + resistor de 220 Ω no pino D13
const int PINO_LED = 13; // pino digital onde o LED está ligado
const int TEMPO_MS = 1000; // tempo em cada estado: 1 segundo
void setup() {
pinMode(PINO_LED, OUTPUT); // configura o pino 13 como saída
}
void loop() {
digitalWrite(PINO_LED, HIGH); // acende o LED (5 V no pino)
delay(TEMPO_MS); // espera 1 segundo
digitalWrite(PINO_LED, LOW); // apaga o LED (0 V no pino)
delay(TEMPO_MS); // espera 1 segundo
}
const int PINO_LED = 13;Cria uma constante inteira com um nome fácil de entender. Se você mudar o LED de pino, basta alterar essa única linha.
setup() e loop()setup() roda uma única vez, quando o Arduino é ligado ou reiniciado. loop() roda em seguida e se repete para sempre.
pinMode(PINO_LED, OUTPUT);Define o modo do pino: OUTPUT (saída: o Arduino fornece tensão) ou INPUT (entrada: o Arduino lê a tensão que chega). Sem isso, o pino não aciona o LED direito.
digitalWrite(PINO_LED, HIGH);Escreve um nível lógico no pino: HIGH = 5 V (a corrente circula e o LED acende) e LOW = 0 V (sem diferença de tensão, o LED apaga).
delay(TEMPO_MS);Pausa o programa pelo número de milissegundos informado (1000 ms = 1 s). Durante a pausa, o LED mantém o último estado definido.
Um LED vermelho tem queda de tensão de ~2 V e rende bem com ~15 mA. O valor comercial mais próximo é 220 Ω, que resulta em I = 3/220 ≈ 13,6 mA, seguro para o LED e para o pino.
Em vez de apenas ligar e desligar, o LED passa a “respirar”: o brilho sobe e desce suavemente. O segredo é o PWM, uma técnica para simular tensões intermediárias usando apenas saídas digitais.
analogWrite() com valores de 0 a 255.if.↔ Deslize o diagrama para os lados para ver tudo.
Desconecte o cabo USB e posicione o Arduino e a protoboard como na figura.
Jumper preto: do pino GND do conector de energia até o trilho −, na coluna 4.
Uma perna na coluna 8, linha b e a outra na coluna 12, linha b.
Perna longa (ânodo, +) na coluna 12, linha e; perna curta (cátodo, −) na coluna 13, linha e.
Jumper preto: do trilho − (coluna 13) até a coluna 13, linha a.
Jumper roxo: do pino digital ~9 do Arduino até a coluna 8, linha a.
Conecte o USB, carregue o código e observe: o LED deve clarear e escurecer suavemente, completando um ciclo em cerca de 3 segundos.
Atenção ao pino: só os pinos marcados com ~ (3, 5, 6, 9, 10 e 11) fazem PWM no Uno. Em um pino sem ~, o LED só ficaria aceso ou apagado.
// Projeto 2 – LED com efeito Fade (PWM)
// Arduino Uno | LED + resistor de 220 Ω no pino D9 (PWM)
const int PINO_LED = 9; // D9 tem PWM (marcado com ~)
int brilho = 0; // brilho atual: 0 (apagado) a 255 (máximo)
int passo = 5; // quanto o brilho muda a cada volta do loop
void setup() {
pinMode(PINO_LED, OUTPUT);
}
void loop() {
analogWrite(PINO_LED, brilho); // aplica o brilho atual
brilho = constrain(brilho + passo, 0, 255); // calcula o próximo (limitado a 0..255)
if (brilho == 0 || brilho == 255) {
passo = -passo; // chegou ao limite: inverte o sentido
}
delay(30); // controla a velocidade do efeito
}
O pino não fornece uma tensão intermediária de verdade: ele liga e desliga o LED muito rápido (cerca de 490 vezes por segundo no pino 9). A fração do tempo em que o pino fica em HIGH é o duty cycle. Como o olho humano não percebe a oscilação, enxergamos um brilho médio proporcional a esse tempo.
| analogWrite(9, …) | Duty cycle | Tensão média no pino | Resultado |
|---|---|---|---|
| 0 | 0 % | 0 V | apagado |
| 64 | 25 % | ≈ 1,25 V | brilho fraco |
| 128 | 50 % | ≈ 2,5 V | brilho médio |
| 191 | 75 % | ≈ 3,75 V | brilho forte |
| 255 | 100 % | 5 V | brilho máximo |
analogWrite(PINO_LED, brilho);Gera o sinal PWM no pino. O valor vai de 0 a 255 (8 bits, 256 níveis). Apesar do nome, a saída não é analógica: é PWM. Só funciona em pinos com ~.
brilho e passoA cada volta do loop, o brilho muda de 5 em 5 (brilho + passo). Isso produz a subida suave da intensidade luminosa, em vez de um salto de apagado para aceso.
if (brilho == 0 || brilho == 255)Quando o brilho chega a um dos extremos, passo = -passo troca o sinal: o que subia passa a descer, e vice-versa. O símbolo || significa “ou”.
constrain(x, 0, 255)Mantém o valor dentro do intervalo permitido. Assim o brilho nunca passa de 255 nem fica abaixo de 0, qualquer que seja o passo escolhido.
delay(30);Define a velocidade: 51 passos × 30 ms ≈ 1,5 s para ir de apagado ao máximo. Diminua o delay para um efeito mais rápido.
Gire o botão e mude a velocidade das piscadas em tempo real. Aqui você faz sua primeira leitura analógica e converte o valor lido em tempo com map(). Girando para a direita, o LED pisca mais rápido.
analogRead() (valores de 0 a 1023).map().↔ Deslize o diagrama para os lados para ver tudo.
Desconecte o USB e posicione o Arduino e a protoboard como na figura.
Jumper vermelho: pino 5V → trilho +, coluna 2. Jumper preto: pino GND → trilho −, coluna 4.
Os três terminais vão nas colunas 8, 9 e 10, todos na linha e. O terminal do meio (coluna 9) é o cursor. Se os terminais do seu modelo forem mais espaçados (comum nos potenciômetros rotativos de 16 mm, com 5 mm entre eles), use colunas alternadas, como 8, 10 e 12, e leve cada jumper dos próximos passos à coluna do terminal correspondente.
Jumper preto: trilho − (coluna 8) → coluna 8, linha a.
Jumper vermelho: trilho + (coluna 10) → coluna 10, linha a.
Jumper amarelo: pino A0 → coluna 9, linha a.
Uma perna na coluna 17, linha b e a outra na coluna 21, linha b.
Ânodo (perna longa) na coluna 21, linha e; cátodo (perna curta) na coluna 22, linha e.
Jumper preto: trilho − (coluna 22) → coluna 22, linha a.
Jumper verde: pino digital 8 → coluna 17, linha a.
Conecte o USB, carregue o código, abra o Monitor Serial (9600 baud) e gire o potenciômetro: o LED muda de velocidade e os valores mudam na tela.
Sentido invertido? Se o LED ficar mais lento ao girar para a direita, troque entre si os fios dos terminais das pontas (5 V e GND). O terminal do meio sempre vai ao A0.
// Projeto 3 – Frequência de piscadas controlada por potenciômetro
// Arduino Uno | LED no pino D8 | cursor do potenciômetro no pino A0
const int PINO_LED = 8; // saída: LED (com resistor de 220 Ω)
const int PINO_POT = A0; // entrada analógica: cursor do potenciômetro
void setup() {
pinMode(PINO_LED, OUTPUT);
Serial.begin(9600); // inicia a comunicação com o Monitor Serial
}
void loop() {
int leitura = analogRead(PINO_POT); // 0 a 1023
// Girar para a direita => leitura maior => intervalo menor => pisca mais rápido
int intervalo = map(leitura, 0, 1023, 1000, 50); // 1000 ms a 50 ms
Serial.print("leitura = ");
Serial.print(leitura);
Serial.print(" | intervalo = ");
Serial.print(intervalo);
Serial.println(" ms");
digitalWrite(PINO_LED, HIGH); // LED aceso durante 'intervalo' ms
delay(intervalo);
digitalWrite(PINO_LED, LOW); // LED apagado durante 'intervalo' ms
delay(intervalo);
}
É um resistor variável com três terminais. Entre as pontas há uma trilha resistiva fixa (10 kΩ). O terminal do meio, o cursor, desliza sobre essa trilha. Com as pontas ligadas ao 5 V e ao GND, o cursor “pega” uma fração da tensão, o que é um divisor de tensão ajustável:
Como o cursor só “mede” a tensão e a corrente que passa por ele é minúscula, o potenciômetro pode ficar ligado direto à entrada A0 sem risco.
analogRead(PINO_POT)O Arduino Uno tem um conversor analógico-digital (ADC) de 10 bits: 210 = 1024 níveis. 0 V vira 0 e 5 V vira 1023, com resolução de cerca de 4,9 mV por passo (5 V ÷ 1024).
map(valor, deMin, deMax, paraMin, paraMax)Reescala um valor de uma faixa para outra, usando aritmética de inteiros. Aqui, 0–1023 vira 1000–50. Como a faixa de saída está “invertida”, quanto maior a leitura, menor o intervalo.
O LED fica aceso por intervalo ms e apagado por intervalo ms, então um ciclo completo dura 2 × intervalo e a frequência é f = 1 / (2 × intervalo).
| Posição do botão | analogRead() | Tensão em A0 | map() → intervalo | Frequência |
|---|---|---|---|---|
| totalmente à esquerda | 0 | 0 V | 1000 ms | 0,50 Hz |
| ¼ do curso | 256 | 1,25 V | 763 ms | 0,66 Hz |
| no meio | 512 | 2,5 V | 525 ms | 0,95 Hz |
| ¾ do curso | 768 | 3,75 V | 287 ms | 1,74 Hz |
| totalmente à direita | 1023 | 5 V | 50 ms | 10,0 Hz |
Serial.begin(9600) e Serial.println()Abrem um canal de texto entre o Arduino e o computador (9600 bits por segundo). Use Ferramentas → Monitor Serial para ver as leituras e entender o que o programa “enxerga”.
delay() bloqueiaO novo valor do potenciômetro só é lido no começo de cada ciclo. Em velocidades baixas, a mudança pode demorar até 2 s para aparecer. Desafio: refaça o programa com millis() para resposta imediata.
Escureceu? O LED acende sozinho, como um poste de rua. Você vai usar um LDR (sensor de luz), um divisor de tensão e uma decisão if/else no código. Ambiente iluminado: LED apagado. Ambiente escuro: LED aceso.
analogRead().if / else e um valor limite.↔ Deslize o diagrama para os lados para ver tudo.
Desconecte o USB e posicione o Arduino e a protoboard como na figura.
Jumper vermelho: pino 5V → trilho +, coluna 2. Jumper preto: pino GND → trilho −, coluna 4.
Uma perna na coluna 11, linha c e a outra na coluna 15, linha c. O LDR não tem polaridade.
Uma perna na coluna 15, linha d e a outra na coluna 19, linha d. Agora o LDR e o resistor compartilham a coluna 15: esse é o ponto central do divisor.
Jumper vermelho: trilho + (coluna 11) → coluna 11, linha a.
Jumper preto: trilho − (coluna 19) → coluna 19, linha a.
Jumper amarelo: pino A0 → coluna 15, linha a.
Uma perna na coluna 22, linha b e a outra na coluna 26, linha b.
Ânodo (perna longa) na coluna 26, linha e; cátodo (perna curta) na coluna 27, linha e.
Jumper preto: trilho − (coluna 27) → coluna 27, linha a.
Jumper verde: pino digital 8 → coluna 22, linha a.
Conecte o USB, carregue o código e abra o Monitor Serial. Cubra o LDR com a mão: o LED deve acender. Descubra e o LED apaga.
Dica de montagem: deixe o LED afastado do LDR. A luz do próprio LED pode ser “vista” pelo sensor e confundir o programa.
// Projeto 4 – Acionamento de LED com sensor LDR
// Arduino Uno | LDR + resistor de 10 kΩ em A0 | LED no pino D8
const int PINO_LDR = A0; // ponto central do divisor de tensão
const int PINO_LED = 8; // LED (com resistor de 220 Ω)
const int LIMITE = 400; // abaixo deste valor o ambiente é considerado escuro
void setup() {
pinMode(PINO_LED, OUTPUT);
Serial.begin(9600);
}
void loop() {
int luz = analogRead(PINO_LDR); // 0 (escuro) a 1023 (muita luz)
if (luz < LIMITE) {
digitalWrite(PINO_LED, HIGH); // escuro: acende o LED
} else {
digitalWrite(PINO_LED, LOW); // claro: apaga o LED
}
Serial.print("luz = ");
Serial.println(luz); // mostra a leitura no Monitor Serial
delay(100);
}
LDR (Light Dependent Resistor) é um resistor feito de material semicondutor sensível à luz. Quanto mais luz, menor a resistência: cerca de 1 a 10 kΩ em ambiente claro e mais de 100 kΩ no escuro. Ele não tem polaridade.
O Arduino lê tensão, não resistência. O divisor transforma a variação de resistência do LDR em variação de tensão no ponto central, ligado ao A0.
Com o LDR no lado do 5 V, mais luz → RLDR menor → tensão maior → leitura maior. Os valores abaixo são típicos; seu LDR pode variar:
| Situação | RLDR | Tensão em A0 | analogRead() | LED |
|---|---|---|---|---|
| sol / luz forte | 1 kΩ | 4,55 V | ≈ 930 | apagado |
| sala iluminada | 5 kΩ | 3,33 V | ≈ 682 | apagado |
| penumbra | 10 kΩ | 2,50 V | ≈ 512 | apagado |
| ambiente escurecendo | 50 kΩ | 0,83 V | ≈ 170 | aceso |
| escuro (LDR coberto) | 100 kΩ | 0,45 V | ≈ 93 | aceso |
analogRead(PINO_LDR)Converte a tensão do ponto central em um número de 0 a 1023 (ADC de 10 bits). Esse número é o “quanto de luz” que o programa enxerga.
if (luz < LIMITE) { … } else { … }A condição compara a leitura com o limite. Se for verdadeira (leitura baixa, ambiente escuro), executa o bloco do if e acende o LED. Caso contrário, executa o else e apaga.
LIMITEAbra o Monitor Serial, anote a leitura com o ambiente claro e depois com o LDR coberto, e escolha um valor no meio dos dois. Com 400, o LED acende quando a tensão cai abaixo de ≈ 1,95 V.
Se trocar o LDR de lugar com o resistor de 10 kΩ, a leitura passa a subir no escuro. Aí é preciso inverter a condição (luz > LIMITE).
Modelo ilustrativo: a resistência do LDR cai de forma exponencial com a luz (de ~300 kΩ no escuro total a ~1 kΩ sob luz forte, como na tabela acima).
Vermelho, verde e azul em um único LED: misture as intensidades de cada canal e crie qualquer cor. Com um potenciômetro, você percorre todo o arco-íris e descobre como as telas do mundo inteiro formam suas cores.
analogWrite() em pinos PWM.↔ Deslize o diagrama para os lados para ver tudo.
Os três resistores ficam “em pé”, atravessando o canal central da protoboard: o lado de cima recebe o sinal do Arduino e o lado de baixo vai à perna do LED.
Desconecte o USB e posicione o Arduino e a protoboard como na figura.
Jumper vermelho: pino 5V → trilho +, coluna 2. Jumper preto: pino GND → trilho −, coluna 4.
Os três terminais nas colunas 8, 9 e 10, linha e. O do meio (coluna 9) é o cursor. Terminais mais espaçados? Use colunas alternadas, como explicado no Projeto 3.
Jumper preto: trilho − (coluna 8) → coluna 8, linha a. Jumper vermelho: trilho + (coluna 10) → coluna 10, linha a. Jumper amarelo: pino A0 → coluna 9, linha a.
Cada um com uma perna na linha c e a outra na linha f (atravessando o canal central), nas colunas 15, 17 e 18.
As quatro pernas nas colunas 15, 16, 17 e 18, linha j. Com o lado chato à esquerda, a ordem é: R (coluna 15), cátodo comum, a perna mais longa (coluna 16), G (coluna 17) e B (coluna 18).
Jumper preto longo: trilho − (coluna 16) → coluna 16, linha f.
Jumper laranja: pino ~9 → coluna 15, linha a (vermelho). Jumper verde: pino ~10 → coluna 17, linha a (verde). Jumper azul: pino ~11 → coluna 18, linha a (azul).
Conecte o USB, carregue o código e gire o potenciômetro: o LED percorre vermelho → verde → azul → vermelho.
Confira o seu LED: a ordem das pernas pode variar entre fabricantes. A mais longa é sempre o terminal comum. Se as cores aparecerem trocadas, basta trocar o fio daquele canal (ou os nomes dos pinos no código).
// Projeto 5 – Cores de um LED RGB controladas por potenciômetro
// Arduino Uno | LED RGB 5 mm | 3 resistores de 220 Ω | potenciômetro de 10 kΩ
const int PINO_R = 9; // canal vermelho (PWM)
const int PINO_G = 10; // canal verde (PWM)
const int PINO_B = 11; // canal azul (PWM)
const int PINO_POT = A0; // cursor do potenciômetro
// false = LED de CÁTODO comum (comum ao GND) -> montagem deste projeto
// true = LED de ÂNODO comum (comum ao 5 V) -> lógica invertida
const bool ANODO_COMUM = false;
// Envia as intensidades (0 a 255) de cada canal para o LED
void escreveCor(int r, int g, int b) {
if (ANODO_COMUM) {
r = 255 - r;
g = 255 - g;
b = 255 - b;
}
analogWrite(PINO_R, r);
analogWrite(PINO_G, g);
analogWrite(PINO_B, b);
}
// Roda de cores: pos de 0 a 255 percorre vermelho -> verde -> azul -> vermelho
void corDaRoda(int pos) {
if (pos < 85) {
escreveCor(255 - pos * 3, pos * 3, 0); // vermelho -> verde
} else if (pos < 170) {
pos = pos - 85;
escreveCor(0, 255 - pos * 3, pos * 3); // verde -> azul
} else {
pos = pos - 170;
escreveCor(pos * 3, 0, 255 - pos * 3); // azul -> vermelho
}
}
void setup() {
pinMode(PINO_R, OUTPUT);
pinMode(PINO_G, OUTPUT);
pinMode(PINO_B, OUTPUT);
}
void loop() {
int leitura = analogRead(PINO_POT); // 0 a 1023
int pos = map(leitura, 0, 1023, 0, 255); // 0 a 255
corDaRoda(pos);
delay(10);
}
Dentro do encapsulamento existem três LEDs (vermelho, verde e azul) que compartilham um terminal. Cada LED tem sua própria perna, ligada a um pino PWM diferente, e por isso é possível controlar a intensidade de cada um separadamente. A mistura das três luzes é a síntese aditiva: é assim que telas de celular, TVs e monitores formam suas imagens.
| Cor | R | G | B | Mistura |
|---|---|---|---|---|
| Vermelho | 255 | 0 | 0 | só R |
| Verde | 0 | 255 | 0 | só G |
| Azul | 0 | 0 | 255 | só B |
| Amarelo | 255 | 255 | 0 | R + G |
| Ciano | 0 | 255 | 255 | G + B |
| Magenta | 255 | 0 | 255 | R + B |
| Branco | 255 | 255 | 255 | R + G + B |
| Tipo | Perna comum ligada a | Para acender um canal | No código |
|---|---|---|---|
| Cátodo comum (CC) · este projeto | GND | enviar HIGH / valor alto | ANODO_COMUM = false |
| Ânodo comum (CA) | 5 V | enviar LOW / valor baixo (lógica invertida) | ANODO_COMUM = true |
Para usar um LED de ânodo comum: ligue a perna comum ao trilho + (5 V) em vez do GND e mude a constante para true. A função escreveCor() inverte os valores (255 - r) e o resto do programa não muda.
analogWrite() nos 3 canaisCada canal recebe um valor de 0 a 255 em um pino PWM (9, 10 e 11). São 256 níveis por canal, ou 256 × 256 × 256 ≈ 16,7 milhões de cores possíveis. Valor 0 = canal apagado; 255 = brilho máximo.
Cada cor de LED tem uma queda de tensão diferente: ~2 V no vermelho e ~3 V no verde e no azul. Com 220 Ω, a corrente fica em ≈ 13 mA no vermelho e ≈ 9 mA no verde e no azul, dentro do limite seguro.
map(leitura, 0, 1023, 0, 255) reduz a leitura a uma posição de 0 a 255 na roda de cores. Em cada terço da volta, um canal sobe enquanto outro desce, e o terceiro fica apagado.
corDaRoda(pos)| pos | R | G | B |
|---|---|---|---|
| 0 a 84 | 255 → 0 | 0 → 255 | 0 |
| 85 a 169 | 0 | 255 → 0 | 0 → 255 |
| 170 a 255 | 0 → 255 | 0 | 255 → 0 |
void escreveCor(int r, int g, int b) junta os três analogWrite() em um único comando reutilizável. O programa fica mais organizado e a troca entre cátodo e ânodo comum acontece em um só lugar.