Digital I/O - Button

Buon giorno a tutti, scrivo qui perché ho già cercato e non ho trovato, sto cercando di capire il funzionamento del pulsante, l'esempio che sto facendo è questo:

Ninte di difficile infatti funziona tutto, la cosa che non capisco è il motivo per cui bisogna inserire il resistore, mi spiego meglio, senza il resistore premo il pulsante, chiudo il circuito e mando il segnale di input, quando rilascio il pulsante il segnale non passa più quindi dovrebbe andare in low ma questo non succede.

Ovviamente dalla domanda si capisce che non ho basi di elettronica.

Vi ringrazio,

Juri

La resistenza serve appunto per mandare in low l'ingresso, si chiama pull-down

è una resistenza di pull down e serve per rendere insensibile il pin di arduino ai disturbi elettromagnetici.

spiegazione R pull down

Quindi una volta che rilascio il pulsante si crea un circuito tra la porta di input e ground che manda in low il segnale?

Io mi rifaccio al ragionamento di un interruttore con lampadina, quando chiudo il circuito la lampadina si accende e quando lo apro si spegne, però in questo caso ho fase e neutro, in arduino c'é fase e terra, faccio fatica a capire il funzionamento fisico.

Ho letto un altro forum, non posto il link per non fare spam, però fa un ragionamento più terra terra rispetto wikipedia.

In pratica il mio problema è che intendevo il led 13 collegato in qualche modo al pulsante, ma di fatto non lo è, il led 13 viene alimentato da arduino, quindi lasciando perdere il led 13 il ragionamento bisogna farlo tra:

  • la fase (5V);
  • il pulsante (bottone);
  • il pin di input;
  • il resistore;
  • la terra.

Dove quando chiudo il circuito la corrente (correggetemi se sbaglio termini) transita più facilmente verso il pin di input che andare verso il resistore e quando apro il circuito dovrebbe crearsi una differenza di tensione tra il pin di input e ground, quindi il resistore serve perchè se non ci fosse quando chiudo il circuito al posto di andare al pin di input la corrente andrebbe al ground.

E' corretto come ragionamento?

sì, è +o- questo il ragionamento :slight_smile:

Grazie infinite, ho riscritto in modo più chiaro (spero) , il mio ragionamento in modo che anche altri possano magari beneficiarne.

La mia domanda adesso è questa, perché il pin di input non ragiona come una lampadina e non percepisce che ho tolto la tensione?

Le risposte dovrebbero essere due:

  1. perché non è una lampadina;
  2. perché é circuito ad alta impedenza.

mr_j:
Grazie infinite, ho riscritto in modo più chiaro (spero) , il mio ragionamento in modo che anche altri possano magari beneficiarne.

La mia domanda adesso è questa, perché il pin di input non ragiona come una lampadina e non percepisce che ho tolto la tensione?

sono due cose completamente differenti, la lampadina ha un polo collegato al neutro (in genere) e l'altro alla fase tramite interruttore, se chiudi il circuito il filamento diventa incandescente e vedi la luce, se lo apri non scorre più corrente e la lampadina si spegne.
il Pin di Arduino settato come ingresso NON è un carico come la lampadina ma un circuito ad alta impedenza, e come tale ha sempre bisogno di un riferimento certo, allora tu metti una R da 10K verso GND per mantenerlo costantemente riferito a LOW, quando premi il pulsante, il potenziale si sposta su HIGH, in quanto colleghi direttamente i 5V al pin. Il metodo può funzionare anche all'opposto: una R verso 5V (in questo caso si chiama pull-up) ed il pulsante che chiude a GND, in questo caso la logica si inverte ma il funzionamento è identico.

Immagina una lampadina efficientissima la quale trasforma una debole corrente in emissione fotonica, questa lampadina emetterebbe comunque fotoni anche scollegata a causa del disturbo elettromagnetico.

Ad esempio se provi un led con il tester il led si accende se fai la stessa prova con una lampadina questa non si accende.

Quindi puoi immaginarla come una lampadina super efficiente (non esiste ancora) e quindi per spegnerla devi cortocircitare con una R di valore sufficientemente basso da impedire che all'interno circoli una corrente sufficiente per farla ancora accendere.

Ciao.

Ho fatto la prova con il led e si accende XD

Però non capisco come il pin di input riesce a capire che ho cortocircuitato il circuito, ha un nome "l'interrutore / pin" di arduino?

mr_j:
Però non capisco come il pin di input riesce a capire che ho cortocircuitato il circuito,........

Ti consiglio di leggere qualcosa per farti le basi di elettrotecnica ed elettronica! Parli di corrente quando si tratta di tensione, pin che 'capiscono'.... senza offesa....

No figurati nessuna offesa, oggi guardo se trovo qualcosa per chi è alle prime armi.

Vi ringrazio ancora, buon lavoro a tutti.

Juri

Però non capisco come il pin di input riesce a capire che ho cortocircuitato il circuito, ha un nome "l'interrutore / pin" di arduino?

Si decisamente ti serve una base di elettronica, principalmente perchè io non ho capito la tua domanda.
Non capisci come una porta logica "capisce" lo stato al suo ingresso?

In effetti la porta non capisce ma si comporta in base alla propria logica, dipende se è una "not", "or", "and" ecc.

Il button può essere connesso in due modi, in entrambe è necessario fornire dei livelli di tensione specificati nel datasheet del microcontroller per avere la certezza che vengano interpretati come 1 o 0 logico. Lasciare una porta scollegata equivale a non
definire un livello logico certo, per cui quella porta è soggetta a quello che per noi è un disturbo elettromagnetico ma per la porta sono segnali. Quindi noi dobbiamo trovare il modo per evitare che i disturbi influenzino lo stato della porta.

Una porta può avere solo due stati logici corrispondenti a delle soglie di tensione specificare nel datasheet, se forniamo un livello
di tensione fuori dalle soglie min e max si dice che lo stato della porta è incerto o non definito.

Parti da qui : Tensione elettrica - Wikipedia

Ciao.

Sicuramente devo farmi una base di elettronica, comunque cerco di definire meglio la mia domanda:

Nel mio esempio ho usato il pin numero 6 come pin di input il quale percepisce (almeno dal codice scritto "if(pin == HIGH)") se riceve o meno tensione, al lato pratico devo cortocircuitare dal pin 6 alla terra per far diventare low il segnale al pin numero 6, quindi la mia domanda è, come fa il pin 6 and andare in low ? Il pin 6 è in input ma nel momento in cui corto circuito va in output verso terra e diventa low.

Ho capito che funzionare funziona, ma non come fa, sicuramente con una base di elettronica vado a sopperire a queste lacune, comunque ho cercato di riformulare la domanda in modo che possa essere compresa meglio (spero).

Grazie ancora.

mr_j:
Sicuramente devo farmi una base di elettronica, comunque cerco di definire meglio la mia domanda:

Nel mio esempio ho usato il pin numero 6 come pin di input il quale percepisce (almeno dal codice scritto "if(pin == HIGH)") se riceve o meno tensione, al lato pratico devo cortocircuitare dal pin 6 alla terra per far diventare low il segnale al pin numero 6, quindi la mia domanda è, come fa il pin 6 and andare in low ? Il pin 6 è in input ma nel momento in cui corto circuito va in output verso terra e diventa low.

Ho capito che funzionare funziona, ma non come fa, sicuramente con una base di elettronica vado a sopperire a queste lacune, comunque ho cercato di riformulare la domanda in modo che possa essere compresa meglio (spero).

Grazie ancora.

No, così non va, inutile che continui a dire che devi farti le basi di elettronica e poi continuare a porre domande in questo modo.
Vai nella sezione italiana del Playground, ci sono 6-7 mini guide (10 pagine in tutto saranno...) che spiegano benino i fondamenti, poi ti accorgerai tu stesso che è incomprensibile ciò che chiedi e che comunque le risposte ti sono già state date ma ti sfuggono principi base indispensabili per capirle.
O se non vuoi studiare, visto che nessuno può obbligarti, almeno accontentati di veder funzionare le cose senza volerle capire a tutti i costi :wink:

No, no, voglio studiarle, mi dispiace sia passato che non voglia studiare.

La mia specificazione e ripetizione della domanda era solo per cercare di farla capire meglio.

Grazie per il consiglio del playground della sezione italiana.

Salve di nuovo a tutti, ho studiato... Effettivamente ho ricevuto le risposte, però voglio comunque portare a termine il mio ragionamento per sapere se ho capito correttamente il funzionamento.

Il ragionamento dovrebbe essere questo:

Quando premo il pulsante alimento con una tensione di 5V la porta logica di arduino che essendo una porta logica per l'appunto può ricevere solo tensine di 5V o 0V per restituire il giusto segnale, e quindi deve avere una tensione certa, tutto quello che sta in mezzo lo percepisce come rumore, o meglio dovrebbe percepirlo come HIGH perché una porta logica ha delle soglie che vanno da 5V a 1,5V cioè HIGHT e da 1,5V a 0V cioè LOW, così rilasciando il pulsante la porta logica non restituisce LOW ma sempre HIGH, questo perché il circuito (arduino) può creare della tensione indotta oppure perché è alimentato, così si utilizza la resistenza pull (che può essere up o down in base alla posizione nel circuito) la quale porta (tira) la tensione a 0V in modo che la porta logica possa restituire LOW.

Sbaglio?

Ciao, le cose sono due: o ti fermi a livello di banale logica 1/0 oppure devi studiare elettronica seriamente se vuoi comprendere certi meccanismi. Il ragionamento è semplicissimo, sei tu che ti vuoi complicare la vita inutilmente.
Immagina che Arduino non esista e la cosa diventa moooolto più semplice: metti un tester in portata Volt nel punto in cui "prima c'era il pin di Arduino" e verifica ciò che succede. Se il pusante NON è premuto tu non trovi alcuna tensione = 0V (LOW); se premi il pulsante rilevi 5V (HIGH) perché li porta il contatto del pulsante.
Ora rimetti a posto Arduino e lo usi come tester: nel primo caso Arduino legge LOW, nel secondo caso legge HIGH.
Quindi resta da chiarire perché serve la pull-down. Il pin di Arduino ha un'impedenza molto elevata, di conseguenza ha bisogno di riferimenti certi per leggere HIGH o LOW; nel tuo caso HIGH è certo perché col pulsante tu porti direttamente i 5V sul pin, mentre la sola assenza dei 5V lui NON riesce ad interpretarla come presenza di GND, perché la sua alta impedenza gli impedisce di farlo. Allora tu metti una resistenza da 10K (è un valore usato comunemente, senza particolari calcoli) tra il pin e GND; questa resistenza permette ad Arduino di vedere un potenziale molto prossimo a GND e quindi lui finalmente lo può intepretare come LOW. In queste condizioni, quando premi il pulsante i 5V che arrivano sul pin di Arduino sono separati da GND tramite la resistenza da 10K, quindi è come se in quel momento il pin ricevesse sia 5V che GND, ma mentre GND è separato da 10k di resistenza, 5V è diretto e quindi il pin riceve un potenziale positivo molto forte, il massimo possibile, che "vince" su quello negativo, e quindi vede HIGH.
Io meglio di così non posso fare, per andare oltre devi cominciare a capire quali sono i componenti interni che costituiscono il pin di Arduino, come essi vengono pilotati internamente per essere impostati come ingresso o uscita, il gioco delle correnti in base alle differenze di potenziale. Ma tutto ciò richiede una conoscenza dell'elettronica che, per quanto mi riguarda, va ben oltre le mie misere conoscenze.

Prima di arrivare a comprendere le porte logiche, dovresti prenderti i diodi (giunzioni P-N drogaggi del silicio) capirne il funzionamento direzioni delle correnti dirette e inverse, poi passi ai transistor (giunzioni PNP NPN) e studia anche quelli, i chip con porte logiche sono milioni di transistors e diodi molto ma molto piccoli, ecco racchiusa l'elettronica digitale :slight_smile: .
Se tu osservi le basi dei transistor in tutti i circuiti essi hanno sempre un riferimento verso + o GND per polarizzare la base (che rappresenterebbe un input con una resistenza pull-up se a +, pull-down se a gnd), il collettore ed emettittore possono essere paragonati a un "interruttore", ma pilotato dalla base che lasciato libero a penzoloni diventerebbe instabile e sensibile a qualsiasi disturbo persino se lo tocchi con un dito . Dimentica i paragoni con l'elettrotecnica che non centra nulla
ciao

Michele come l'hai spiegato tu è molto meglio di come l'ho scritto io ma il ragionamento non è uguale?

Quello che mi confonde è il termine "alta impendeza" cioè la tendenza di un circuito a opporsi al passaggio di una corrente elettrica alternata, e in questo caso arduino è in continua, così ho cercato e ho trovato che il digitale è la restituzione di 0 e 1 generato da uno (o più) transistor (che in base a come sono connessi creano una porta digitale AND, OR, XOR, ecc..) e che devono avere un tensione alta o bassa comunque certa per restituire il giusto segnale/dato 0 o 1.

Da qui viene fuori il mio ragionamento sul pin di arduino che ha bisogno di un riferimento certo, e con riferimento certo si intende una tensione certa.

Può anche non essere arduino ma un circuito dove i propri percorsi possono indurre una tensione e generare disturbi, così si usano i pull-down / up per dare un segnale certo al pin