Arduino UNO R4 - Optoacoplador PC817: Monitore um Sinal de Entrada DC de 12V/24V

Neste guia, vamos aprender a usar o optoacoplador PC817 com o Arduino UNO R4 para responder a uma pergunta sobre um dispositivo de 12V ou 24V — ele está mesmo funcionando agora? — sem ligar essa tensão à placa. Em detalhes, vamos aprender:

Arduino UNO R4 PC817 optocoupler isolated 12V and 24V input

Sobre o Optoacoplador PC817

O PC817 é um optoacoplador de 4 pinos, também vendido com os nomes de fotoacoplador e opto-isolador. Dentro do corpo de plástico há um LED infravermelho voltado para um fototransistor, separados por um espaço isolante: quando a corrente passa pelo LED, a luz dele liga o transistor, então o sinal atravessa como luz em vez de eletricidade — e é por isso que os dois lados ficam eletricamente separados.

Esse espaço é o que torna o PC817 útil para quem tem um Arduino UNO R4. Uma linha de 12V ou 24V ligada direto a um pino digital destrói a placa. Com um PC817, o Arduino UNO R4 só enxerga os próprios 5V, enquanto o lado de alta tensão fica do outro lado do espaço. Trabalhos típicos, de hobby a oficina, são assim:

  • Observar a saída de 12V de um controlador de portão ou de porta de garagem, para que o sketch saiba quando o portão está sendo acionado
  • Verificar se uma linha de acessório automotivo de 12V está energizada antes de um projeto puxar corrente dela
  • Monitorar a linha de habilitação de 24V de uma fonte de bancada

Em cada um desses casos, a pergunta útil não é realmente se um fio está energizado, mas se a coisa na ponta desse fio está ligada ou desligada neste momento, e é isso que o PC817 entrega ao sketch.

O Arduino UNO R4 merece uma observação especial aqui. Ao contrário da maioria das placas modernas de 3,3V, o UNO R4 trabalha com I/O de 5V, então o lado de saída do optoacoplador é puxado para 5V nesta placa, e um pino lê 5V ou 0V.

Especificações

Parâmetro Valor
Encapsulamento DIP de 4 pinos
Tensão direta do LED de entrada (Vf) cerca de 1,2V típica, 1,4V máx
Corrente direta do LED de entrada (If) faixa normal de 5-20 mA, 20 mA contínuos no máximo
Tensão coletor-emissor de saída (VCEO) 35V máx
Corrente de coletor de saída (IC) 50 mA máx
Dissipação de potência do coletor 150 mW
Tensão de isolamento 5000 Vrms por 1 minuto
Relação de Transferência de Corrente (CTR) 50% a 600% conforme a classe (A 80-160%, B 130-260%, C 200-400%, D 300-600%)
Velocidade de comutação tempo de subida cerca de 4 us, tempo de descida cerca de 3 us
Temperatura de operação -30 C a +100 C

O Módulo Optoacoplador PC817

A forma prática de usar um PC817 com o Arduino UNO R4 é o módulo de isolamento já pronto, e é isso que o restante deste guia vai ligar. Os módulos são vendidos em versões de 1, 2, 4 e 8 canais. Cada canal traz um PC817, o resistor em série e, em geral, um LED de status, já instalados, e os fios externos entram em bornes de parafuso em vez de pinos soltos.

  • Lado de entrada: um borne + (ou IN+) e um borne - (ou IN-) para o sinal externo
  • Lado de saída: pinos VCC, GND e OUT (ou DO / OUT1..OUTn) para o Arduino UNO R4

Nesta placa, o lado de saída é alimentado pelo pino 5V e não pelo 3,3V, porque o UNO R4 lê lógica de 5V. Essa é uma decisão separada da decisão do lado de entrada, abaixo, e é igual em todas as variantes do módulo.

Aqui está o que pega as pessoas de surpresa. O resistor em série já está na placa, e ele é dimensionado para uma tensão de entrada. Não existe um módulo que serve para tudo. Os módulos são vendidos em três variantes, e você compra a que combina com o sinal que quer monitorar.

Qual Módulo Optoacoplador PC817 Eu Preciso?

Veja a tensão do sinal que você pretende monitorar e escolha a linha:

Sinal que você quer monitorar Variante do módulo para comprar Fonte típica
Lógica de 3,3V ou 5V módulo 3-5V pino de saída de outra placa, uma placa de controle de 5V, um sensor com alimentação separada
12V DC módulo 12V controladores de portão e de porta de garagem, linhas de acessórios automotivos, centrais de alarme
24V DC módulo 24V linhas de habilitação de fonte de bancada, saídas de CLP, sensores industriais

Escolher a variante é o equivalente, no módulo, a dimensionar um resistor — é a única decisão de compra desta página que realmente importa. Duas formas de errar:

  • Um módulo de 12V em uma linha de 24V recebe cerca do dobro da corrente para a qual o resistor foi escolhido, e o LED interno é danificado. Este é o erro caro, e acontece em segundos.
  • Um módulo de 24V em uma linha de 12V não aciona o LED o bastante. Nada queima, mas a saída pode comutar tarde, comutar só às vezes ou nunca comutar — e isso parece uma falha de ligação quando na verdade é uma falha de compra.

Se o seu sinal fica entre os valores das etiquetas, escolha a variante mais próxima sem passar do valor e confirme na bancada com o LED de status antes de confiar na leitura.

Por Que Isolar um Sinal de 5V ou 3,3V em uma Placa de 5V?

A primeira linha dessa tabela merece uma resposta própria, porque o módulo 3-5V parece sem sentido em uma placa de 5V. O Arduino UNO R4 trabalha com I/O de 5V, então isolar outro sinal de 5V pode parecer não fazer nada. Mas faz. O isolamento nunca foi sobre igualar tensões — é sobre se recusar a compartilhar um terra. Dois circuitos de 5V, cada um com sua própria fonte, ou que ficam em pontas opostas de um cabo longo, não concordam sobre onde está o 0V, e juntar os terras deles convida corrente de retorno, ruído e falhas a passarem de um para o outro. Enviar o sinal por um PC817 deixa a informação atravessar enquanto os terras continuam separados.

Esse é o argumento para a variante 3-5V, e nesta placa ele é forte: uma placa de controle com alimentação separada, um cabo que percorre uma oficina inteira, um driver de motor ao lado da fiação, ou a placa lógica de 5V dentro de um aparelho ligado à rede elétrica. É a variante certa sempre que o outro circuito trabalha em nível lógico, mas não está na sua alimentação.

Também vale deixar claro ao que a entrada do PC817 reage: corrente, não tensão. Um trilho de 5V que entrega 20 A não é mais pesado para o optoacoplador do que um que entrega só 20 mA, porque o resistor instalado no módulo define a corrente do LED de qualquer forma. O que a fonte grande muda é o tamanho do estrago que um erro de ligação em outro ponto pode causar — mais um motivo para mantê-la do outro lado do espaço.

Ativo em Nível BAIXO ou Ativo em Nível ALTO: Em Qual Sentido o Seu Módulo Lê?

Com o chip sozinho ligado como este guia descreve, a resposta é física resolvida. O coletor vai a um pino de entrada digital mantido em ALTO por um resistor de pull-up — o pull-up interno do Arduino UNO R4 é a escolha mais fácil, e nesta placa ele puxa o pino para 5V. Um resistor de 10 kohm do pino ao 5V faz o mesmo trabalho. De qualquer forma, a leitura fica invertida em relação ao que os iniciantes esperam:

  • Sinal externo PRESENTE ⇒ LED aceso ⇒ transistor conduz ⇒ o pino lê BAIXO
  • Sinal externo AUSENTE ⇒ LED apagado ⇒ transistor desligado ⇒ o pino lê ALTO

Um módulo não é tão definido. A maioria dos módulos repassa esse comportamento direto, então um sinal presente ainda lê BAIXO, mas alguns fabricantes invertem na placa para que o OUT acompanhe a entrada. Os dois tipos estão à venda, às vezes com a serigrafia quase idêntica, então não presuma — descubra. Leva menos de um minuto:

  • Ligue o módulo como mostrado abaixo, faça o upload do sketch deste guia e abra o Serial Monitor em 9600.
  • Deixe os terminais de entrada sem energia e anote o que a placa imprime.
  • Energize a linha externa e anote o que ela imprime agora.
  • O que aparecer enquanto a linha está energizada é o nível ativo do seu módulo. Se ele imprime LIVE com nada na entrada e IDLE enquanto a linha está energizada, você tem o tipo inversor.
  • Confira com o próprio LED de status do módulo, que acende sempre que o lado de entrada está energizado. LED aceso, mas o estado impresso sem mudar, significa que você está lendo o nível errado, não que a ligação em paralelo está com defeito.

Para ver o pino bruto em vez do rótulo LIVE/IDLE, adicione esta linha ao loop() durante o teste:

Serial.println(digitalRead(PC817_PIN)); // 1 = HIGH, 0 = LOW

Quando você souber, uma edição resolve de vez: a constante MODULE_ACTIVE_LOW no início do sketch. Deixe true para o módulo comum, ativo em nível BAIXO, e defina false para um módulo cuja saída acompanha a entrada. Nada mais no código muda. Ativo em nível BAIXO é o mesmo hábito que você encontra em muitos módulos de relé, e o pull-up interno é o mesmo usado no tutorial Arduino UNO R4 - Botão.

WARNING

NÃO conecte o terra do circuito de 12V ou 24V ao GND do Arduino UNO R4. Os dois terras devem ficar separados, e essa separação é a razão de ser do optoacoplador. Se você ligar os terras, o PC817 ainda comuta, mas o isolamento acaba e uma falha do lado de 12V/24V pode chegar à placa.

Diagrama de Ligação

  • Diagrama de ligação do Arduino UNO R4 com o módulo de isolamento optoacoplador PC817: o sinal externo de 12V ou 24V vai aos bornes IN+ e IN- da variante certa do módulo, e VCC, GND e OUT vão a 5V, GND e ao pino 2 do Arduino UNO R4 — o resistor em série já vem instalado no módulo, então não precisa adicionar um.
The wiring diagram between Arduino UNO R4 PC817 optocoupler isolation module 24V

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Uno R4 e outros componentes.

  • Diagrama de ligação do Arduino UNO R4 com o chip PC817 sozinho, para a montagem opcional descrita no final deste guia: o sinal de 12V chega ao pino 1 por um resistor de 1 kohm (use 2,2 kohm para um sinal de 24V), o pino 2 volta ao terra do circuito de 12V, o pino 4 vai ao pino 2 do Arduino UNO R4, e o pino 3 vai ao GND do Arduino UNO R4.

Ligando o PC817 em Paralelo com o Dispositivo que Você Quer Monitorar

Tome o operador de portão como exemplo prático. O controlador dele envia 12V por um par de fios até o relé do motor do portão sempre que o portão é acionado, e o Arduino UNO R4 está lá para perceber isso. A entrada do módulo fica entre esses dois fios, em paralelo com o dispositivo, no lugar onde ficaria um voltímetro. Ela nunca vai dentro do fio.

WARNING

NÃO coloque a entrada do PC817 em série com o dispositivo. Em série, toda a corrente de carga do motor do portão, da bobina do relé ou da lâmpada tem de passar por um LED interno dimensionado para 20 mA, e o PC817 é destruído no momento em que o dispositivo é ligado. Em paralelo com o dispositivo, nunca em linha com ele.

Nada na fiação existente do portão é cortado ou redirecionado. Três conexões são adicionadas, e esse é todo o trabalho:

  • O terminal positivo comutado do dispositivo ao borne IN+ do módulo — sem resistor em série seu, pois o módulo já traz o resistor para o qual a sua variante foi feita
  • O terminal negativo ou de retorno desse mesmo dispositivo ao borne IN-
  • O lado de saída continua exatamente como já está: OUT ao pino 2 do Arduino UNO R4, VCC ao 5V, GND ao GND

A ligação em paralelo custa apenas a pequena corrente do LED de entrada que o módulo foi feito para consumir. Perto dos ampères que um motor de portão, uma bobina de relé, uma válvula ou uma lâmpada puxa, isso não é nada, então o dispositivo continua se comportando exatamente como antes de ser monitorado. A medição é somente de leitura.

Três detalhes decidem se a ligação funciona de primeira:

  • A polaridade não é opcional. O lado de entrada é um LED, e um LED conduz em uma direção só. Ligue IN+ e IN- invertidos e nada quebra — o módulo simplesmente nunca liga, o LED de status fica apagado e o sketch informa IDLE para sempre. Meça a ligação e descubra qual lado é o positivo antes de ligar.
  • Uma carga indutiva precisa de um diodo de proteção. Um motor de portão, uma bobina de relé, um contator, um solenoide ou uma válvula gera um grande pico de tensão reversa quando a alimentação é cortada, e o LED de entrada do PC817 suporta só 6V reversos. Um diodo comum instalado em paralelo reverso diretamente nos bornes IN+ e IN- — catodo do diodo em IN+, anodo do diodo em IN- — absorve esse pico. Na operação normal, esse diodo fica polarizado reversamente e não faz absolutamente nada; no pico, ele conduz e limita a tensão reversa a bem menos de um volt. Um 1N4148 basta para uma ligação pequena, e um 1N4007 para uma mais pesada.
  • Uma saída de estado sólido com fuga engana a leitura. Algumas saídas a transistor de CLP, saídas a triac e drivers de lâmpada LED deixam passar uma pequena corrente mesmo desligados. Fuga suficiente acende parcialmente o LED de entrada do módulo, e o sketch então insiste que o dispositivo está ligado enquanto ele está claramente desligado. O sinal de alerta é uma leitura que nunca volta para IDLE, com o LED de status brilhando fraco. Instale um resistor de descarga de aproximadamente 4,7 kohm a 10 kohm entre os bornes IN+ e IN-, para que a fuga passe pelo resistor em vez de pelo LED.

Uma última restrição: a entrada do módulo é um único LED, então responde a uma só polaridade e apenas a DC. Detectar uma linha AC exige um optoacoplador cujo estágio de entrada tenha dois LEDs em oposição.

Saber se o Dispositivo Está Realmente Funcionando

Ficar em paralelo com o dispositivo é o que torna a leitura honesta. O pino não acompanha um botão específico nem uma saída específica do controlador — ele acompanha a energia que o dispositivo está realmente recebendo. Um portão aberto pelo controle remoto, pelo interruptor de parede ou pela chave parece idêntico para o sketch, porque o sketch está observando o motor e não o gatilho. Igualmente útil: um portão que recebeu o comando para abrir, mas não recebeu nada, deixa o pino em IDLE, e esse silêncio é em si o relatório de falha.

Isso é o que transforma uma leitura digital de uma linha em algo que vale registrar: totais de horas de funcionamento do motor do portão, um alerta quando uma abertura dura mais que os vinte segundos que normalmente leva, um registro de tempo ocioso de uma máquina, ou uma simples verificação de "ele realmente começou?" feita alguns segundos depois do envio do comando.

Uma limitação honesta pertence a tudo isso: o PC817 informa que o dispositivo está energizado, não que está funcionando — um motor travado ou uma resistência de aquecedor queimada ainda consomem energia nessa linha e ainda aparecem como LIVE.

Opcional: Montando a Mesma Entrada a Partir do Chip PC817 Sozinho

Prefere soldar o seu? Então a escolha da variante vira a escolha de um resistor: você instala o resistor que o módulo traria.

PC817 optocoupler pinout
image source: diyables.io

O chip é um DIP de 4 pinos, com o pino 1 marcado por um ponto ou um entalhe.

  • Pino 1 - Anodo (A): anodo do LED de entrada, alimentado pelo resistor em série.
  • Pino 2 - Catodo (K): catodo do LED de entrada, ligado ao terra do circuito externo, NÃO ao GND do Arduino UNO R4.
  • Pino 3 - Emissor (E): lado de saída, ligado ao GND da placa.
  • Pino 4 - Coletor (C): lado de saída, ligado ao pino 2 do Arduino UNO R4.

Dimensione o resistor para cerca de 10 mA de corrente no LED usando R = (Vin - 1,2) / 0,01:

Tensão de entrada Resistor
3,3V 220 ohm
5V 390 ohm
12V 1 kohm
24V 2,2 kohm, em uma peça de 1/2 W

Troque o resistor sempre que a tensão de entrada mudar. O restante desta página — ligação em paralelo, diodo de proteção, resistor de descarga, terras separados — vale sem alterações, e com o pull-up interno esta montagem é realmente ativa em nível BAIXO, então deixe MODULE_ACTIVE_LOW em true.

Como Programar

  • Dê um nome ao pino em que a linha OUT do módulo está ligada.
#define PC817_PIN 2
  • Transforme esse pino em uma entrada com pull-up usando pinMode().
pinMode(PC817_PIN, INPUT_PULLUP);
int raw = digitalRead(PC817_PIN);
  • Transforme esse nível bruto em uma resposta sim/não por meio da constante que descreve o seu módulo.
bool signal_active = MODULE_ACTIVE_LOW ? (raw == LOW) : (raw == HIGH);
  • Imprima o resultado ou aja com base nele.

Código Arduino UNO R4 - Optoacoplador PC817

Nenhuma biblioteca é necessária. Ler um PC817 é só leitura digital simples.

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-pc817-optocoupler-monitor-12v-24v-dc-input-signal */ #define PC817_PIN 2 // The Arduino UNO R4 pin connected to the module OUT pin (or the PC817 collector, pin 4) // Most PC817 optocoupler modules pull the output LOW when the input signal is present. // Some modules invert on-board and do the opposite. If yours does, change this to false. const bool MODULE_ACTIVE_LOW = true; void setup() { // initialize serial communication at 9600 bits per second Serial.begin(9600); // the internal pull-up holds the pin at 5V while the PC817 is off pinMode(PC817_PIN, INPUT_PULLUP); } void loop() { int raw = digitalRead(PC817_PIN); bool signal_active = MODULE_ACTIVE_LOW ? (raw == LOW) : (raw == HIGH); if (signal_active) Serial.println("12V gate line -> LIVE"); else Serial.println("12V gate line -> IDLE"); delay(500); }

Passos Rápidos

Siga estas instruções passo a passo:

  • Se esta é a primeira vez que você usa o Arduino Uno R4 WiFi/Minima, consulte o tutorial sobre como configurar o ambiente para o Arduino Uno R4 WiFi/Minima no Arduino IDE.
  • Confira se a variante do módulo na sua bancada corresponde à tensão da linha que você vai monitorar.
  • Ligue o módulo ao Arduino UNO R4 como mostra o diagrama, mantendo o terra de 12V longe do GND da placa.
  • Conecte a placa Arduino Uno R4 ao seu computador usando um cabo USB.
  • Abra o Arduino IDE no seu computador.
  • Selecione a placa Arduino Uno R4 correta (Arduino Uno R4 WiFi ou Arduino Uno R4 Minima) e a porta COM.
  • Copie o código acima e abra-o no Arduino IDE.
  • Clique no botão Upload do Arduino IDE para enviar o código ao Arduino UNO R4.
  • Abra o Serial Monitor.
  • Ligue e desligue a linha de 12V algumas vezes.
  • Confira o resultado no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' on 'COM15')
New Line
9600 baud
12V gate line -> IDLE 12V gate line -> IDLE 12V gate line -> LIVE 12V gate line -> LIVE 12V gate line -> LIVE 12V gate line -> LIVE 12V gate line -> IDLE 12V gate line -> IDLE
Ln 11, Col 1
Arduino Uno R4 WiFi on COM15
2

Se as leituras saírem exatamente ao contrário — LIVE em repouso e IDLE enquanto a linha está energizada —, o seu módulo inverte na própria placa, então defina MODULE_ACTIVE_LOW como false e faça o upload de novo. Se ele informa LIVE sem nada ligado ao lado de entrada, confira se o GND realmente chega ao módulo e se o pino está definido como INPUT_PULLUP. Se ele nunca informa LIVE, confirme a polaridade da entrada e se a variante do módulo corresponde à tensão dessa linha. Para medir essa linha externa diretamente, em vez de apenas detectá-la, veja o tutorial Arduino UNO R4 - Medir Tensão.

Vídeo

Referências de Funções

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!