Taula de continguts:

Interruptors Arduino i Thumbwheel: 9 passos
Interruptors Arduino i Thumbwheel: 9 passos

Vídeo: Interruptors Arduino i Thumbwheel: 9 passos

Vídeo: Interruptors Arduino i Thumbwheel: 9 passos
Vídeo: Arduino Unboxing: Self-Balancing Robot Kit ELEGOO Tumbller 2024, Desembre
Anonim
Interruptors Arduino i Thumbwheel
Interruptors Arduino i Thumbwheel

En aquest article examinem l’ús d’interruptors de polsador / roda amb els nostres sistemes Arduino. Aquests són alguns exemples procedents de PMD Way.

Pas 1:

Imatge
Imatge

Per als no iniciats, cada commutador és un segment vertical i es pot connectar entre si per formar diverses mides. Podeu utilitzar els botons per seleccionar entre els dígits del zero al nou. Hi ha alternatives disponibles que tenen una roda que podeu moure amb el polze en lloc dels botons d'augment / disminució.

Abans dels temps de les interfícies d'usuari elegants, aquests commutadors eren mètodes força populars per establir l'entrada de dades numèriques. Tot i que encara estan disponibles avui en dia, doncs, vegem com funcionen i com els podem utilitzar. El valor del commutador es fa disponible mitjançant decimal codificat binari o decimal recte. Penseu en la part posterior del commutador en forma de BCD.

Pas 2:

Imatge
Imatge

Tenim contactes comuns a l’esquerra i, a continuació, per a 1, 2, 4 i 8. Si apliqueu un voltatge petit (per exemple, 5V) a comú, el valor del commutador es pot mesurar afegint els valors dels contactes que hi ha a la Estat ALT. Per exemple, si seleccioneu 3, els contactes 1 i 2 estaran a la tensió comuna. Els valors entre zero i nou es poden representar com a tals a la taula.

Pas 3:

Imatge
Imatge

A hores d’ara hauríeu d’adonar-vos que seria fàcil llegir el valor d’un commutador, i teniu raó, és així. Podem connectar 5V al comú, les sortides als pins d’entrada digitals de les nostres plaques Arduino, i després utilitzar digitalRead () per determinar el valor de cada sortida. A l'esbós fem servir algunes matemàtiques bàsiques per convertir el valor BCD en un nombre decimal. Així que fem-ho ara.

Des del punt de vista del maquinari, hem de tenir en compte una cosa més: l’interruptor de la roda es comporta elèctricament com quatre botons oberts normalment. Això significa que hem d’utilitzar resistències desplegables per tenir una clara diferència entre els estats alt i baix. Per tant, l’esquema d’un commutador és el que es mostra més amunt.

Pas 4:

Ara és senzill connectar les sortides etiquetades 1, 2, 4 i 8 a (per exemple) els pins digitals 8, 9, 10 i 11. Connecteu 5V al punt de commutació "C" i GND a … GND. A continuació, hem de tenir un esbós que pugui llegir les entrades i convertir la sortida BCD en decimal. Penseu en l'esbós següent:

/ * Utilitza la pantalla numèrica SAA1064 https://www.gravitech.us/7segmentshield.html Utilitza el monitor sèrie si no teniu la pantalla SAA1064 * / #include "Wire.h" #define q1 8 #define q2 9 # defineix q4 10 #define q8 11 void setup () {Serial.begin (9600); Wire.begin (); // unir-se al bus i2c (adreça opcional per al mestre) retard (500); pinMode (q1, INPUT); // thumbwheel '1' pinMode (q2, INPUT); // thumbwheel '2' pinMode (q4, INPUT); // thumbwheel '4' pinMode (q8, INPUT); // thumbwheel '8'} void dispSAA1064 (int Count) // envia el nombre enter 'Count' a Gravitech SAA1064 shield {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Milers, centenars, desenes, base; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Milers = Recompte / 1000; Centenars = (Comte- (Milers * 1000)) / 100; Desenes = (Recompte - ((Milers * 1000) + (Centenars * 100))) / 10; Base = Recompte - ((Milers * 1000) + (Centenars * 100) + (Desenes * 10)); Wire.write (consulta [Base]); Wire.write (cerca [Desenes]); Wire.write (consulta [Centenars]); Wire.write (consulta [Milers]); Wire.endTransmission (); retard (10); } int readSwitch () {int total = 0; if (digitalRead (q1) == HIGH) {total + = 1; } if (digitalRead (q2) == HIGH) {total + = 2; } if (digitalRead (q4) == HIGH) {total + = 4; } if (digitalRead (q8) == HIGH) {total + = 8; } retorn total; } bucle buit () {dispSAA1064 (readSwitch ()); // envia el valor del commutador per mostrar l'escut Serial.println (readSwitch ()); // envia el valor del commutador a la caixa del monitor sèrie}

La funció readSwitch () és la clau. Calcula el valor del commutador afegint la representació numèrica de cada sortida del commutador i retorna el total com a resultat. Per a aquest exemple hem utilitzat un escut de visualització numèric que està controlat pel NXP SAA1064.

Pas 5:

Image
Image

La funció readSwitch () és la clau. Calcula el valor del commutador afegint la representació numèrica de cada sortida del commutador i retorna el total com a resultat. Per a aquest exemple hem utilitzat un escut de visualització numèric que està controlat pel NXP SAA1064.

Si no en teniu, està bé: els resultats també s’envien al monitor sèrie. Ara, ho veiem en acció al vídeo.

Pas 6:

D'acord, no sembla gaire, però si necessiteu una entrada numèrica, estalvieu molt espai físic i us ofereix un mètode d'entrada precís.

Així que ja ho teniu. En realitat, els faríeu servir en un projecte? Per a un dígit: sí. Per quatre? Probablement no, potser seria més fàcil utilitzar un teclat de 12 dígits. Hi ha una idea …

Pas 7: diversos commutadors

Imatge
Imatge

Ara examinarem com llegir quatre dígits i no malgastar tots els pins digitals del procés. En el seu lloc, utilitzarem l’IC expansor de ports de 16 bits Microchip MCP23017 que es comunica a través del bus I2C. Té setze pins d'entrada / sortida digitals que podem utilitzar per llegir l'estat de cada commutador.

Abans de seguir endavant, tingueu en compte que cal tenir coneixements suposats per a aquest article: el bus I2C (parts 1 i 2) i el MCP23017. Primer descriurem les connexions de maquinari i després l’esbós d’Arduino. Recordeu l'esquema utilitzat per a l'exemple de commutador únic.

Quan el commutador es va connectar directament a l'Arduino, llegim l'estat de cada pin per determinar el valor del commutador. Ho tornarem a fer, a una escala més gran, mitjançant l'MCP23017. Penseu en el diagrama de fixació:

Pas 8:

Tenim 16 pins, cosa que permet connectar quatre commutadors. Els béns comuns de cada commutador encara es connecten a 5 V, i cada contacte de commutador encara té una resistència desplegable de 10 k a GND. A continuació, connectem els 1, 2, 4, 8 pins del dígit un a GPBA0 ~ 3; 1, 2, 4, 8 de dos dígits a GPA4 ~ 7; dígits tres 1, 2, 4, 8 a GPB0 ~ 3 i dígits quatre 1, 2, 4, 8 a GPB4 ~ 7.

Ara, com podem llegir els interruptors? Tots aquests cables us poden fer pensar que és difícil, però l’esbós és bastant senzill. Quan llegim el valor de GPBA i B, es retorna un byte per a cada banc, amb el bit més significatiu primer. Cada quatre bits coincidirà amb la configuració del commutador connectat als pins d'E / S coincidents. Per exemple, si sol·licitem les dades dels bancs IO i els commutadors s'estableixen a 1 2 3 4: el banc A retornarà 0010 0001 i el banc B retornarà 0100 0011.

Utilitzem algunes operacions de desplaçament de bits per separar cada quatre bits en una variable independent, cosa que ens deixa el valor de cada dígit. Per exemple, per separar el valor del commutador quatre, canviem els bits del banc B >> 4. Això empeny el valor del commutador tres i els bits en blanc de l'esquerra es tornen nuls.

Per separar el valor del commutador tres, fem servir un compost a bits a & que deixa el valor del commutador tres. La imatge mostra un desglossament dels valors del commutador binari: mostra els valors de bytes GPIOA i B, a continuació, el valor binari de cada dígit i el valor decimal.

Pas 9:

A continuació, vegem l’esbós de la demostració:

/ * Exemple 40a - Llegiu quatre commutadors BCD de polsador mitjançant MCP23017, es mostren a la pantalla LED SAA1064 / de 4 dígits de 7 segments * / // Els pins MCP23017 de 15 ~ 17 a GND, l'adreça del bus I2C és 0x20 // L'adreça del bus I2C SAA1064 0x38 # inclou "Wire.h" // per a definicions de dígits LED int dígits [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); // sortida de 12 mA, sense dígits en blanc Wire.endTransmission (); } void setup () {Serial.begin (9600); Wire.begin (); // engegar el bus I2C initSAA1064 (); } void loop () {// llegiu les entrades del banc A Wire.beginTransmission (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // aquest byte conté les dades de commutació dels dígits 1 i 2 // llegiu les entrades del banc B Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // aquest byte conté les dades del commutador dels dígits 3 i 4 // extreu el valor de cada commutador // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB i B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // envieu totes les dades del commutador GPIO i individual al monitor serial // per depurar i per interessos Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("dígit 1 ="); Serial.println (dig1, BIN); Serial.print ("dígit 2 ="); Serial.println (dig2, BIN); Serial.print ("dígit 3 ="); Serial.println (dig3, BIN); Serial.print ("dígit 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("dígit 1 ="); Serial.println (dig1, DEC); Serial.print ("dígit 2 ="); Serial.println (dig2, DEC); Serial.print ("dígit 3 ="); Serial.println (dig3, DEC); Serial.print ("dígit 4 ="); Serial.println (dig4, DEC); Serial.println (); // envieu el valor del commutador a la pantalla LED mitjançant SAA1064 Wire.beginTransmission (0x38); Wire.write (1); Wire.write (dígits [dig4]); Wire.write (dígits [dig3]); Wire.write (dígits [dig2]); Wire.write (dígits [dig1]); Wire.endTransmission (); retard (10); retard (1000); }

I per als no creients … una demostració de vídeo.

Així que ja ho teniu. Quatre dígits en lloc d'un, i sobre el bus I2C conservant els pins d'E / S digitals Arduino. Mitjançant vuit MCP23017 podríeu llegir 32 dígits alhora. Diverteix-te fent això!

Podeu demanar commutadors BCD i decimals de diverses mides a PMD Way, amb lliurament gratuït a tot el món.

Aquest article us el proporciona pmdway.com: tot per a fabricants i aficionats a l'electrònica, amb lliurament gratuït a tot el món.

Recomanat: