Componenti · 14 min di lettura

Fotoaccoppiatore: cos'è e come usare PC817 e 4N35 con Arduino

Cos'è un fotoaccoppiatore e come funziona: pinout di PC817 e 4N35, CTR e calcolo delle resistenze, leggere 12/24 V, rilevare 230 V (H11AA1), relè e MOC3021.

Un fotoaccoppiatore (detto anche optoisolatore o optoaccoppiatore) è un piccolo integrato che trasporta un segnale tra due circuiti usando solo la luce, senza alcun collegamento elettrico tra loro. Al suo interno ci sono un LED infrarosso e un fototransistor rivolto verso di esso: quando il circuito da un lato accende il LED, il transistor dall'altro lato conduce. Poiché tra i due lati non c'è nemmeno un filo, picchi di tensione e disturbi non possono raggiungere il microcontrollore quando colleghi ad Arduino un sensore industriale a 24 V, la linea a 12 V di un'auto o un driver per motori.

In questo articolo imparerai passo dopo passo cosa c'è dentro un fotoaccoppiatore, perché l'isolamento galvanico è importante, i pin e i valori dei due modelli più diffusi, il PC817 e il 4N35, il concetto di CTR e il calcolo delle resistenze. Poi vedrai come isolare un'uscita di Arduino, leggere segnali a 12/24 V in sicurezza, usarlo con ESP32 e Raspberry Pi Pico, le regole di sicurezza per rilevare la tensione di rete (H11AA1), il fotoaccoppiatore dei moduli relè e come pilotare un triac con il MOC3021.

Cos'è un fotoaccoppiatore e come funziona?

Nel contenitore del fotoaccoppiatore ci sono due chip uno di fronte all'altro. Sul lato di ingresso c'è un LED infrarosso che funziona a corrente come un normale LED. Sul lato di uscita c'è un fototransistor con la base sensibile alla luce; invece di iniettare corrente nella base, la si illumina. Tra i due chip c'è uno strato di plastica trasparente ma elettricamente isolante, progettato per resistere a migliaia di volt.

  1. Il circuito sul lato di ingresso fa passare qualche milliampere nel LED attraverso una resistenza.
  2. Il LED emette luce infrarossa; questa luce attraversa lo strato isolante e cade sul fototransistor.
  3. La luce fa da corrente di base del fototransistor e lascia scorrere corrente tra collettore ed emettitore; il transistor si chiude come un interruttore.
  4. Quando il LED si spegne, la luce sparisce, il transistor torna in interdizione e il circuito di uscita si apre. Il segnale è passato dall'altra parte senza fili, solo con la luce.

A seconda di cosa c'è sul lato di uscita esistono diversi tipi di fotoaccoppiatori. Nei progetti hobbistici si usano soprattutto quelli a fototransistor, ma per rilevare segnali in alternata, innescare un triac o isolare una linea dati veloce servono tipi speciali:

TipoModelli di esempioUscitaUso tipico
A fototransistorPC817, EL817, 4N35, 4N25Fototransistor NPNIsolamento di segnali digitali, lettura di ingressi a 12/24 V, moduli relè
Uscita Darlington4N33, H11B1Transistor DarlingtonMolta corrente in uscita con pochissima corrente nel LED (ma più lento)
Ingresso in alternataH11AA1, PC814Due LED in antiparallelo + fototransistorRilevamento della tensione di rete, rilevamento del passaggio per lo zero
Uscita a triacMOC3021, MOC3041, MOC3063FototriacInnesco di triac, controllo di carichi in alternata, SSR
Logica veloce6N137, 6N138Fotodiodo + porta logica o transistorIsolamento di MIDI, UART e linee digitali veloci

Perché serve l'isolamento galvanico?

Isolamento galvanico significa che tra due circuiti non c'è un percorso conduttivo diretto: niente GND comune, niente fili condivisi, energia e informazione passano per un'altra via (luce, campo magnetico). I pin di Arduino reggono al massimo 5 V (3,3 V su ESP32 e Pico). I 24 V di un sensore industriale, i brevi picchi di centinaia di volt che un motore genera quando commuta o i disturbi indotti nei cavi lunghi possono arrivare direttamente al microcontrollore attraverso un GND comune. Il fotoaccoppiatore interrompe fisicamente questo percorso.

  • Protezione: anche se qualcosa si guasta sul lato ad alta tensione, il danno resta nel fotoaccoppiatore; Arduino, la porta USB del computer e tu restate al sicuro.
  • Disturbi e anelli di massa: motori, relè e cavi lunghi creano rumore sulla linea GND. Se le masse sono separate, questo rumore non entra nella linea del segnale; spieghiamo la massa comune nel dettaglio nell'articolo GND e massa comune.
  • Livelli di tensione diversi: poiché il transistor di uscita è alimentato dall'esterno, un segnale a 24 V diventa facilmente 3,3 V e uno a 5 V diventa 12 V. Il fotoaccoppiatore è anche un traslatore di livello lento ma robusto.
  • Norme di sicurezza: nei dispositivi collegati alla rete il lato utente deve essere isolato dalla rete; componenti come il PC817 superano una prova di isolamento a 5000 V rms.
L'isolamento funziona solo se i GND dei due lati restano separati. Se colleghi il negativo del lato a 24 V al GND di Arduino "per sicurezza", il fotoaccoppiatore diventa un pezzo di filo costoso e la protezione sparisce del tutto. Fai alimentare il lato di ingresso dalla sua sorgente e il lato di uscita da Arduino.

Pinout e caratteristiche di PC817 e 4N35

PinPC817 (DIP-4)4N35 (DIP-6)
1Anodo (LED +)Anodo (LED +)
2Catodo (LED −)Catodo (LED −)
3EmettitoreNon collegato
4CollettoreEmettitore
5AssenteCollettore
6AssenteBase (di solito lasciata libera)
CaratteristicaPC8174N35
Tensione diretta del LED (VF)Tip. 1,2 V, max 1,4 V (a 20 mA)Circa 1,2–1,3 V
Corrente massima del LED50 mA60 mA
Tensione inversa del LEDMax 6 VMax 6 V
CTR50–600 % (a 5 mA, 5 V; secondo la classe)Almeno 100 % (a 10 mA, 10 V)
Tensione collettore-emettitore (VCEO)35 V70 V
Corrente di collettoreMax 50 mAMax 50 mA
Tempo di commutazioneTip. 3–4 µs (con resistenza di carico bassa)Circa 10 µs
Tensione di isolamento5000 V rms5000 V rms

Sul PC817 il pin 1 è indicato da un punto; la lettera A, B, C o D dopo "PC817" sul contenitore indica la classe di CTR. Componenti come EL817, LTV817 e KP1010 sono equivalenti compatibili pin a pin con il PC817. Il 4N35 ha sei piedini, quindi la base è accessibile; di solito la si lascia libera, e in ambienti molto disturbati una resistenza di valore alto (es. 1 MΩ) tra base ed emettitore accelera lo spegnimento.

Cos'è il CTR e come si calcolano le resistenze?

Il CTR (Current Transfer Ratio, rapporto di trasferimento di corrente) è il rapporto tra la corrente di collettore che il transistor di uscita può far passare e la corrente del LED: CTR = IC / IF × 100 %. Per esempio, con un fotoaccoppiatore che ha CTR del 100 %, se fai passare 5 mA nel LED puoi prelevare in uscita al massimo circa 5 mA. Il CTR cambia con la temperatura, cala negli anni con l'invecchiamento del LED e varia molto anche tra componenti dello stesso modello. Per questo si progetta sempre sul valore minimo del datasheet.

Classe del PC817Intervallo di CTR (IF = 5 mA)Corrente di uscita con 5 mA nel LED
PC817A80–160 %4–8 mA
PC817B130–260 %6,5–13 mA
PC817C200–400 %10–20 mA
PC817D300–600 %15–30 mA
Senza lettera50–600 %2,5–30 mA (considera il caso peggiore)

Resistenza del LED: il lato di ingresso si calcola proprio come un LED: R = (Valim − VF) / IF. Per far passare 10 mA dal pin a 5 V di un Arduino Uno si ottiene (5 − 1,2) / 0,010 = 380 Ω; una resistenza standard da 330 Ω dà circa 11,5 mA e una da 390 Ω circa 9,7 mA. Sull'ESP32, (3,3 − 1,2) / 0,010 = 210 Ω, quindi usi 220 Ω. I pin del Raspberry Pi Pico sono impostati di default con una capacità di pilotaggio di 4 mA; qui bastano circa 4,5 mA con 470 Ω. Se non vuoi fare il conto a mano, usa lo strumento Resistenza per LED.

Resistenza di uscita (pull-up): perché il transistor conduca del tutto (vada in saturazione), la corrente richiesta dalla pull-up deve essere minore di quella consentita dal CTR. Una pull-up da 10 kΩ verso 5 V richiede solo 0,5 mA. In un PC817 senza lettera il CTR peggiore è del 50 %, quindi per 0,5 mA basterebbe 1 mA nel LED; dandogli 5–10 mA lasci almeno cinque volte di margine. Anche la pull-up interna di Arduino (circa 20–50 kΩ) è perfetta per questo. Una pull-up più piccola rende il segnale più veloce ma richiede più corrente; una più grande richiede meno corrente ma rallenta lo spegnimento del transistor.

CasoTensione di alimentazioneCorrente LED obiettivoResistenza consigliataPotenza della resistenza
Pilotaggio da un pin di Arduino Uno5 V~10 mA330 Ω1/4 W basta
Pilotaggio da un pin di ESP323,3 V~10 mA220 Ω1/4 W basta
Pilotaggio da un pin di Raspberry Pi Pico3,3 V~4,5 mA470 Ω1/4 W basta
Lettura di un segnale a 12 V12 V~5 mA2,2 kΩ1/4 W (dissipa 0,05 W)
Lettura di un segnale a 24 V24 V~5 mA4,7 kΩ1/4 W (dissipa 0,11 W)
Se devi leggere sia 12 V sia 24 V sullo stesso ingresso, scegli 4,7 kΩ: a 24 V scorrono circa 4,8 mA, a 12 V circa 2,3 mA. Anche con un CTR del 50 %, 2,3 mA sono molto più dei 0,1–0,25 mA richiesti dalla pull-up interna; lo stesso circuito funziona in modo affidabile con entrambe le tensioni.

Tabella dei collegamenti: Arduino Uno, ESP32 e Raspberry Pi Pico

Pin del PC817FunzioneArduino UnoESP32Raspberry Pi Pico
1 (Anodo), uscita isolataLa scheda pilota il LEDD9 → 330 Ω → pin 1GPIO 25 → 220 Ω → pin 1GP15 → 470 Ω → pin 1
2 (Catodo), uscita isolataRitorno del LEDGNDGNDGND
4 (Collettore), lettura ingressoLa scheda legge il segnaleD2 (INPUT_PULLUP)GPIO 27 (INPUT_PULLUP)GP14 (PULL_UP)
3 (Emettitore), lettura ingressoGND del lato di letturaGNDGNDGND
1 e 2, lettura ingressoSegnale esterno (12/24 V)Alla sorgente esterna, non alla schedaAlla sorgente esterna, non alla schedaAlla sorgente esterna, non alla scheda
L'errore più comune è collegare il LED senza resistenza: dare 5 V direttamente ai pin 1 e 2 brucia il LED in pochi secondi. Il secondo più comune è montare il componente al contrario; il LED regge solo 6 V in inversa, quindi 12 V o 24 V collegati al contrario lo distruggono. Aggiungere un diodo 1N4148 in inversa (catodo verso anodo) in parallelo all'ingresso elimina questo rischio.

Isolare un'uscita di Arduino

In questo uso Arduino accende il LED del fotoaccoppiatore e il transistor di uscita cortocircuita l'ingresso di un altro circuito come un interruttore. In questo modo puoi pilotare in sicurezza, per esempio, l'ingresso di trigger di un dispositivo a 12 V, l'ingresso di scatto remoto di una fotocamera, un ingresso di PLC o un altro microcontrollore che lavora a una tensione diversa. Poiché il transistor di uscita è limitato a 35 V e 50 mA, non può pilotare direttamente la bobina di un relè, un motore o una striscia LED; per questi carichi usi un transistor o un MOSFET dall'altra parte.

C++ (Arduino IDE)
1// PC817 ile yalıtılmış çıkış / Isolated output with a PC817
2// D9 -> 330 ohm -> PC817 pin 1 (anot / anode), pin 2 (katot / cathode) -> Arduino GND
3// Pin 4 ve 3 diğer devrenin girişini kısa devre eder (kuru kontak gibi)
4// Pins 4 and 3 short the other circuit's input (like a dry contact)
5const int OPTO_LED_PIN = 9;
6const unsigned long ON_MS = 2000;
7const unsigned long OFF_MS = 3000;
8
9bool isOn = false;
10unsigned long lastSwitch = 0;
11
12void setup() {
13  pinMode(OPTO_LED_PIN, OUTPUT);
14  digitalWrite(OPTO_LED_PIN, LOW);
15}
16
17void loop() {
18  unsigned long waitTime = isOn ? ON_MS : OFF_MS;
19  if (millis() - lastSwitch >= waitTime) {
20    lastSwitch = millis();
21    isOn = !isOn;
22    digitalWrite(OPTO_LED_PIN, isOn ? HIGH : LOW);   // HIGH: optokuplör iletir / HIGH: optocoupler conducts
23  }
24}

Sul lato di uscita colleghi il collettore (pin 4) al lato positivo o all'ingresso dell'altro circuito e l'emettitore (pin 3) al GND di quel circuito; se la polarità è invertita il transistor non conduce. Poiché un PC817 impiega da pochi a qualche decina di microsecondi per accendersi e spegnersi, un segnale PWM che lo attraversa comincia a deformarsi sopra qualche kHz. Per segnali veloci (UART, MIDI, PWM ad alta frequenza) si preferiscono fotoaccoppiatori veloci come il 6N137 o integrati isolatori digitali.

Leggere segnali a 12/24 V in sicurezza

Non puoi collegare direttamente a un pin di Arduino i segnali di sensori induttivi industriali, uscite di PLC, contatti di porte, la chiave di accensione di un'auto o il pulsante di un campanello a 12 V. La soluzione è far passare il segnale nel LED del fotoaccoppiatore: metti in serie al LED una resistenza da 4,7 kΩ per 24 V e da 2,2 kΩ per 12 V, e il transistor di uscita lavora con la pull-up interna di Arduino. Quando c'è tensione il LED si accende, il transistor conduce e il pin di Arduino legge LOW. La logica è quindi invertita e ne tieni conto nel codice.

  1. Collega il positivo della sorgente a 24 V, attraverso una resistenza da 4,7 kΩ, al pin 1 (anodo) del PC817.
  2. Collega il negativo della sorgente del segnale (GND a 24 V) al pin 2 (catodo). Non collegare questo GND ad Arduino.
  3. Se vuoi, aggiungi un diodo 1N4148 in inversa tra i pin 1 e 2 (catodo sul pin 1); protegge dall'inversione di polarità.
  4. Collega il pin 4 (collettore) del PC817 al pin D2 di Arduino e il pin 3 (emettitore) al GND di Arduino.
  5. Carica il codice qui sotto e apri il Monitor seriale a 9600 baud. Applicando 24 V dovresti vedere "24V VAR / present".
C++ (Arduino IDE)
1// PC817 ile 12/24 V sinyal okuma / Reading a 12/24 V signal with a PC817
2// PC817 pin 4 (kolektör / collector) -> D2, pin 3 (emetör / emitter) -> Arduino GND
3const int OPTO_PIN = 2;
4const unsigned long DEBOUNCE_MS = 20;    // kontak sıçramasına karşı / against contact bounce
5
6int lastReading = HIGH;
7int stableState = HIGH;
8unsigned long lastChange = 0;
9unsigned long pulseCount = 0;
10
11void setup() {
12  Serial.begin(9600);
13  pinMode(OPTO_PIN, INPUT_PULLUP);       // dahili pull-up yeterli / internal pull-up is enough
14}
15
16void loop() {
17  int reading = digitalRead(OPTO_PIN);
18  if (reading != lastReading) {          // değişim var, zamanı başlat / change seen, start the timer
19    lastChange = millis();
20    lastReading = reading;
21  }
22  if (millis() - lastChange > DEBOUNCE_MS && reading != stableState) {
23    stableState = reading;
24    // Mantık ters: 24 V varsa LED yanar, transistör iletir, pin LOW olur
25    // Inverted logic: with 24 V present the LED is on, the transistor conducts, the pin reads LOW
26    if (stableState == LOW) {
27      pulseCount++;
28      Serial.print("24V VAR / present, sayac / count: ");
29      Serial.println(pulseCount);
30    } else {
31      Serial.println("24V YOK / absent");
32    }
33  }
34}

Il codice contiene un semplice antirimbalzo che accetta solo letture rimaste invariate per 20 ms; con segnali da contatti meccanici o relè è indispensabile. Poiché leggiamo con millis() invece che con delay(), Arduino può fare altro nel frattempo. Nell'impianto elettrico di un'auto la linea a 12 V sale a 14,4 V a motore acceso e compaiono picchi brevi e alti; qui è una buona precauzione portare la resistenza a 3,3 kΩ e aggiungere un diodo TVS all'ingresso.

Fotoaccoppiatore con ESP32 e Raspberry Pi Pico

Poiché ESP32 e Pico lavorano a 3,3 V, non vanno collegati direttamente nemmeno a segnali a 5 V. Il bello del fotoaccoppiatore è che il transistor di uscita è a collettore aperto, quindi la tensione di uscita dipende solo dalla tensione a cui è collegata la pull-up. Con la pull-up interna l'uscita resta automaticamente a 3,3 V; anche con 24 V sul lato di ingresso, all'ESP32 arrivano al massimo 3,3 V. Il codice ESP32 seguente conta con un interrupt gli impulsi di un sensore induttivo o di un flussimetro a 24 V:

C++ (Arduino IDE)
1// ESP32: 24 V endüstriyel sensörden darbe sayma / counting pulses from a 24 V industrial sensor
2// PC817 pin 4 -> GPIO 27, pin 3 -> ESP32 GND
3const int OPTO_PIN = 27;
4
5volatile unsigned long pulseCount = 0;
6volatile unsigned long lastPulseUs = 0;
7
8void IRAM_ATTR onPulse() {
9  unsigned long now = micros();
10  if (now - lastPulseUs > 2000) {        // 2 ms'den kısa parazitleri yok say / ignore glitches shorter than 2 ms
11    pulseCount++;
12    lastPulseUs = now;
13  }
14}
15
16void setup() {
17  Serial.begin(115200);
18  pinMode(OPTO_PIN, INPUT_PULLUP);
19  attachInterrupt(digitalPinToInterrupt(OPTO_PIN), onPulse, FALLING);   // 24 V gelince pin düşer / pin falls when 24 V arrives
20}
21
22void loop() {
23  static unsigned long lastPrint = 0;
24  if (millis() - lastPrint >= 1000) {
25    lastPrint = millis();
26    noInterrupts();
27    unsigned long count = pulseCount;
28    pulseCount = 0;
29    interrupts();
30    Serial.printf("Saniyedeki darbe / Pulses per second: %lu\n", count);
31  }
32}

L'IRAM_ATTR davanti alla funzione di interrupt mette il codice nella memoria veloce; sull'ESP32 è consigliato per le funzioni di interrupt. Il filtro da 2 ms elimina gli impulsi falsi dovuti allo spegnimento lento del fotoaccoppiatore o ai disturbi sul cavo. Per approfondire gli interrupt, dai un'occhiata all'articolo Interrupt su Arduino. Sul Raspberry Pi Pico fai lo stesso in MicroPython così; mentre legge l'ingresso, questo esempio invia anche un segnale isolato dall'altra parte con un secondo PC817:

MicroPython
1# Raspberry Pi Pico: PC817 ile yalıtılmış giriş / isolated input with a PC817
2# PC817 pin 4 -> GP14, pin 3 -> Pico GND, LED sürme / LED drive: GP15 -> 470 ohm -> pin 1
3from machine import Pin
4import time
5
6opto_in = Pin(14, Pin.IN, Pin.PULL_UP)     # dahili pull-up / internal pull-up
7opto_out = Pin(15, Pin.OUT)                # ikinci PC817'nin LED'i / LED of a second PC817
8
9last_state = opto_in.value()
10while True:
11    state = opto_in.value()
12    if state != last_state:
13        time.sleep_ms(20)                  # sıçramayı bekle / wait out the bounce
14        state = opto_in.value()
15        if state != last_state:
16            last_state = state
17            if state == 0:                 # ters mantık: 0 = gerilim var / inverted: 0 = voltage present
18                print("24V VAR / present")
19                opto_out.value(1)          # karşı tarafa yalıtılmış sinyal / isolated signal to the other side
20            else:
21                print("24V YOK / absent")
22                opto_out.value(0)
23    time.sleep_ms(5)

Rilevare i 230 V: l'H11AA1 e la sicurezza

La tensione di rete a 230 V può uccidere. Se non hai esperienza, non costruire da solo un circuito collegato alla rete; usa moduli di rilevamento AC già pronti, chiusi e certificati. Non mettere mai il lato rete su una breadboard, non toccare nulla mentre il circuito è alimentato e metti tutto il circuito in una scatola isolante insieme a un fusibile.

Per sapere se una presa o una linea luce è in tensione, o per rilevare i passaggi per lo zero della rete, si usano fotoaccoppiatori con ingresso in alternata come l'H11AA1. All'interno ci sono due LED in antiparallelo, quindi produce luce in entrambe le semionde della corrente alternata e non ha problemi di tensione inversa. Per 230 V rms si mettono due resistenze da 47 kΩ in serie all'ingresso: nei 94 kΩ totali scorrono circa 2,4 mA rms (3,5 mA di picco) e ogni resistenza dissipa circa 0,28 W. Per questo si scelgono resistenze da almeno 0,5 W, meglio da 1 W; usarne due dimezza anche la tensione su ciascuna. Sul lato di uscita, con una pull-up da 10 kΩ verso 5 V, il transistor conduce quasi sempre mentre c'è tensione; solo vicino ai passaggi per lo zero, quando i LED si spengono, compare un breve impulso HIGH. Su una rete a 50 Hz vedrai circa 100 impulsi al secondo.

C++ (Arduino IDE)
1// H11AA1 ile şebeke gerilimi var mı? / Is mains voltage present? (H11AA1)
2// H11AA1 pin 5 (kolektör / collector) -> D2, pin 4 (emetör / emitter) -> GND, 10k pull-up -> 5V
3const int AC_PIN = 2;
4const unsigned long TIMEOUT_MS = 40;     // 50 Hz'de 2 tam periyot / 2 full cycles at 50 Hz
5
6volatile unsigned long pulses = 0;
7unsigned long lastLowSeen = 0;
8unsigned long lastReport = 0;
9
10void onZeroCross() {
11  pulses++;                              // her sıfır geçişinde bir darbe / one pulse per zero crossing
12}
13
14void setup() {
15  Serial.begin(9600);
16  pinMode(AC_PIN, INPUT);                // harici 10k pull-up kullanılıyor / external 10k pull-up in use
17  attachInterrupt(digitalPinToInterrupt(AC_PIN), onZeroCross, RISING);
18}
19
20void loop() {
21  if (digitalRead(AC_PIN) == LOW) {
22    lastLowSeen = millis();              // gerilim varken çıkış çoğunlukla LOW / output is mostly LOW while voltage is present
23  }
24  bool mainsOn = (millis() - lastLowSeen) < TIMEOUT_MS;
25
26  if (millis() - lastReport >= 1000) {   // saniyede bir rapor / report once per second
27    lastReport = millis();
28    noInterrupts();
29    unsigned long count = pulses;
30    pulses = 0;
31    interrupts();
32    Serial.print(mainsOn ? "Sebeke VAR / Mains ON" : "Sebeke YOK / Mains OFF");
33    Serial.print("  sifir gecisi / zero crossings: ");
34    Serial.print(count);                 // 50 Hz'de yaklaşık 100 / about 100 at 50 Hz
35    Serial.print("  frekans / frequency: ");
36    Serial.print(count / 2);
37    Serial.println(" Hz");
38  }
39}

Il codice fornisce due informazioni: se negli ultimi 40 ms l'uscita è andata LOW almeno una volta, la rete c'è; e metà degli impulsi contati dall'interrupt dà la frequenza di rete. Cosa controllare nei moduli pronti e sulla tua scheda: lascia almeno 6–8 mm di distanza (distanza di isolamento superficiale) tra le piste di rete e il lato a bassa tensione, metti un fusibile sull'ingresso di rete, non far mai passare una pista tra i due lati del fotoaccoppiatore e usa il circuito dentro una scatola chiusa.

Il fotoaccoppiatore nei moduli relè e il jumper JD-VCC

Modulo relè con ingresso a fotoaccoppiatore
Molti moduli relè hanno un fotoaccoppiatore PC817 sul lato di ingresso; per un isolamento completo bisogna togliere il jumper JD-VCC.

La maggior parte dei moduli relè a 1, 2, 4 e 8 canali in commercio ha un PC817 sull'ingresso di ogni canale. La corrente del pin VCC passa attraverso una resistenza e un LED spia fino al LED del fotoaccoppiatore; quando il pin IN va LOW il circuito si chiude e il relè scatta. Per questo questi moduli di solito sono attivi bassi. Però, così come escono dalla fabbrica, hanno il jumper JD-VCC inserito e la bobina del relè è alimentata dagli stessi VCC e GND: il fotoaccoppiatore c'è, ma l'isolamento no. Trovi le basi sui moduli relè nell'articolo Cos'è un modulo relè?.

ImpostazioneCollegamentoIsolamento
Jumper JD-VCC inseritoArduino 5V → VCC, GND → GND, pin → INNessuno; i disturbi della bobina del relè finiscono nell'alimentazione di Arduino
Jumper toltoArduino 5V → VCC, pin → IN; GND di Arduino non collegato. Alimentazione 5 V separata → JD-VCC e GNDCompleto; i due lati condividono solo la luce dentro il fotoaccoppiatore

Nota sul pilotaggio di un triac con il MOC3021

Se al posto di un relè vuoi un interruttore in alternata silenzioso e senza scintille, si usa un triac (es. BT136) con un fotoaccoppiatore a uscita triac per innescarlo. Il MOC3021 è a fase casuale: innesca il triac nell'istante in cui il LED si accende, quindi insieme a un rilevatore di passaggio per lo zero è adatto per costruire un dimmer. MOC3041 e MOC3063 sono modelli con circuito di passaggio per lo zero; innescano solo quando la tensione passa per lo zero, generano meno disturbi nelle applicazioni on/off, ma non si possono usare per la regolazione. Il LED del MOC3021 può richiedere fino a 15 mA per innescare; a 5 V, 220 Ω (circa 17 mA) è un valore adatto, mentre 330 Ω può non bastare per alcuni esemplari. Come nei datasheet, tra il gate del triac e il MOC3021 si mette una resistenza di circa 360 Ω, e con carichi induttivi come i motori si aggiunge uno snubber RC ai capi del triac. I moduli SSR (relè a stato solido) già pronti contengono esattamente questa struttura.

Idee di progetto con il fotoaccoppiatore

  • Lettore di sensori industriali: conta i pezzi su un nastro trasportatore con un sensore di prossimità induttivo a 24 V e mostra il conteggio su un display LCD.
  • Rilevatore di accensione dell'auto: sveglia l'ESP32 quando si gira la chiave e avvia la dashcam o un registratore.
  • Allarme di blackout: con un modulo di rilevamento AC già pronto, fai suonare un buzzer o invia una notifica al telefono quando manca la corrente.
  • Rilevatore del campanello: leggi in modo isolato la linea a 12 V del campanello esistente e invia una notifica quando suona.
  • Scheda relè isolata: controlla una lampada a 230 V con un modulo relè a cui hai tolto il jumper JD-VCC e che alimenti da una sorgente separata.
  • Ingresso MIDI: leggi su Arduino le note MIDI di uno strumento elettronico con un 6N138.

Errori comuni e soluzioni

SintomoCausa probabileSoluzione
L'uscita non cambia maiLED collegato al contrario, oppure senza resistenza e bruciatoControlla che il pin 1 sia quello col punto; prova il LED con il multimetro in modalità diodo
La logica funziona al contrarioCon la tensione presente il pin va LOW; è normaleInterpreta LOW come "tensione presente" nel codice
L'uscita non scende del tutto a LOW (resta a 1–2 V)Corrente nel LED bassa, CTR insufficiente o pull-up troppo piccolaRiduci la resistenza del LED o aumenta la pull-up (es. 10 kΩ)
Il segnale PWM si deformaIl PC817 è troppo lento sopra qualche kHzRiduci la pull-up o usa un fotoaccoppiatore veloce come il 6N137
Arduino si resetta nonostante l'isolamentoI GND dei due lati sono stati unitiSepara il GND del lato di ingresso da Arduino; sul modulo relè togli il jumper JD-VCC
Attivazioni false casualiCavo lungo, disturbi, rimbalzi dei contattiApplica un antirimbalzo software, accorcia il cavo, aggiungi un condensatore da 100 nF in parallelo al LED
Il modo più semplice per provare un fotoaccoppiatore: alimenta il lato LED con 5 V attraverso 330 Ω e collega un multimetro in modalità resistenza tra collettore ed emettitore. Con il LED acceso dovresti leggere una resistenza bassa, con il LED spento una resistenza molto alta. Con questa prova semplice scarti un componente guasto prima di montarlo nel circuito.

Il fotoaccoppiatore è il modo più economico per portare un progetto Arduino fuori dalla scrivania e farlo dialogare in sicurezza con i segnali a 12 V, 24 V e 230 V del mondo reale: un componente da pochi centesimi separa la tua scheda e il tuo computer dall'alta tensione. Nell'app BlueGrays trovi i progetti per controllare una lampadina a 230 V con un relè, per l'illuminazione intelligente e per l'irrigazione, passo dopo passo con schemi del circuito e codice.

Domande frequenti

A cosa serve un fotoaccoppiatore?

Un fotoaccoppiatore trasporta un segnale tra due circuiti con la luce, senza collegamento elettrico. Così isola un circuito ad alta tensione o disturbato da un microcontrollore delicato come Arduino. Si usa per leggere sensori industriali, nei moduli relè e nei circuiti di rilevamento della tensione di rete.

Qual è il pinout del PC817?

Il PC817 ha quattro piedini: il pin 1, nell'angolo con il punto, è l'anodo del LED e il pin 2 il catodo. Sul lato opposto, il pin 3 è l'emettitore del fototransistor e il pin 4 il collettore.

Che resistenza usare con un fotoaccoppiatore?

La resistenza si calcola con R = (tensione di alimentazione − 1,2 V) / corrente del LED. Buoni valori di partenza sono 330 Ω per un pin a 5 V di Arduino, 220 Ω per un ESP32, 2,2 kΩ per un segnale a 12 V e 4,7 kΩ per un segnale a 24 V.

Cos'è il CTR di un fotoaccoppiatore?

Il CTR (rapporto di trasferimento di corrente) è il rapporto tra la corrente che può passare nel transistor di uscita e la corrente del LED. Con un CTR del 100 %, 5 mA nel LED permettono di prelevare in uscita al massimo circa 5 mA. Progetta sempre sul CTR minimo del datasheet.

Che differenza c'è tra PC817 e 4N35?

Sono entrambi fotoaccoppiatori con uscita a fototransistor. Il PC817 ha quattro piedini, costa poco e ha un CTR dal 50 al 600 % secondo la classe. Il 4N35 ha sei piedini, rende accessibile la base e regge tensioni di collettore fino a 70 V.

Si possono rilevare i 230 V con un fotoaccoppiatore?

Sì, con fotoaccoppiatori a ingresso in alternata come l'H11AA1 e resistenze in serie di potenza adeguata si possono rilevare la tensione di rete e i passaggi per lo zero. Ma la tensione di rete può uccidere; se non hai esperienza, usa moduli di rilevamento AC già pronti e chiusi.

Vedi tutti i progetti
Lampadina 220V con pulsante (Push)
#19Avanzato
Premium

Lampadina 220V con pulsante (Push)

Finché tieni premuto il pulsante, una vera lampadina da 220 volt resta accesa, e si spegne appena lo lasci. Il piccolo segnale dell'Arduino non può accendere la lampadina direttamente, quindi in mezzo

4.4(30)
38
Accendere e spegnere una lampadina 220V con un pulsante
#20Avanzato
Premium

Accendere e spegnere una lampadina 220V con un pulsante

Vuoi accendere e spegnere una vera lampadina di casa con un piccolo pulsante? Ogni volta che lo premi, l'Arduino fa scattare un relè e la lampadina si accende; premendo di nuovo si spegne. Il relè è u

4.5(33)
44
Accendere una lampadina 220V con il telecomando
#21Avanzato
Premium

Accendere una lampadina 220V con il telecomando

Accendi e spegni una vera lampadina di casa con un telecomando, senza alzarti dal divano. L'Arduino legge il segnale di luce invisibile del telecomando; il tasto di accensione fa scattare il relè e ac

4.4(22)
30
Illuminazione intelligente di scale e corridoi
#82Intermedio
Premium

Illuminazione intelligente di scale e corridoi

Metti piede sulle scale o nel corridoio e le luci si accendono gradino dopo gradino nella direzione in cui cammini. A ogni estremità c'è un sensore di distanza; davanti a qualunque dei due passi, gli

5.0(35)
51
Illuminazione Intelligente ESP32 (PIR + LDR + Relè + OLED)
#141Avanzato
Premium

Illuminazione Intelligente ESP32 (PIR + LDR + Relè + OLED)

Trasforma il tuo corridoio, bagno o dispensa in illuminazione intelligente con ESP32! Utilizzando un sensore di movimento PIR, un sensore di luce LDR e un modulo relè, costruiamo lo scenario classico "la luce si accende quando viene rilevato movimento al buio" — se l'ambiente è già luminoso, il movimento NON attiva la luce, risparmiando energia durante il giorno. La luce rimane accesa per 30 secondi; se il movimento continua, il timer si azzera e la luce rimane accesa più a lungo. Il display OLE

4.3(6)
11
Stazione di irrigazione intelligente
#83Avanzato
Premium

Stazione di irrigazione intelligente

Un giardiniere che annaffia le tue piante da solo, così non si seccano mentre sei in vacanza. Un sensore di umidità misura quanto è bagnata la terra; quando diventa secca, l'Arduino accende la pompa d

5.0(42)
57
Illuminazione automatica con sensore di movimento PIR ESP32
#121Intermedio
Premium

Illuminazione automatica con sensore di movimento PIR ESP32

In questo progetto, utilizzeremo il sensore di movimento PIR HC-SR501 per rilevare la presenza di una persona che entra nella stanza e accendere automaticamente il LED. Monitoreremo il tempo di accensione del LED con millis(); ogni lettura HIGH del sensore aggiornerà l'istante dell'ultimo movimento e il LED si spegnerà quando saranno trascorsi almeno 10 secondi dall'ultima lettura HIGH. Il codice attuale attende anche 50 ms a ogni iterazione con delay(50), quindi il ciclo dell'applicazione n

4.4(24)
38