[Problema] Porte digitali

Ciao a tutti, provando a fare un semplice test delle porte digitali (in questo caso la 2 e la 3), stampando a monitor il risultato, vedo che i risultati alternano da 0 a 1 .. Se mando a massa rimangono 0 , ma poi come tolgo il jumper da massa, mi passa a uno poi a zero e così via... Stessa cosa se passo da 5V .. Ecco lo sketch

void setup(){ 
  
Serial.begin(9600);
pinMode(2,INPUT);
pinMode(3,INPUT);
  }

void loop(){
 
int porta1 = digitalRead(2);
int porta2 = digitalRead(3);

Serial.print("1 ");
Serial.println(porta1);
Serial.print("2 ");
Serial.println(porta2);
 delay(350); 
}

Non vorrei si fosse danneggiato l'arduino.. Grazie mille!

Le porte in ingresso di Arduino sono ad alta impedenza e ... NON devono essere lasciate libere o ... "captano anche il volare di una mosca".

Due possibilità ...

  1. ... resistenza esterna da 10K o verso massa (pull-down) o vero Vcc (pull-up) in dipendenza poi come fai i test perché il pin sarà normalmente LOW o HIGH.

  2. ... utilizzare le pull-up presenti internamente ed attivabili con l'opportuna pinMode() :

pinMode(pin, INPUT_PULLUP);

... come descritto nel reference !

Guglielmo

P.S. : Argomento già trattato un'infinità di volte ... imparate ad usare il SEARCH !!! ]:smiley:

Ciao! Grazie mille della risposta.. Hai ragione, ma a volte è difficile sapere cosa cercare! Non ho trovato risultati.. Comunuqe, leggendo il reference , ho letto che passando a pinMode , INPUT_PULLUP , esegue un ! (not) al valore in ingresso.. Ora sembrerebbe funzionare, cioè quando immetto un valore 'HIGH' mi dice 0 quando è LOW mi dice 1... E i valori restano stabili in attesa di variazioni.. Ma come mai ciò non lo posso fare normalmente?? Inoltre non ho capito da dove partire la resistenza da 10kOhm per utilizzare l'altro metodo.. Grazie!

Questa mi è nuova :astonished:
Quando attivi la pull-up interna (che poi è la stessa cosa che metterne fisicamente una esterna...) il pin viene fissato stabilmente su HIGH; quindi esternamente puoi fare soltanto due cose:
1 - collegarlo a GND e quindi l'ingresso viene letto come LOW;
2 - lasciarlo libero e quindi l'ingresso viene letto come HIGH.

ho letto che passando a pinMode , INPUT_PULLUP , esegue un ! (not) al valore in ingresso

Questa e' una interpretazione tutta tua.

Il Reference dice tutta un'altra cosa...................
ma vedo che Michele ti ha gia' risposto

alessandroAmedei:
Ciao! Grazie mille della risposta.. Hai ragione, ma a volte è difficile sapere cosa cercare! Non ho trovato risultati.. Comunuqe, leggendo il reference , ho letto che passando a pinMode , INPUT_PULLUP , esegue un ! (not) al valore in ingresso.. Ora sembrerebbe funzionare, cioè quando immetto un valore 'HIGH' mi dice 0 quando è LOW mi dice 1... E i valori restano stabili in attesa di variazioni.. Ma come mai ciò non lo posso fare normalmente?? Inoltre non ho capito da dove partire la resistenza da 10kOhm per utilizzare l'altro metodo.. Grazie!

Se colleghi un pulsante tra entrata Arduino e messa e attivi la resistenza pullup:
Tasto premuto leggi LOW
Tasto non premuto leggi HIGH.
La funzione del tasto viene teoreticamente "negato".

Questo non vale per altri collegamenti o altri dispositivi collegati al pin di ingresso. È da verificare volta in volta.
Ciao Uwe

alessandroAmedei:
Ciao! Grazie mille della risposta.. Hai ragione, ma a volte è difficile sapere cosa cercare! Non ho trovato risultati.. Comunuqe, leggendo il reference , ho letto che passando a pinMode , INPUT_PULLUP , esegue un ! (not) al valore in ingresso.. Ora sembrerebbe funzionare, cioè quando immetto un valore 'HIGH' mi dice 0 quando è LOW mi dice 1... E i valori restano stabili in attesa di variazioni.. Ma come mai ciò non lo posso fare normalmente?? Inoltre non ho capito da dove partire la resistenza da 10kOhm per utilizzare l'altro metodo.. Grazie!

Questo è il pezzo che credo ti abbia creato confusione:

Pins Configured as INPUT_PULLUP

The Atmega chip on the Arduino has internal pull-up resistors (resistors that connect to power internally) that you can access. If you prefer to use these instead of external pull-down resistors, you can use the INPUT_PULLUP argument in pinMode(). This effectively inverts the behavior, where HIGH means the sensor is off, and LOW means the sensor is on. See the Input Pullup Serial tutorial for an example of this in use.

Intanto si parla di "stato" di un sensore e non di un segnale letto, e poi tutto il discorso è riferito alla logica di funzionamento dove appunto si dice che le pull-up interne possono sostituire le pull-down esterne. Ovviamente una pull-up tiene il pin libero sullo stato alto mentre una pull-down lo tiene sullo stato basso. In questo la logica è invertita, e penso che sia ciò che ti ha confuso.

Ok ragazzi perfetto!! Grazie mille a tutti! Si Leonardo mi aveva confuso quella parte li.. Comunque io preferisco mettere un resistore da 10KOhm a massa.. In modo che mi legga sempre 0 .. Dovrebbero mettere una sorta di PULL_DOWN interna!!! Grazie ancora :wink:

Ultima cosa.. Vale anche per le analogiche giusto?

Il discorso è più complesso. Con quelle si misura un segnale analogico appunto, che può variare da 0 a +5V. SCon una pull-up o una pull-down dai sì uno stato definito ma questo stato potrebbe alterarti la lettura.