Componente · Sensore

Microswitch a leva

Il microswitch a leva è il sensore di contatto del paraurti di un robot. Scopri il cablaggio sicuro, i nove fronti di una pressione e il ruolo del braccio.

Che cos’è

Un microswitch a leva — un interruttore miniaturizzato a scatto — è un contatto meccanico in un piccolo corpo di plastica dal quale sporge una leva metallica. Premi la leva e una molla interna fa scattare il contatto; rilasci e la molla lo riporta indietro. È uno dei componenti più antichi di questa libreria e, su un robot, uno dei più utili.

A renderlo un componente robotico è l’azione a scatto. Il contatto non si chiude gradualmente mentre premi: scatta, in un punto ripetibile, con un clic udibile. Così ottieni una risposta netta sì/no da un meccanismo spinto da un robot in movimento, proprio la situazione in cui un sensore graduale dà nonsenso.

Due grafici sovrapposti. Quello superiore mostra il segnale di un interruttore per circa sei millisecondi: il pin grezzo scende a livello basso, poi vibra tra alto e basso nove volte in 4.7 millisecondi prima di stabilizzarsi basso, mentre l'uscita filtrata resta alta finché la finestra non scade e poi scende in modo pulito. Il grafico inferiore mostra il numero di fronti che un interrupt conterebbe, scendendo a gradini da nove a uno mentre la finestra di eliminazione del rimbalzo aumenta da zero a otto millisecondi, raggiungendo uno a 4.7 millisecondi.
L'unica cosa da sapere su questo componente: una singola pressione produce nove transizioni in circa 4.7 ms. Una finestra più breve del rimbalzo conta il rimbalzo; una finestra abbastanza lunga da stabilizzarlo costa esattamente la propria durata in latenza. Scarica SVG

Come funziona

Tre terminali: COM (comune), NO (normalmente aperto) e NC (normalmente chiuso). Senza pressione, COM è collegato a NC. Premendo, scatta su NO. Usi due dei tre e ignori l’altro.

Per un paraurti robotico, collega COM a massa e NO al pin di ingresso, con il pull-up interno del pin attivo:

pinMode(BUMP_L, INPUT_PULLUP);              // idle HIGH
bool pressed = digitalRead(BUMP_L) == LOW;  // LOW means the bumper moved

Questa configurazione è sicura in caso di guasto: un filo del paraurti rotto viene letto HIGH, cioè non premuto. Collegandolo al contrario, un filo spezzato convince il robot che è in collisione permanente. Per un arresto di emergenza usa invece NC: in quel caso un filo rotto dovrebbe fermare la macchina.

La leva scambia forza con corsa. Il puntalone nudo vuole circa 1 N su circa 1 mm; il braccio della leva moltiplica il movimento, così la scocca del paraurti può spostarsi di 3–5 mm e attivarsi con una pressione molto più leggera. Un rullo all’estremità riduce l’attrito quando qualcosa scorre sopra anziché premere direttamente.

Quando usarlo

Usane uno ovunque il robot debba sapere di aver già toccato qualcosa: paraurti, finecorsa di un braccio o di una slitta, sensore di coperchio o cassetto, oppure rivelatore di aggancio. È la sensazione di ultima istanza, ed è un complimento: cattura la gamba nera di una sedia, il vetro e l’ostacolo all’altezza sbagliata che ogni sensore ottico e acustico manca.

È anche l’unica sensazione necessaria a un robot di copertura con rimbalzi casuali. Due di questi e un generatore di numeri casuali coprono un’intera stanza: una quantità notevole di comportamento a fronte di sole due parti mobili.

Cerca altrove quando devi evitare la collisione anziché rilevarla: è questo il compito di un sensore ultrasonico o a tempo di volo. Puoi usare entrambi: il sensore di distanza evita la maggior parte degli ostacoli e l’interruttore cattura quelli che non vede.

Trappole comuni

  • Una pressione è nove fronti. Elimina il rimbalzo e non collegare mai un interrupt che conta: deve soltanto impostare un flag o catturare una marca temporale.
  • Il corpo dell’interruttore non è una parte strutturale. Dai alla scocca del paraurti un fermo meccanico che assorba l’impatto. I corpi degli interruttori si crepano: è ciò che li uccide molto prima che i contatti si consumino.
  • La sua molla non riporta indietro il paraurti. Un microswitch spinge con 50–100 g. Usa elastici o molle di compressione leggere per il ritorno e lascia che l’interruttore si limiti a sentire.
  • Un paraurti piatto manca gli impatti obliqui. Avvolgi la scocca fino ad almeno 45° su ciascun lato, con un interruttore dietro ogni metà, così il codice sa da che parte ruotare.
  • I fili lunghi raccolgono rumore dei motori. Tieni il tratto corto, intreccia la coppia e affidati al percorso a bassa impedenza del pull-up quando è chiuso.
  • Le portate dei contatti sono per la rete elettrica, non per la logica. A un interruttore classificato per 5 A a 125 V AC qui si chiede di far passare microampere; la portata non dice nulla di utile sulla sua durata in questo lavoro. La corsa preliminare e la forza di azionamento sì.

Cablaggio

Due dei tre terminali, e la scelta dei due decide come il robot si comporta in caso di guasto.

Uso COM verso Segnale da Stato inattivo Filo rotto letto come
Paraurti GND NO, pin INPUT_PULLUP HIGH Non premuto: sicuro
Arresto di emergenza GND NC, pin INPUT_PULLUP LOW Premuto: sicuro
Qualsiasi dei due, pull-up esterno GND NO o NC, 10 kΩ verso VCC — Come sopra

La distinzione conta. Un paraurti collegato a NO è sicuro in caso di guasto perché legge «nessuna collisione», ed è corretto: un robot con il filo del paraurti rotto deve continuare a marciare, non bloccarsi. Un arresto di emergenza collegato a NC è sicuro perché legge «fermo», ed è anch’esso corretto, per il motivo opposto.

Usa il pull-up interno. Non costa nulla, non richiede componenti e fornisce uno stato inattivo definito. Un pin lasciato come semplice INPUT con un interruttore collegato, quando l’interruttore è aperto, è flottante e i pin flottanti leggono qualsiasi rumore elettrico nelle vicinanze, che su un robot pieno di motori è parecchio.

L’eliminazione del rimbalzo, fatta bene

Una singola pressione produce circa nove transizioni in circa 4.7 ms mentre i contatti scattano e rimbalzano. Un software che legge il pin in modo ingenuo vede nove pressioni.

const int BUMP_L = 2, BUMP_R = 3;
const unsigned long DEBOUNCE_MS = 8;      // longer than the ~5 ms bounce

struct Bumper {
  uint8_t pin;
  bool stable;            // the debounced state
  bool lastRead;
  unsigned long changedAt;
};

Bumper left  = {BUMP_L, true, true, 0};
Bumper right = {BUMP_R, true, true, 0};

// Returns true on the frame the bumper newly closes.
bool update(Bumper &b) {
  bool now = digitalRead(b.pin);          // HIGH = open, with INPUT_PULLUP
  if (now != b.lastRead) {
    b.lastRead = now;
    b.changedAt = millis();               // restart the timer on any edge
    return false;
  }
  if (millis() - b.changedAt >= DEBOUNCE_MS && b.stable != now) {
    b.stable = now;
    return (now == LOW);                  // newly pressed
  }
  return false;
}

void setup() {
  pinMode(BUMP_L, INPUT_PULLUP);
  pinMode(BUMP_R, INPUT_PULLUP);
}

void loop() {
  if (update(left))  { backUp(); turnRight(); }
  if (update(right)) { backUp(); turnLeft(); }
}

Il dettaglio strutturale importante è che il timer riparte a ogni fronte, anziché leggere una volta e aspettare. Un campionamento fisso seguito da un’attesa può cadere dentro il rimbalzo e bloccare il valore sbagliato; riavviare la finestra significa che lo stato viene accettato solo dopo che il pin è rimasto tranquillo per l’intero periodo.

Perché non usare un interrupt

Gli interrupt su un microswitch sono una trappola, e precisamente:

  • Non collegare mai un interrupt che conta. Nove fronti diventano nove conteggi e l’eliminazione del rimbalzo dentro un ISR richiede millis(), che non avanza dentro un ISR su AVR.
  • Un interrupt che imposta un flag va bene, se l’eliminazione del rimbalzo avviene nel ciclo principale. Ma interrogare un interruttore a 100 Hz non costa nulla e il ciclo del robot sta già funzionando.
  • Riserva D2 e D3 agli encoder su Uno. Sono gli unici due pin con interrupt esterno e gli encoder ne hanno davvero bisogno. Un paraurti no.

L’unico caso che giustifica un interrupt è un arresto di emergenza che deve interrompere i motori anche se il ciclo principale si è bloccato: meglio risolverlo collegando l’interruttore alla linea di abilitazione del driver del motore, così funziona senza alcun software.

Montaggio: la parte che decide davvero se funziona

Tutto quanto sopra è un problema risolto. La progettazione meccanica è dove i paraurti riescono o falliscono.

La scocca assorbe l’impatto, non l’interruttore. Il corpo di un microswitch è plastica sottile e si crepa sotto un colpo diretto. Costruisci una scocca che ruoti o scorra, dotala di un fermo meccanico che assorba la forza e lascia che l’interruttore senta un piccolo movimento verso la fine di quella corsa.

Avvolgi la scocca. Un paraurti anteriore piatto manca tutto ciò che viene colpito di lato, e un robot che naviga con sensori di distanza colpisce soprattutto di lato, perché gli ostacoli frontali sono già stati rilevati. Avvolgi fino ad almeno 45° su ciascun lato.

Due interruttori, non uno. A sinistra e a destra, dietro le due metà della scocca. Un interruttore indica che hai colpito qualcosa; due indicano da che parte ruotare. La differenza di comportamento è drammatica e il costo aggiuntivo è di circa venti centesimi.

Interruttori Che cosa impara il robot Comportamento possibile
1, centrale Che è stato colpito qualcosa Arretrare e ruotare in una direzione casuale
2, sinistra e destra Quale lato è stato colpito Arretrare e ruotare dalla parte opposta al contatto
3, aggiungendo un interruttore posteriore Che è indietro contro qualcosa Uscire da una situazione di blocco

Riporta il paraurti con una molla propria. La molla interna di un microswitch spinge con soli 50–100 g, che non bastano a ripristinare in modo affidabile una scocca con attrito nel perno. Usa elastici o molle di compressione leggere e lascia che l’interruttore faccia soltanto da sensore.

Imposta la corsa preliminare in modo che la scocca si muova prima che l’interruttore raggiunga il fondo. Lo interruttore si aziona dopo 1–3 mm e ha un po’ di sovracorsa oltre quel punto: il fermo meccanico della scocca deve arrivare entro la sovracorsa, altrimenti l’impatto viene assorbito dal meccanismo interno dell’interruttore.

Sceglierne uno

Tipo di leva Forza di azionamento Ideale per
Nessuna leva (puntalone nudo) ~1 N su ~1 mm Finecorse con meccanismo preciso
Leva corta dritta 0.5–0.8 N Paraurti generali
Leva lunga dritta 0.2–0.5 N Scocche leggere, contatti delicati
Leva a rullo 0.5–1 N Qualsiasi cosa che scorra sopra anziché premere dentro
Rullo simulato (piegato) 0.5–1 N Alternativa più economica al rullo

La portata dei contatti è irrilevante qui. A un interruttore classificato per 5 A a 125 V AC si chiede di far passare pochi microampere verso un pull-up. Ciò che conta è la specifica meccanica: forza di azionamento, corsa preliminare e durata meccanica nominale (10⁵–10⁷ operazioni). Un robot che urta cento volte per sessione raggiunge 10⁵ operazioni dopo mille sessioni, quindi la durata meccanica è di fatto illimitata: lo l’interruttore morirà molto prima per il corpo crepato.

Risoluzione dei problemi

Sintomo Causa probabile Soluzione
Una pressione attiva più volte Nessuna eliminazione del rimbalzo Usa il modello qui sopra con una finestra di 8 ms
Risulta sempre premuto Collegato a NC invece che a NO Passa al terminale NO
Legge valori casuali senza contatto Pin flottante INPUT_PULLUP, oppure un resistore esterno da 10 kΩ
Falsi trigger quando i motori girano Fili lunghi e non schermati che raccolgono rumore Accorcia e intreccia la coppia; aggiungi un condensatore da 100 nF sul pin
Il paraurti non torna indietro Si affida alla molla dell’interruttore Aggiungi elastici o una molla di ritorno
L’interruttore si crepa dopo poche collisioni L’impatto passa dal corpo dell’interruttore Aggiungi un fermo meccanico che la scocca incontri prima
Non rileva le collisioni oblique Paraurti piatto Avvolgi la scocca a 45° su ciascun lato
Il robot arretra ma colpisce di nuovo la stessa cosa Un solo interruttore, nessuna informazione sulla direzione Due interruttori e ruota dalla parte opposta a quello scattato
Funziona sul banco, non sul robot Geometria del paraurti, non elettronica Spingi la scocca a mano da più angolazioni e osserva il pin

Perché questa componente economica si guadagna il suo posto

Ogni altro sensore di un robot ha superfici che non può vedere. Un sensore ultrasonico è cieco alle tende e alle pareti incontrate con un angolo ripido. Un VL53L0X è cieco alle superfici nere opache, agli specchi e a qualsiasi cosa alla luce diretta del sole. Una fotocamera ha bisogno di luce.

Un microswitch non ha un elenco del genere. Se qualcosa sta toccando il paraurti, l’interruttore si chiude. Questo lo rende la sensazione di ultima istanza e, su un robot che deve funzionare senza supervisione, è l’affidabilità più economica disponibile: due interruttori, due pin e circa quaranta centesimi.

Ed è anche, straordinariamente, sufficiente da solo. Un robot con due microswitch e una svolta casuale al contatto coprirà un’intera stanza, se ha tempo sufficiente: è esattamente così che funzionavano i robot aspirapolvere di prima generazione, ed è utile capirlo prima di ricorrere a qualcosa di più sofisticato.

Esplora il grafo

Usato in queste costruzioni

Progetti, percorsi di apprendimento e simulatori che includono Microswitch a leva.

Domande

FAQ su Microswitch a leva

A cosa serve un microswitch a leva su un robot?

È il sensore dietro un paraurti. Una scocca elastica sul fronte del robot preme l'interruttore quando il robot entra in contatto e fornisce al codice un unico bit inequivocabile — ho colpito qualcosa — che nessun sensore ottico o acustico può fornire con la stessa affidabilità. È ciò che permette a un robot di rilevare una gamba nera di una sedia, un vetro o un ostacolo all'altezza sbagliata per il suo sensore di distanza.

L'interruttore va cablato normalmente aperto o normalmente chiuso?

Per un paraurti, normalmente aperto verso massa con il pin dotato di pull-up. In questo modo un filo rotto viene letto come non premuto, così un conduttore spezzato non può convincere il robot che è in collisione permanente. Usa invece il contatto normalmente chiuso per un arresto di emergenza, perché il guasto sicuro è opposto: un filo rotto deve fermare la macchina.

Perché una pressione viene registrata più volte?

Rimbalzo del contatto. Il contatto metallico arriva, devia, si separa e arriva di nuovo più volte nei primi millisecondi, e un microcontrollore che campiona a megahertz vede ognuno di questi come un fronte reale. Un interruttore a leva modello produce nove transizioni in circa 4.7 ms. Elimina il rimbalzo via software con una finestra che ignora per un certo tempo dopo l'accettazione e non collegare mai un interrupt che effettua il conteggio.

Che cosa fa davvero il braccio della leva?

Scambia forza con corsa. Il puntalone nudo richiede da 1 a 1.5 N su circa 1 mm; una leva moltiplica il movimento, così la scocca del paraurti può spostarsi di 3–5 mm e azionarsi con una pressione molto più leggera. È importante perché la scocca deve muoversi abbastanza da essere affidabile, ma non così tanto da spingere via i piccoli ostacoli prima di attivarsi.

Mi serve una resistenza di pull-up?

No: usa il pull-up interno del microcontrollore con INPUT_PULLUP. È gratuito, non richiede componenti aggiuntivi nell'angolo più soggetto a urti del robot e il percorso a bassa impedenza verso massa quando l'interruttore è chiuso impedisce a un lungo filo del paraurti di raccogliere rumore dal driver accanto.

Per approfondire

Fonti