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?
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
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
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.
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.
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
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
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:
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.