Sommario:

Arduino e interruttori a rotella: 9 passaggi
Arduino e interruttori a rotella: 9 passaggi

Video: Arduino e interruttori a rotella: 9 passaggi

Video: Arduino e interruttori a rotella: 9 passaggi
Video: GESTIONE TEMPO LAMPEGGIO CON UN PULSANTE ESERCITAZIONE 9 E 10 ARDUINO 22 LEZIONE 2024, Dicembre
Anonim
Arduino e interruttori a rotella
Arduino e interruttori a rotella

In questo articolo esaminiamo l'uso di interruttori push-wheel/thumbwheel con i nostri sistemi Arduino. Ecco alcuni esempi provenienti da PMD Way.

Passo 1:

Immagine
Immagine

Per chi non lo sapesse, ogni interruttore è un segmento verticale e possono essere collegati tra loro per formare varie dimensioni. È possibile utilizzare i pulsanti per selezionare dalle cifre da zero a nove. Sono disponibili alternative che hanno una rotella che puoi spostare con il pollice invece dei pulsanti di aumento/diminuzione.

Prima dei giorni delle interfacce utente fantasiose, questi interruttori erano metodi piuttosto popolari per impostare l'immissione di dati numerici. Tuttavia sono ancora disponibili oggi, quindi vediamo come funzionano e come possiamo usarli. Il valore dello switch è reso disponibile tramite codice binario decimale o straight decimal. Considera la parte posteriore dell'interruttore in formato BCD.

Passo 2:

Immagine
Immagine

Abbiamo comune a sinistra, quindi contatti per 1, 2, 4 e 8. Se si applica una piccola tensione (diciamo 5V) al comune, il valore dell'interruttore può essere misurato sommando i valori dei contatti che si trovano nel stato ALTO. Ad esempio, se si seleziona 3 – i contatti 1 e 2 saranno alla tensione al comune. I valori compresi tra zero e nove possono essere rappresentati come tali nella tabella.

Passaggio 3:

Immagine
Immagine

Ormai dovresti capire che sarebbe facile leggere il valore di un interruttore - e hai ragione, lo è. Possiamo collegare 5V al comune, le uscite ai pin di ingresso digitale delle nostre schede Arduino, quindi utilizzare digitalRead() per determinare il valore di ciascuna uscita. Nello schizzo usiamo alcuni calcoli matematici di base per convertire il valore BCD in un numero decimale. Quindi facciamolo ora.

Dal punto di vista hardware, dobbiamo tenere in considerazione un'altra cosa: l'interruttore a rotella si comporta elettricamente come quattro pulsanti normalmente aperti. Ciò significa che dobbiamo utilizzare resistori pull-down per avere una chiara differenza tra gli stati alti e bassi. Quindi lo schema per un interruttore è come mostrato sopra.

Passaggio 4:

Ora è semplice collegare le uscite etichettate 1, 2, 4 e 8 (ad esempio) ai pin digitali 8, 9, 10 e 11. Collegare 5 V al punto "C" dell'interruttore e GND a … GND. Successivamente, abbiamo bisogno di uno schizzo in grado di leggere gli input e convertire l'output BCD in decimale. Considera il seguente schizzo:

/* Utilizza lo schermo numerico SAA1064 https://www.gravitech.us/7segmentshield.html Utilizza il monitor seriale se non si dispone dello schermo SAA1064 */ #include "Wire.h" #define q1 8 #define q2 9 # define q4 10 #define q8 11 void setup() { Serial.begin(9600); Wire.begin(); // entra nel bus i2c (indirizzo opzionale per il master) delay(500); pinMode(q1, INGRESSO); // rotella '1' pinMode(q2, INPUT); // rotella '2' pinMode(q4, INPUT); // rotella '4' pinMode(q8, INPUT); // rotella '8' } void dispSAA1064(int Count) // invia l'intero 'Count' a Gravitech SAA1064 shield { const int lookup[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; int migliaia, centinaia, decine, base; Wire.beginTransmission(0x38); Wire.write(0); Wire.write(B01000111); Wire.endTransmission(); Wire.beginTransmission(0x38); Wire.write(1); Migliaia = Conte/1000; Centinaia = (Conteggio-(Migliaia*1000))/100; Decine = (Conteggio-((Migliaia*1000)+(Cento*100)))/10; Base = Conteggio-((Migliaia*1000)+(Centinaia*100)+(Decine*10)); Wire.write(ricerca[Base]); Wire.write(ricerca[Decine]); Wire.write(ricerca[centinaia]); Wire.write(ricerca[Migliaia]); Wire.endTransmission(); ritardo(10); } int readSwitch() { int totale=0; if (digitalRead(q1)==ALTA) { totale+=1; } if (digitalRead(q2)==ALTA) { totale+=2; } if (digitalRead(q4)==ALTA) { totale+=4; } if (digitalRead(q8)==ALTA) { totale+=8; } restituisce il totale; } void loop() { dispSAA1064(readSwitch()); // invia il valore dell'interruttore al display shield Serial.println(readSwitch()); // invia il valore dell'interruttore al box del monitor seriale }

La funzione readSwitch() è la chiave. Calcola il valore dell'interruttore sommando la rappresentazione numerica di ogni uscita dell'interruttore e restituisce il totale come risultato. Per questo esempio abbiamo utilizzato uno schermo di visualizzazione numerico controllato da NXP SAA1064.

Passaggio 5:

Image
Image

La funzione readSwitch() è la chiave. Calcola il valore dell'interruttore sommando la rappresentazione numerica di ogni uscita dell'interruttore e restituisce il totale come risultato. Per questo esempio abbiamo utilizzato uno schermo di visualizzazione numerico controllato da NXP SAA1064.

Se non ne hai uno, va bene: i risultati vengono inviati anche al monitor seriale. Ora, vediamolo in azione nel video.

Passaggio 6:

Ok, non sembra molto, ma se hai bisogno di un'immissione numerica risparmia molto spazio fisico e offre un metodo di immissione preciso.

Così il gioco è fatto. Li useresti davvero in un progetto? Per una cifra – sì. Per quattro? Probabilmente no, forse sarebbe più facile usare una tastiera a 12 cifre. C'è un'idea…

Passaggio 7: interruttori multipli

Immagine
Immagine

Ora esamineremo come leggere quattro cifre e non sprecare tutti quei pin digitali nel processo. Invece, utilizzeremo il CI di espansione della porta a 16 bit MCP23017 di Microchip che comunica tramite il bus I2C. Ha sedici pin di input/output digitali che possiamo usare per leggere lo stato di ogni interruttore.

Prima di andare avanti, tieni presente che per questo articolo sono richieste alcune presunte conoscenze: il bus I2C (parti uno e due) e l'MCP23017. Descriveremo prima le connessioni hardware e poi lo sketch di Arduino. Richiamare lo schema utilizzato per l'esempio del singolo interruttore.

Quando lo switch è stato collegato direttamente ad Arduino, abbiamo letto lo stato di ciascun pin per determinare il valore dello switch. Lo faremo di nuovo, su scala più ampia utilizzando l'MCP23017. Considera il diagramma di pinout:

Passaggio 8:

Abbiamo 16 pin, che consentono di collegare quattro interruttori. I comuni per ogni interruttore si collegano ancora a 5V e ogni contatto dell'interruttore ha ancora una resistenza di pull-down da 10k a GND. Quindi colleghiamo i pin 1, 2, 4, 8 della cifra uno a GPBA0~3; cifre due da 1, 2, 4, 8 a GPA4~7; le cifre tre 1, 2, 4, 8 in GPB0~3 e le cifre quattro 1, 2, 4, 8 in GPB4~7.

Ora come leggiamo gli interruttori? Tutti quei fili potrebbero farti pensare che sia difficile, ma lo schizzo è abbastanza semplice. Quando leggiamo il valore di GPBA e B, viene restituito un byte per ogni banco, con il bit più significativo per primo. Ogni quattro bit corrisponderà all'impostazione dell'interruttore collegato ai pin di I/O corrispondenti. Ad esempio, se richiediamo i dati per entrambi i banchi IO e gli interruttori sono impostati su 1 2 3 4, il banco A restituirà 0010 0001 e il banco B restituirà 0100 0011.

Usiamo alcune operazioni di spostamento dei bit per separare ogni quattro bit in una variabile separata, che ci lascia con il valore di ogni cifra. Ad esempio, per separare il valore dello switch quattro, spostiamo i bit dal banco B >> 4. Questo spinge fuori il valore dello switch tre ei bit vuoti a sinistra diventano zero.

Per separare il valore per l'opzione tre, usiamo un composto bit per bit & – che lascia il valore dell'opzione tre. L'immagine mostra una ripartizione dei valori dell'interruttore binario: mostra i valori GPIOA e B byte grezzi, quindi il valore binario di ciascuna cifra e il valore decimale.

Passaggio 9:

Quindi vediamo lo schizzo dimostrativo:

/* Esempio 40a - Legge quattro interruttori BCD pushwheel tramite MCP23017, visualizza su SAA1064/4-digit display LED a 7 segmenti */ // MCP23017 pin 15~17 a GND, l'indirizzo bus I2C è 0x20 // SAA1064 indirizzo bus I2C 0x38 # include "Wire.h" // per le definizioni delle cifre dei LED int digits[16]={ 63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; byte GPIOA, GPIOB, dig1, dig2, dig3, dig4; void initSAA1064() { //setup 0x38 Wire.beginTransmission(0x38); Wire.write(0); Wire.write(B01000111); // Uscita 12mA, nessuna cifra in bianco Wire.endTransmission(); } void setup() { Serial.begin(9600); Wire.begin(); // avvia il bus I2C initSAA1064(); } void loop() { // legge gli input del banco A Wire.beginTransmission(0x20); Wire.write(0x12); Wire.endTransmission(); Wire.requestFrom(0x20, 1); GPIOA=Wire.read(); // questo byte contiene i dati di commutazione per le cifre 1 e 2 // legge gli ingressi del banco B Wire.beginTransmission(0x20); Wire.write(0x13); Wire.endTransmission(); Wire.requestFrom(0x20, 1); GPIOB=Wire.read(); // questo byte contiene i dati dello switch per le cifre 3 e 4 // estrae il valore per ogni switch // dig1 LHS, dig4 RHS dig4=GPIOB >> 4; dig3=GPIOB & B00001111; dig2=GPIOA >> 4; dig1=GPIOA & B00001111; // invia tutti i dati GPIO e dei singoli switch al monitor seriale // per il debug e l'interesse Serial.print("GPIOA = "); Serial.println(GPIOA, BIN); Serial.print("GPIOB = "); Serial.println(GPIOB, BIN); Serial.println(); Serial.print("cifra 1 = "); Serial.println(dig1, BIN); Serial.print("cifra 2 = "); Serial.println(dig2, BIN); Serial.print("cifra 3 = "); Serial.println(dig3, BIN); Serial.print("cifra 4 = "); Serial.println(dig4, BIN); Serial.println(); Serial.print("cifra 1 = "); Serial.println(dig1, DEC); Serial.print("cifra 2 = "); Serial.println(dig2, DEC); Serial.print("cifra 3 = "); Serial.println(dig3, DEC); Serial.print("cifra 4 = "); Serial.println(dig4, DEC); Serial.println(); // invia il valore dell'interruttore al display LED tramite SAA1064 Wire.beginTransmission(0x38); Wire.write(1); Wire.write(cifre[dig4]); Wire.write(cifre[dig3]); Wire.write(cifre[dig2]); Wire.write(cifre[dig1]); Wire.endTransmission(); ritardo(10); ritardo(1000); }

E per i non credenti… un video dimostrativo.

Così il gioco è fatto. Quattro cifre invece di una e sul bus I2C conservando i pin I/O digitali di Arduino. Utilizzando otto MCP23017 è possibile leggere 32 cifre contemporaneamente. Divertiti a farlo!

È possibile ordinare interruttori BCD e decimali in varie dimensioni da PMD Way, con consegna gratuita in tutto il mondo.

Questo post ti è stato presentato da pmdway.com: tutto per produttori e appassionati di elettronica, con consegna gratuita in tutto il mondo.

Consigliato: