HOWTO · Arduino

Resistenza di pull down di Arduino

Scopri come collegare una resistenza pull-down e un interruttore su Arduino, scegliere un valore di resistenza e leggere l'ingresso in uno sketch.

In questa pagina

Per collegare una resistenza pull-down a un Arduino, collega una resistenza tra il nodo dell’ingresso digitale e GND, quindi collega un interruttore tra quel nodo e una tensione di alimentazione compatibile con il pin di ingresso della scheda. Con l’interruttore aperto, l’ingresso legge LOW; quando è chiuso, legge HIGH. Usa 5V solo se l’ingresso della scheda tollera 5V; per un ingresso che supporta solo 3,3V, usa un’alimentazione compatibile da 3,3V. Questa guida illustra il cablaggio, la scelta della resistenza e il codice per leggere l’interruttore.

Perché serve una resistenza pull-down

Un ingresso del microcontrollore assorbe pochissima corrente. Se un interruttore lascia l’ingresso scollegato, il rumore elettrico può modificarne la tensione e causare letture imprevedibili: si parla di ingresso flottante. Quando l’interruttore è aperto, una resistenza pull-down collega l’ingresso a GND e lo mantiene a LOW. Chiudendo l’interruttore, lo stesso nodo dell’ingresso viene collegato all’alimentazione della scheda, quindi il pin legge HIGH.

Collegare una resistenza pull-down esterna a un ingresso digitale

Realizza il circuito in modo che il pin di ingresso, un terminale dell’interruttore e un terminale della resistenza si incontrino in un unico nodo:

  1. Scegli una tensione di alimentazione che il pin di ingresso della scheda possa accettare in sicurezza. Collega a questa alimentazione un terminale di un pulsante o di un interruttore. Usa il pin 5V della scheda solo se l’ingresso tollera 5V; se l’ingresso supporta solo 3,3V, usa un’alimentazione compatibile da 3,3V.
  2. Collega l’altro terminale dell’interruttore al pin digitale 2. Questo è il nodo dell’ingresso.
  3. Collega una resistenza tra quel nodo e GND.

L’articolo di partenza indica da 1 kΩ a 100 kΩ come intervallo iniziale. Il valore adatto dipende dalla scheda e dal circuito: controlla le specifiche elettriche della scheda e considera i requisiti di rumore e corrente. Una resistenza di valore troppo basso può far circolare una corrente eccessiva nell’interruttore quando viene chiuso. La resistenza va collegata tra il nodo dell’ingresso e GND; non collegare direttamente l’alimentazione a GND. Nel diagramma qui sotto, l’etichetta +5V vale solo se l’ingresso della scheda tollera 5V. In caso contrario, usa un’alimentazione compatibile con la scheda per quel collegamento dell’interruttore.

Circuit diagram showing a switch from a board-compatible supply to the input junction and a pull-down resistor from the junction to GND; the diagram’s +5V label is for 5V-tolerant inputs only

Leggere l’interruttore in uno sketch Arduino

Imposta la modalità del pin su INPUT e leggi l’interruttore con digitalRead. Questo sketch completo stampa un messaggio per ciascuno stato dell’interruttore. La piccola sezione di compatibilità permette di compilare lo stesso sorgente come dimostrazione eseguita sull’host; nell’IDE Arduino, il core della scheda fornisce questi nomi e l’IDE fornisce il punto di ingresso del programma. La dimostrazione sull’host usa una lettura HIGH fissa, quindi la riga stampata illustra il ramo dell’interruttore chiuso; non verifica l’hardware. Il messaggio visibile della dimostrazione resta in inglese, perché il codice di esempio è mantenuto invariato.

#ifndef ARDUINO
#include <iostream>
constexpr int INPUT = 0;
constexpr int LOW = 0;
constexpr int HIGH = 1;
struct SerialPort {
  void begin(long) {}
  void println(const char* message) { std::cout << message << '\n'; }
} Serial;
void pinMode(int, int) {}
int digitalRead(int) { return HIGH; }
void delay(unsigned long) {}
#endif

const int switchPin = 2;

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

void loop() {
  int switchState = digitalRead(switchPin);
  if (switchState == HIGH) {
    Serial.println("Switch closed");
  } else {
    Serial.println("Switch open");
  }
  delay(200);
}

#ifndef ARDUINO
int main() {
  setup();
  loop();
}
#endif
Switch closed

Con la resistenza pull-down esterna collegata come descritto, digitalRead restituisce LOW quando l’interruttore è aperto e HIGH quando è chiuso. Inserisci l’azione per ciascuno stato nel ramo corrispondente. Per altre condizioni, consulta l’istruzione if di Arduino. Se lo sketch deve attendere un’azione dell’utente, consulta Come attendere un input in Arduino.

Usare un ingresso analogico con una resistenza pull-down esterna

Puoi collegare lo stesso circuito a un ingresso analogico, per esempio A0, invece che a un pin digitale. Mantieni la resistenza tra il nodo dell’ingresso e GND e collega l’interruttore tra quel nodo e una tensione compatibile con l’ingresso analogico. Usa 5V solo se quell’ingresso tollera 5V. Con l’interruttore aperto, la lettura analogica è vicina all’estremo corrispondente a GND; quando l’interruttore si chiude, sale verso il valore corrispondente all’alimentazione della scheda. I valori esatti dipendono dal convertitore analogico-digitale della scheda e dalla tensione di riferimento.

In uno sketch Arduino, leggi il pin con analogRead e confronta il risultato con una soglia scelta in base alla scheda e al circuito. Per esempio, la condizione reading >= threshold indica che l’interruttore è chiuso quando collega il nodo all’alimentazione. Scegli la soglia sulla base di misurazioni: un valore come 512 non è adatto a tutte le configurazioni. Questo esempio analogico dipende dalla scheda e non è incluso nella dimostrazione sull’host descritta sopra.

Usare il pull-up interno come alternativa

Il pull-up interno è un circuito alternativo, non una resistenza pull-down esterna. Utilizza la resistenza integrata nel microcontrollore. Collega l’interruttore tra l’ingresso digitale e GND, quindi configura il pin con INPUT_PULLUP. Con l’interruttore aperto si legge HIGH; premendolo, il pin viene collegato a GND e si legge LOW: la logica è quindi inversa rispetto al circuito con pull-down esterna.

Nello sketch Arduino, usa pinMode(switchPin, INPUT_PULLUP) e considera digitalRead(switchPin) == LOW come lo stato premuto. Questo comportamento dipende dal core Arduino e dal cablaggio fisico, quindi non è rappresentato dalla dimostrazione sull’host descritta sopra.