Arduino resistenze per pulsanti intera o esterna?

Buon dì ragazzuoli da un pò di tempo stò utilizzando arduino e in tutti i manuali che letto, anche se vecchiotti, e utilizzo la tipica resistenza esterna per per comandare un input digitale di ingresso, ho letto che nelle ultime versioni di IDE è possibile utilizzare direttamente la resistenza interna tramite l'apposito codice nel programma, ma il dilemma è: che differenza sostanziale cè tra le due modalità di impiego dei pulsati?

Grazie in anticipo

Che usando quella interna ti risparmi quella esterna, però può essere solo di pull-up. Di conseguenza i tuoi pulsanti saranno HIGH quando NON premuti, e dovranno andare LOW quando li premi.

Se invece metti la resistenza esterna puoi fare il contrario, ma se puoi mettere mano al codice dovrebbe essere facile adattarlo.

Ciao,
Ti rispondo al volo senza entrare troppo nel tecnico.... ma se vuoi su Internet trovi tutte le spiegazioni e gli approfondimenti del caso.
Se devi prototipare al volo puoi tranquillamente usare la resistenza di Pull-Up interna.
Se devi fare qualcosa di "permanente" è meglio (o per lo meno io ormai le faccio tutte così) usare questo schema:

No no a livello di elettronica e di codice faccio tutto da me per cui posso modificare come voglio però da come ho capito se voglio fare un progetto permanente conviene comunque usare quelle esterne da come ho capito

Personalmente io non vedo nessun pro a realizzare un circuito come quello qua sopra, e nemmeno ad utilizzare resistenze esterne piuttosto che interne e anzi, prediligo queste ultime perché mi fanno risparmiare un componente ed il relativo lavoro di assemblaggio.

L'unico pro per le resistenze esterne lo vedo nella possibilità di fare un pull-down, in modo che l'unico consumo di corrente avvenga nei brevi periodi in cui il pulsante è premuto, piuttosto che costantemente, il che immagino possa tornare utile nelle applicazioni in cui il risparmio sui consumi è essenziale (che comunque non è mai il mio caso) se è proprio necessario.

Detto questo, io di elettronica sono tutt'altro che esperto, per cui... :D.

La resitenza pullup interna si puó utilizzare senza problemi anche in circuiti definitivi. Lo svantaggié é che é pullup. Se serve una resistenza pulldown serve aggiungere una resistenza esterna.
La libreria WIRE.h attiva i pullup interni come pullup per il BUS I2C che basta per pochi dispositivi I2C vicinissimi al Arduino. Per piú dispositivi e distanze piú lunge serve aggiungere 2 resistenze pullup esterne per garantire il funzionamento del I2C.

Era sempre possibile tramite IDE atttivare la resistenza pullup interna:

pinMode(pin,INPUT);
digitalWrite(pin,HIGH); //per attivare la resistenza pullup
digitalWrite(pin,LOW); //per disattivare la resistenza pullup

nelle ultime versioni si é aggiunto la possibilitá di attivare la resistenza pullup giá nella funzione pinMode

pinMode(pin,INPUT_PULLUP)

Ciao Uwe

SukkoPera:
Personalmente io non vedo nessun pro a realizzare un circuito come quello qua sopra, e nemmeno ad utilizzare resistenze esterne piuttosto che interne

Confermo, assolutamente inutile usare una pullup esterna salvo rarissimi casi in cui i 20-50 k della pull up interna non siano sufficienti, la resistenza esterna serve solo se è obbligatorio usare una pull down.
Altro dettaglio, la resistenza da 330 ohm con in parallelo il pulsante verso GND non serve a nulla, è solo un componente in più assolutamente inutile, mi sembra tanto di vedere i vecchi schemi di Nuova Elettronica farciti di resistenze e condensatori che servivano solo per fare numero e gonfiare i prezzi dei kit :slight_smile:

SukkoPera:
L'unico pro per le resistenze esterne lo vedo nella possibilità di fare un pull-down, in modo che l'unico consumo di corrente avvenga nei brevi periodi in cui il pulsante è premuto,

Questo vale se vuoi a tutti i costi usare un pullup e il pulsante che diventa HIGH quando lo premi usando un pulsante normalmente chiuso.

Se usi un pullup e hai LOW se premi il pulsante oppure se usi un pulldown, hai HIGH ma in entrambi i casi circola corrente solo nel tempo che premi il pulsante.

Ciao Uwe

Pensandoci... hai ragione! Dimenticavo che l'impedenza di un pin di ingresso è molto alta! :-[

Grazie ragazzi

La resistenza in serie ha senso solo se fai anche il debounce hardware con relativo condensatore ed i pulsanti che usi sono delicati ...

uwefed:
Era sempre possibile tramite IDE atttivare la resistenza pullup interna:

pinMode(pin,INPUT);

digitalWrite(pin,HIGH); //per attivare la resistenza pullup
digitalWrite(pin,LOW); //per disattivare la resistenza pullup




nelle ultime versioni si é aggiunto la possibilitá di attivare la resistenza pullup giá nella funzione pinMode


pinMode(pin,INPUT_PULLUP)




Ciao Uwe

Inoltre ,il secondo metodo funziona su tutti i modelli di Arduino e rende il codice portabile.
Il primo no.

PaoloP:
Inoltre ,il secondo metodo funziona su tutti i modelli di Arduino e rende il codice portabile.
Il primo no.

Su quali non funziona?

Ciao Uwe

Sull'ESP8266, ad esempio, per quanto non sia una piattaforma ufficiale. Non sono nemmeno sicuro che funzioni su Due e compagnia.

prego non confrontare in questo ambito Arduino con il ESP.
Ciao Uwe

Non importa, a livello di astrazione dell'API la questione è semplice. Se faccio:

pinMode (pin, INPUT_PULLUP)

Quello che voglio fare è chiaro, e ogni core può implementare la cosa nel modo corretto. Se invece faccio:

pinMode (pin, INPUT);
digitalWrite (pin, HIGH);

Su AVR farà la stessa cosa, ma solo perché i registri che controllano i pull-up degli input sono gli stessi che controllano il pin quando questo è in output. Tuttavia questa è una caratteristica degli AVR, non è detto che sia così su tutte le MCU, già su ARM non è detto che funzioni (e, come detto, su ESP certamente non funziona), potrebbe tranquillamente esistere un registro dedicato ai pull-up, e un core dovrà fare i salti mortali per gestire la cosa nel modo corretto.

Poi, se magari su una qualche futura MCU un pin darà la possibilità di essere tristate, pulled-up o pulled-down (magari ne esistono già, non ne ho idea), in questo modo la cosa sarà ingestibile, mentre con il precedente tutte le possibilità rimangono aperte e di facile gestione sia lato utente che lato core.

Devo controllare il core della Zero, ma mi pare che li non funzioni.
Sulla Zero funziona ma solo perchè hanno aggiunto un work-around. Ovvero nel caso di digitalWrite si attiva anche la pull'up tramite apposito registro; credo per mantenere una retrocompatibilità col codice.
Comunque la ZERO ha anche un pinmode INPUT_PULLDOWN. :slight_smile:

SukkoPera:
Non importa, a livello di astrazione dell'API la questione è semplice. Se faccio:

pinMode (pin, INPUT_PULLUP)

Quello che voglio fare è chiaro, e ogni core può implementare la cosa nel modo corretto. Se invece faccio:

Indubbiamente l'aggiunta della proprietà "pullup" nella pinMode() rende il codice maggiormente portabile, con la possibilità di aggiungere "pulldown" per i micro che la supportano, sugli ARM i gpio sono decisamente più complessi che sugli AVR e offrono molte scelte per la configurazioni.
Ovviamente nel caso di scelte non compatibili con il micro per cui si sta compilando dovrebbe apparire un errore.

SukkoPera:
...
Poi, se magari su una qualche futura MCU un pin darà la possibilità di essere tristate ...

Rimanendo sul teorico, anche con gli AVR potresti farlo (sta poi a vedere se non interferisce con il funzionamento)

Quello che intendo e' che se setti un pin digitale come output, gli puoi dare solo HIGH o LOW, ma se ti serve anche il tristate, nello sketch gli cambi modalita' "al volo" da output ad input, e te lo ritrovi ad alta impedenza, quindi virtualmente tristate :wink:

EDIT: e se poi la tua circuiteria richiede per forza la condizione "mezza VCC", come alcuni dei dispositivi attuali, puoi sempre mettere sul pin un partitore con due resistenze da, esempio, 22K, fra VCC e GND, centrale al pin, cosi quando lo setti come input, invece che alta impedenza hai 1/2VCC (mentre quando e' come output, quei valori non influiscono :D)

Etemenanki:
Quello che intendo e' che se setti un pin digitale come output, gli puoi dare solo HIGH o LOW, ma se ti serve anche il tristate, nello sketch gli cambi modalita' "al volo" da output ad input, e te lo ritrovi ad alta impedenza, quindi virtualmente tristate :wink:

Nulla da dire, mi capita anche frequentemente di farlo, ma io mi riferivo a usarlo come input! Quello che voglio dire è che prima dell'introduzione di INPUT_PULLUP, si poteva solo fare:

Input normale (o Pseudo-tristate):

pinMode (pin, INPUT);
digitalWrite (pin, LOW);  // Opzionale/Sottointeso

Pull-up:

pinMode (pin, INPUT);
digitalWrite (pin, HIGH);

Un eventuale pull-down (integrato nell'hardware, come quello della Zero di cui parla Paolo) non si sarebbe potuto configurare in nessun modo!

Sulla Zero funziona ma solo perchè hanno aggiunto un work-around. Ovvero nel caso di digitalWrite si attiva anche la pull'up tramite apposito registro; credo per mantenere una retrocompatibilità col codice.

Ecco appunto i "salti mortali" a cui alludevo prima, tutto codice che va a rallentare ulteriormente la già lumacosa digitalWrite(). Personalmente avrei preferito che emettessero un errore invitando a passare alla nuova sintassi (anche perché non ho mai visto il vecchio modo di attivare i pull-up utilizzato in nessuno sketch "reale", quindi immagino che sia già passato un po' di tempo dalla sua introduzione), ma vabbeh.