Salve ragazzi mi sto da qualche giorno avvicinando al mondo di arduino e immagino tutti saprete che i primi esperimenti si fanno con led e pulsanti vari. Fino ad ora non ho avuto alcun problema nell'esecuzione di tutti gli esercizi proposti in rete però ancora (anche dopo essermi documentato) non riesco a spiegarmi della famosa resistenza di 10kohm messa tra il pulsante e la massa...
Mi spiego meglio, ho questo semplicissimo circuito:
non riesco a capire il perché tra il pulsante e la massa devo mettere il resistore da 10kohm, leggendo un po mi si parla di resistenze di pull-up ma non riesco a capire bene il concetto. Chiedo a voi di darmi delucidazioni in merito e vedere di capire bene.
In oltre vedo molti schemi dove viene inserito direttamente il led rosso tra la massa (GND) e il pin 13 sull'arduino, è possibile farlo? dato che la tensione di uscita dei pin digitali è di 5v non andrebbe messo un resistore per evitare di bruciare il led?
Ciao, provo, per quanto sia nelle mie capacità, a spiegartelo io. La resistenza di pull-up o di pull-down (come nel tuo esempio) serve per tenere l'ingresso di arduino ad uno stato logico ben preciso quando il pulsante si trova col contatto aperto. Se non si portasse l'ingresso verso "ground" questo risulterebbe "flottante" e percepirebbe vari segnali che in alcuni casi scambierebbe come se venisse premuto il pulsante, quindi vedresti accendersi e spegnersi il led in maniera casuale.
Ovviamente non si può portare l'ingresso direttamente a massa, perché nel momento in cui si preme realmente il pulsante si avrebbe un bel corto-circuito, per questo motivo si interpone una resistenza, di solito da 10k.
Spero di essere stato utile, inoltre ti consiglio di leggerti questa pagina: Resistenza pull-up - Wikipedia.
sarebbe la stessa cosa di forzare nel setup scrivendo:
pinMode(pinIn, INPUT);
digitalWrite(pinIn, HIGH);
??
comunque diciamo che come si usa (se non ho detto castronerie sopra) dovrei averlo capito...
Ma rimane il fatto che non riesco ancora bene ad afferrare il concetto... Cioè se io non prendessi queste accortezze cosa può succedere?
Infine (mi quoto da solo XD) volevo questo chiarimento:
TheDarkMan:
In oltre vedo molti schemi dove viene inserito direttamente il led rosso tra la massa (GND) e il pin 13 sull'arduino, è possibile farlo? dato che la tensione di uscita dei pin digitali è di 5v non andrebbe messo un resistore per evitare di bruciare il led?
Mi pare di ricordare che su una scheda Arduino in particolare il pin 13 fosse dotato di resistenza interna e quindi si può evitare di usare quella esterna, ma ciò vale solo per il pin 13 e quella particolare scheda.
Nel dubbio puoi scaricare lo schema teorico della tua scheda e analizzarlo.
In ogni caso una resistenza aggiuntiva fa accendere comunque il led e non compromette i fini didattici,
nel caso di un ATmega montato standalone la resistenza ci va sempre.
Credo di aver compreso l'uso della resistenza... In pratica sarebbe un utilizzatore per evitare che il circuito vada in corto?
ora noto che utilizzando la resistenza interna ad arduino però l'effetto è opposto, mi spiego ho fatto questo sketch:
int led = 13;
int bottone = 7;
int stato = 0;
void setup() {
pinMode(led, OUTPUT);
pinMode(bottone, INPUT);
}
void loop() {
stato = digitalRead(bottone);
if (stato == HIGH) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW);
}
}
E con la resistenza da 10kohm con lo schema mostrato sopra va tutto perfettamente, cioè il led è spento e se pigio il bottone il led si accende.
Se volessi usare la resistenza interna quindi definendo:
pinMode(bottone, INPUT_PULLUP);
uso questo schema
ma l'effetto è contrario, ovvero il led è sempre acceso e se pigio il bottone si spegne, dunque l'equivalente sarebbe modificando il loop in questo modo?:
void loop() {
stato = digitalRead(bottone);
if (stato == HIGH) {
digitalWrite(led, LOW);
}
else {
digitalWrite(led, HIGH);
}
}
MauroTec:
Mi pare di ricordare che su una scheda Arduino in particolare il pin 13 fosse dotato di resistenza interna e quindi si può evitare di usare quella esterna, ma ciò vale solo per il pin 13 e quella particolare scheda.
Se non ricordo male su arduino uno solo il pin 13 è dotato di una resistenza da 1k.
TheDarkMan:
Ma rimane il fatto che non riesco ancora bene ad afferrare il concetto... Cioè se io non prendessi queste accortezze cosa può succedere?
Tornando al tuo schema (il primo), nel momento in cui premi il pulsante porti al pin 7 il valore logico 1 (5V), questo fa accadere qualcosa, a seconda dello sketch caricato. Quando rilasci il pulsante il valore logico al pin 7 è 0 (0V) perché colleghi a quel pin la massa tramite una resistenza denominata di pull-down (ovvero forzi il valore logico 0), anche in questo caso a seconda dello sketch caricato si ha una conseguenza sul circuito. Se tu non forzassi questo 0 logico ai capi del pin non avresti una tensione di 0V ma delle tensioni variabili, e queste potrebbero essere interpretare da arduino come se avvenisse una pressione del pulsante che in realtà non c'è.
Se leggi sul link che ti ho postato prima trovi una spiegazione sicuramente più esauriente.
TheDarkMan:
quindi col loop impostato così sarebbe corretto?
void loop() {
stato = digitalRead(bottone);
if (stato == HIGH) {
digitalWrite(led, LOW);
}
else {
digitalWrite(led, HIGH);
}
}
Se vuoi accendere il led ad ogni pressione del pulsante va bene (col secondo schema) però io normalmente non utilizzo le resistenze interne, non so è una mia fissa, magari qualche utente più esperto può spiegare meglio se è preferibile utilizzare un metodo piuttosto che l'altro!!
ogni suggerimento e ben accetto :), se qualcuno ha un metodo efficacie per simulare un normale interruttore sono lieto di leggerlo, mi sarebbe di grande aiuto