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.
- Il circuito sul lato di ingresso fa passare qualche milliampere nel LED attraverso una resistenza.
- Il LED emette luce infrarossa; questa luce attraversa lo strato isolante e cade sul fototransistor.
- La luce fa da corrente di base del fototransistor e lascia scorrere corrente tra collettore ed emettitore; il transistor si chiude come un interruttore.
- 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:
| Tipo | Modelli di esempio | Uscita | Uso tipico |
|---|---|---|---|
| A fototransistor | PC817, EL817, 4N35, 4N25 | Fototransistor NPN | Isolamento di segnali digitali, lettura di ingressi a 12/24 V, moduli relè |
| Uscita Darlington | 4N33, H11B1 | Transistor Darlington | Molta corrente in uscita con pochissima corrente nel LED (ma più lento) |
| Ingresso in alternata | H11AA1, PC814 | Due LED in antiparallelo + fototransistor | Rilevamento della tensione di rete, rilevamento del passaggio per lo zero |
| Uscita a triac | MOC3021, MOC3041, MOC3063 | Fototriac | Innesco di triac, controllo di carichi in alternata, SSR |
| Logica veloce | 6N137, 6N138 | Fotodiodo + porta logica o transistor | Isolamento 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.
Pinout e caratteristiche di PC817 e 4N35
| Pin | PC817 (DIP-4) | 4N35 (DIP-6) |
|---|---|---|
| 1 | Anodo (LED +) | Anodo (LED +) |
| 2 | Catodo (LED −) | Catodo (LED −) |
| 3 | Emettitore | Non collegato |
| 4 | Collettore | Emettitore |
| 5 | Assente | Collettore |
| 6 | Assente | Base (di solito lasciata libera) |
| Caratteristica | PC817 | 4N35 |
|---|---|---|
| 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 LED | 50 mA | 60 mA |
| Tensione inversa del LED | Max 6 V | Max 6 V |
| CTR | 50–600 % (a 5 mA, 5 V; secondo la classe) | Almeno 100 % (a 10 mA, 10 V) |
| Tensione collettore-emettitore (VCEO) | 35 V | 70 V |
| Corrente di collettore | Max 50 mA | Max 50 mA |
| Tempo di commutazione | Tip. 3–4 µs (con resistenza di carico bassa) | Circa 10 µs |
| Tensione di isolamento | 5000 V rms | 5000 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 PC817 | Intervallo di CTR (IF = 5 mA) | Corrente di uscita con 5 mA nel LED |
|---|---|---|
| PC817A | 80–160 % | 4–8 mA |
| PC817B | 130–260 % | 6,5–13 mA |
| PC817C | 200–400 % | 10–20 mA |
| PC817D | 300–600 % | 15–30 mA |
| Senza lettera | 50–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.
| Caso | Tensione di alimentazione | Corrente LED obiettivo | Resistenza consigliata | Potenza della resistenza |
|---|---|---|---|---|
| Pilotaggio da un pin di Arduino Uno | 5 V | ~10 mA | 330 Ω | 1/4 W basta |
| Pilotaggio da un pin di ESP32 | 3,3 V | ~10 mA | 220 Ω | 1/4 W basta |
| Pilotaggio da un pin di Raspberry Pi Pico | 3,3 V | ~4,5 mA | 470 Ω | 1/4 W basta |
| Lettura di un segnale a 12 V | 12 V | ~5 mA | 2,2 kΩ | 1/4 W (dissipa 0,05 W) |
| Lettura di un segnale a 24 V | 24 V | ~5 mA | 4,7 kΩ | 1/4 W (dissipa 0,11 W) |
Tabella dei collegamenti: Arduino Uno, ESP32 e Raspberry Pi Pico
| Pin del PC817 | Funzione | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| 1 (Anodo), uscita isolata | La scheda pilota il LED | D9 → 330 Ω → pin 1 | GPIO 25 → 220 Ω → pin 1 | GP15 → 470 Ω → pin 1 |
| 2 (Catodo), uscita isolata | Ritorno del LED | GND | GND | GND |
| 4 (Collettore), lettura ingresso | La scheda legge il segnale | D2 (INPUT_PULLUP) | GPIO 27 (INPUT_PULLUP) | GP14 (PULL_UP) |
| 3 (Emettitore), lettura ingresso | GND del lato di lettura | GND | GND | GND |
| 1 e 2, lettura ingresso | Segnale esterno (12/24 V) | Alla sorgente esterna, non alla scheda | Alla sorgente esterna, non alla scheda | Alla sorgente esterna, non alla scheda |
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.
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.
- Collega il positivo della sorgente a 24 V, attraverso una resistenza da 4,7 kΩ, al pin 1 (anodo) del PC817.
- Collega il negativo della sorgente del segnale (GND a 24 V) al pin 2 (catodo). Non collegare questo GND ad Arduino.
- Se vuoi, aggiungi un diodo 1N4148 in inversa tra i pin 1 e 2 (catodo sul pin 1); protegge dall'inversione di polarità.
- Collega il pin 4 (collettore) del PC817 al pin D2 di Arduino e il pin 3 (emettitore) al GND di Arduino.
- Carica il codice qui sotto e apri il Monitor seriale a 9600 baud. Applicando 24 V dovresti vedere "24V VAR / present".
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:
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:
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
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.
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

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è?.
| Impostazione | Collegamento | Isolamento |
|---|---|---|
| Jumper JD-VCC inserito | Arduino 5V → VCC, GND → GND, pin → IN | Nessuno; i disturbi della bobina del relè finiscono nell'alimentazione di Arduino |
| Jumper tolto | Arduino 5V → VCC, pin → IN; GND di Arduino non collegato. Alimentazione 5 V separata → JD-VCC e GND | Completo; 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
| Sintomo | Causa probabile | Soluzione |
|---|---|---|
| L'uscita non cambia mai | LED collegato al contrario, oppure senza resistenza e bruciato | Controlla che il pin 1 sia quello col punto; prova il LED con il multimetro in modalità diodo |
| La logica funziona al contrario | Con la tensione presente il pin va LOW; è normale | Interpreta 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 piccola | Riduci la resistenza del LED o aumenta la pull-up (es. 10 kΩ) |
| Il segnale PWM si deforma | Il PC817 è troppo lento sopra qualche kHz | Riduci la pull-up o usa un fotoaccoppiatore veloce come il 6N137 |
| Arduino si resetta nonostante l'isolamento | I GND dei due lati sono stati uniti | Separa il GND del lato di ingresso da Arduino; sul modulo relè togli il jumper JD-VCC |
| Attivazioni false casuali | Cavo lungo, disturbi, rimbalzi dei contatti | Applica un antirimbalzo software, accorcia il cavo, aggiungi un condensatore da 100 nF in parallelo al LED |
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.
Progetti da realizzare dopo questo articolo
Vedi tutti i progetti
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

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

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

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

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

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

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
Altri articoli
App BlueGrays
Costruisci questo circuito passo passo sul telefono
Schema, codice ed elenco componenti in un’unica schermata. Oltre 200 progetti Arduino, ESP32 e Pico da realizzare.
Inquadra con il telefono
Punta la fotocamera sul codice: si apre lo store del tuo telefono.
oppure apri lo store

