ESP32: scatta interrupt su digitalWrite

Qualcuno di voi ha mai notato che, ad esempio, un interrupt settato sul pin 32, scatta anche facendo una digitalWrite (o altro) sul pin 17 ?

Non mi spiego il motivo. Il pin dell'interrupt è già in pullup. (non cambia niente nemmeno in pulldown). Qualunque cosa io scriva sul pin 17 (non ho provato altri) mi fa scattare l'interrupt.

Potrebbe essere un problema di cablaggio ? Sarei portato ad escluderlo, visto che fisicamente i due pin sono separati e singolarmente funzionano (quindi, banalmente, i cavi sono giusti).

L'unica stranezza (per me) è che sto alimentando un piccolo motorino 3v direttamente dal pin 17 (in pratica, il pin 17 è il + del motore, il - va alla ground in comune tra tutto). una digitalWrite high mi accende il motore e la digitalwrite low lo spegne, come previsto. Ma ad ogni cambio mi scatta l'interrupt di tutt'altro pin.

ciao

codice e schema dei cablaggi!?

non li ho sottomano, ma togliendo tutto il resto (dato che il problema si è presentato oggi, quando ho attaccato il motore), ho un motorino 3v con il positivo al pin 17 e negativo alla gnd, un sensore esterno (semplice apri/chiudi, un sensore a galleggiante) pin 32 e gnd.

void Interrupts::init() {
  pinMode(32, INPUT_PULLDOWN);
  attachInterrupt(digitalPinToInterrupt(32), [](){ interrupts.overflowHandler(); }, RISING);
}

void IRAM_ATTR Interrupts::overflowHandler()
{
  // Debounce
  if ((millis() - overflowLastPress) < 800)
    return;
  overflowLastPress = millis();

  Serial.println("# INTERRUPT");

  this->isOverflowing = true;
};







void loop() {
   digitalWrite(17, !digitalRead(17));
   delay(1000);
}

No no no no, non si fa. :smiley:
Non si collega un motore direttamente al pin e non importa se si tratta di un motorino piccolo e apparentemente innocente. Usa un bjt NPN con lo stesso circuito che si usa per alimentare la bobina di un relay, ma al posto delle bobina ci colleghi il motore.

Ciao.

uff. che palle. l'avevo scelto apposta così piccolino.

dovrò montare l'ULN2003 che ho...........

Ne approfitto, uno di quelli può mandare sia un 12V che un 3v ?

Temo che non lavori con 3V, con 12V sicuro, mai provato con 3V.
Allora usa un mosfet, deve essere specifico però, qui qualcosa in più la può dire @Etemenanki

Ti è andata bene che non hai guastato l'ESP.
Ciao,

facciamo così. devo pilotare, preferibilmente pwm, due motori DC. un 12v ed un 3v. qual'è la soluzione migliore che non mi faccia impazzire con mille cavi e componenti?

ho visto che con i MOSFET a transistor posso pilotare carichi a 12v o più partendo da una tensione in input di anche meno di 3v (un MOSFET in sostanza)

ma come dico all'uscita di tenere una tensione a 12v se il dispositivo mi va da 3 a 60v ad esempio? come lo regolo?

due di quelli farebbero al caso mio, uno con uscita a 3v ed uno con uscita a 12v

Dai un lettura qui

Per i mosfet devi aspettare che @Etemenanki possa rispondere.
Io posso dirti che in commercio esistono mosfet con gate molto sensibile che possono essere portati in conduzione piena anche con meno di 3V di gate, ma sigle non ne conosco.

Poi ci sono i driver chip come quello che ho postato.

Ciao.

non posso usare una shield arduino, in primis perché sono su esp32, inoltre perché la board dovrà essere disegnata adhoc a breve per questo chiedevo pochi cablaggi e aggeggi per non dover impazzire nel disegno.

un mosfet a 3 poli sarebbe perfetto

SMD ce ne sono diversi, ad esempio MCU80N03-TP, oppure SiR800DP (puo funzionare gia a 2.5V), o anche FDD9409L (solo massimo una decina di Ampere pilotato a 3.3v, pero') ... in case passante c'e' di meno, ad esempio in TO220, ci sono STP200N3LL (max 30V, per i 12 e' ok, per i 24 siamo al limite, pero' con 3V di gate gia passa i 100A), oppure FDP8440 (max 40V, va bene anche per pilotare roba a 24V, ma costano qualcosa in piu) ... solo come esempi

1 Like

Con mosfet così sensibili c'è da prestare attenzione particolare nei confronti EMI?
Basta la solita R tra gate e GND?

Ciao.

gli ampere non sono un problema, devono pilotare un micro motore da 1700rpm a 3v ed una dosometrica 12v

quindi nel mio caso sono sostanzialmente tutti equivalenti, ne ordino alcuni to220 su Amazon per lo sviluppo e poi li rimpiazzo così come con una versione smd tipo la prima indicata. non dovrei aver problemi

riesco a pilotarli in pwm?

Si, ma devi vedere quanta corrente puo dare in uscita l'ESP32, che mi sembra siano solo 10 o 12 mA in sicurezza.

Pero' se devi pilotarci solo roba che assorbe poco, puoi anche usare mosfet non per alta potenza, che commutano piu velocemente anche con corrente disponibile bassa sulla tensione di gate (il gate e' elettricamente equivalente ad un condensatore, semplificando, quindi avrai una curva di carica e scarica che sara' in proporzione alla corrente disponibile, e piu la capacita' di gate e' bassa, maggiore sara' la velocita' a cui puoi commutarlo in PWM)

Hai dei dati precisi riguardo i motori che devi pilotare, sia come corrente di funzionamento che di stallo ?

Comunque indicativamente, per piccoli carichi potrebbe andarti meglio questo https://www.mouser.it/datasheet/2/308/1/RFD14N05LSM_D-2320017.pdf

@Etemenanki c'è un motorino ridicolo da 3v , tipo questo: https://www.amazon.it/gp/product/B088GMRP26 (non è definitivo, ma si tratterà di roba così piccolina) ed una pompa dosometrica che è a 12v / 0.25a quindi se considero 12v/0.5a sono ben oltre le specifiche.

I vari mosfet visti parlando di svariati ampere, a me ne serve mezzo scarso. Quello che hai suggerito qui sopra sono ben 14A, giusto per farti capire la differenza....
Credo che quindi uno valga l'altro.

Vantaggio non indifferente del tuo è che è disponibile sia TO che SMD, quindi io posso sperimentare con il TO e poi ordinare l'SMD (il probelma è dove trovare un paio di TO a prezzi umani)

Presumo mi serva anche un diodo flyback a protezione del pin su ESP32. La resistenza, che solitamente vedo mettere, non dovrebbe servire, usando i pullup/pulldown interni del controller.

Esistono versioni doppie che si possono pilotare singolarmente con DUE tensioni diverse ? Ad esempio 12v e 3v

Devi mettere una resistenza in serie, fra pin e gate, per limitare i picchi di corrente durante le commutazioni, 330 ohm dovrebbe andare bene, ed una resistenza fra gate e massa per sicurezza, 33K o 47K, valore non critico (non servono come pullup/pulldown, quella in serie limita la corrente, quella fra gate e massa impedisce che il mosfet vada in conduzione quando il pin e' ad alta impedenza all'accensione, o se si scollegasse) ... i 14A dichiarati sono il massimo, e si sceglie con molta piu corrente del necessario per avere una RdsON (resistenza interna) il piu bassa possibile, in modo che causi la minore caduta di tensione possibile sul mosfet (peraltro costano meno di un'euro l'uno, su mouser)

RFD14N05 ad esempio ha una RdsON di circa 0.1 ohm (un po di piu se pilotato a 3.3V, diciamo circa 0.2 ohm "a spanne" ), per mezzo Ampere ti farebbe cadere circa 125mV, che sarebbe accettabile anche sul motore da 3V ... piu sali con la RdsON, piu tensione cade sul mosfet (e quindi meno ne arriva al carico, che potrebbe poi non funzionare correttamente)

Sui pin non servono diodi, se vuoi puoi metterne uno in antiparallelo al motore, ma non e' indispensabile, il mosfet ha gia un diodo di protezione interno

EDIT: a che frequenza hai il PWM ?

Quindi con due RFD14N05 riesco a pilotare entrambi i motori, sia il 12v che il 3v (la gnd sarà in comune tra tutti, esp32 compreso, non dovrebbe essere un problema)

LCSC dice che è fuori produzione (e ne ha solo 5 in stock), strano, perchè il produttore lo da come active. Forse serve una alternativa.

Posso deciderla, la prova più recente l'ho fatta a 10k, ma era giusto una prova.
Con il motorino da 3v non penso di usare PWM, piuttosto accendo e spegno ogni 500ms anzichè farlo girare più lentamente.
Con la pompa invece devo sperimentare, ma al momento non sono in grado di accenderla.

Ho dei ULN2003, potrei usare 2 di loro solo che sprecare 8 porte per ciascun motorino non è il massimo e dubito possa semplificare il cablaggio (servono comunque le resistenze)

Il GND deve essere in comune, altrimenti non funziona ... fino a 10KHz con quei mosfet non dovresti avere problemi, al massimo abbassala.

quindi confermi che mi bastano due RFD14N05 (uno per il motore 3v, uno per il 12v) gnd in comune tra 12v, 3v, esp32, resistenza da 330 tra PIN esp32 e gate (una per ciascun mosfet), resistenza da 47k tra gate e massa (anche questa una per ciascun MOSFET o essendo la massa in comune, va bene una per entrambi?)

leggevo che serve un diodo per evitare che torni indietro tensione dalle bobine cariche quando viene spento il motore, ma se mi dici che non serve, non lo metto.

2 MOSFET, 2 resistenze e fine dei giochi