Índice:

Arduino e botões giratórios: 9 etapas
Arduino e botões giratórios: 9 etapas

Vídeo: Arduino e botões giratórios: 9 etapas

Vídeo: Arduino e botões giratórios: 9 etapas
Vídeo: Curso de Arduino para Iniciantes - Aula 01 - Primeiros Passos (Exemplo de um Vumeter) 2024, Novembro
Anonim
Arduino e interruptores giratórios
Arduino e interruptores giratórios

Neste artigo, examinamos o uso de interruptores push-wheel / thumbwheel com nossos sistemas Arduino. Aqui estão alguns exemplos fornecidos pela PMD Way.

Passo 1:

Imagem
Imagem

Para os não iniciados, cada switch é um segmento vertical e podem ser conectados para formar vários tamanhos. Você pode usar os botões para selecionar os dígitos de zero a nove. Existem alternativas disponíveis que possuem uma roda que você pode mover com o polegar em vez dos botões de aumentar / diminuir.

Antes dos dias de interfaces de usuário sofisticadas, essas opções eram métodos bastante populares para configurar a entrada de dados numéricos. No entanto, eles ainda estão disponíveis hoje, então vamos ver como eles funcionam e como podemos usá-los. O valor da chave é disponibilizado por meio de decimal codificado em binário ou decimal reto. Considere a parte traseira do switch no formato BCD.

Passo 2:

Imagem
Imagem

Temos o comum à esquerda, depois os contatos para 1, 2, 4 e 8. Se você aplicar uma pequena tensão (digamos 5V) ao comum, o valor da chave pode ser medido adicionando os valores dos contatos que estão no Estado ALTO. Por exemplo, se você selecionar 3 - os contatos 1 e 2 estarão na tensão em comum. Os valores entre zero e nove podem ser representados como tal na tabela.

Etapa 3:

Imagem
Imagem

Agora você deve perceber que seria fácil ler o valor de um switch - e você está certo, é isso. Podemos conectar 5 V ao comum, as saídas aos pinos de entrada digital de nossas placas Arduino e, em seguida, usar digitalRead () para determinar o valor de cada saída. No esboço, usamos um pouco de matemática básica para converter o valor BCD em um número decimal. Então, vamos fazer isso agora.

Do ponto de vista do hardware, precisamos levar em consideração mais uma coisa - o botão de pressão se comporta eletricamente como quatro botões normalmente abertos. Isso significa que precisamos usar resistores pull-down para ter uma diferença clara entre os estados alto e baixo. Portanto, o esquema de um switch é mostrado acima.

Passo 4:

Agora é uma questão simples conectar as saídas rotuladas 1, 2, 4 e 8 aos (por exemplo) pinos digitais 8, 9, 10 e 11. Conecte 5 V ao ponto do interruptor 'C' e GND ao … GND. Em seguida, precisamos ter um esboço que possa ler as entradas e converter a saída BCD em decimal. Considere o seguinte esboço:

/ * Usa blindagem de exibição numérica SAA1064 https://www.gravitech.us/7segmentshield.html Usa monitor serial se você não tiver a blindagem SAA1064 * / #include "Wire.h" #define q1 8 #define q2 9 # define q4 10 #define q8 11 void setup () {Serial.begin (9600); Wire.begin (); // junta-se ao barramento i2c (endereço opcional para mestre) delay (500); pinMode (q1, INPUT); // botão giratório '1' pinMode (q2, INPUT); // botão giratório '2' pinMode (q4, INPUT); // botão giratório '4' pinMode (q8, INPUT); // thumbwheel '8'} void dispSAA1064 (int Count) // envia inteiro 'Count' para Gravitech SAA1064 shield {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Milhares, Centenas, Dezenas, Base; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Milhares = Contagem / 1000; Centenas = (Contagem- (Milhares * 1000)) / 100; Dezenas = (Contagem - ((Milhares * 1000) + (Centenas * 100))) / 10; Base = Contagem - ((Milhares * 1000) + (Centenas * 100) + (Dezenas * 10)); Wire.write (lookup [Base]); Wire.write (lookup [Dezenas]); Wire.write (lookup [Hundreds]); Wire.write (lookup [Milhares]); Wire.endTransmission (); atraso (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; } retorno total; } void loop () {dispSAA1064 (readSwitch ()); // envia o valor da chave para exibir o escudo Serial.println (readSwitch ()); // envia o valor da chave para a caixa do monitor serial}

A função readSwitch () é a chave. Ele calcula o valor do switch adicionando a representação numérica de cada saída do switch e retorna o total como seu resultado. Para este exemplo, usamos uma blindagem de exibição numérica que é controlada pelo NXP SAA1064.

Etapa 5:

Image
Image

A função readSwitch () é a chave. Ele calcula o valor do switch adicionando a representação numérica de cada saída do switch e retorna o total como seu resultado. Para este exemplo, usamos uma blindagem de exibição numérica que é controlada pelo NXP SAA1064.

Se você não tiver um, tudo bem - os resultados também são enviados para o monitor serial. Agora, vamos ver isso em ação no vídeo.

Etapa 6:

Ok, não parece muito, mas se você precisar de entrada numérica, isso economiza muito espaço físico e oferece um método preciso de entrada.

Então aí está. Você realmente os usaria em um projeto? Por um dígito - sim. Para quatro? Provavelmente não - talvez seja mais fácil usar um teclado de 12 dígitos. Essa é uma ideia …

Etapa 7: Múltiplos interruptores

Imagem
Imagem

Agora vamos examinar como ler quatro dígitos - e não desperdiçar todos os pinos digitais no processo. Em vez disso, usaremos o IC expansor de porta de 16 bits Microchip MCP23017 que se comunica por meio do barramento I2C. Possui dezesseis pinos de entrada / saída digital que podemos usar para ler o status de cada switch.

Antes de prosseguir, observe que algum conhecimento presumido é necessário para este artigo - o barramento I2C (partes um e dois) e o MCP23017. Primeiro, descreveremos as conexões de hardware e, em seguida, o esboço do Arduino. Lembre-se do esquema usado para o exemplo de switch único.

Quando o switch foi conectado diretamente ao Arduino, lemos o status de cada pino para determinar o valor do switch. Faremos isso novamente, em uma escala maior, usando o MCP23017. Considere o diagrama de pinagem:

Etapa 8:

Temos 16 pinos, o que permite que quatro interruptores sejam conectados. Os comuns para cada chave ainda se conectam a 5 V e cada contato da chave ainda tem um resistor pull-down de 10k para GND. Em seguida, conectamos os 1, 2, 4, 8 pinos do dígito um ao GPBA0 ~ 3; dígito dois 1, 2, 4, 8 a GPA4 ~ 7; dígito três 1, 2, 4, 8 para GPB0 ~ 3 e dígito quatro 1, 2, 4, 8 para GPB4 ~ 7.

Agora, como lemos os interruptores? Todos esses fios podem fazer você pensar que é difícil, mas o esboço é bastante simples. Quando lemos o valor de GPBA e B, um byte é retornado para cada banco, com o bit mais significativo primeiro. Cada quatro bits corresponderá à configuração do switch conectado aos pinos de E / S correspondentes. Por exemplo, se solicitarmos os dados para ambos os bancos IO e as chaves forem definidas para 1 2 3 4 - o banco A retornará 0010 0001 e o banco B retornará 0100 0011.

Usamos algumas operações de bitshift para separar cada quatro bits em uma variável separada - o que nos deixa com o valor de cada dígito. Por exemplo, para separar o valor do switch quatro, deslocamos os bits do banco B >> 4. Isso empurra o valor do switch três para fora e os bits em branco à esquerda tornam-se zero.

Para separar o valor do switch três, usamos um composto bit a bit & - que deixa o valor do switch três. A imagem mostra uma divisão dos valores de chave binários - ela mostra os valores de byte GPIOA e B brutos, então o valor binário de cada dígito e o valor decimal.

Etapa 9:

Então, vamos ver o esboço de demonstração:

/ * Exemplo 40a - Leitura de quatro chaves BCD de botão giratório via MCP23017, exibição em SAA1064 / display LED de 7 segmentos de 4 dígitos * / // MCP23017 pinos 15 ~ 17 para GND, endereço de barramento I2C é 0x20 // SAA1064 endereço de barramento I2C 0x38 # inclua "Wire.h" // para definições de dígitos LED int dígitos [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 () {// configurar 0x38 Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); // Saída de 12 mA, sem apagamento de dígito Wire.endTransmission (); } void setup () {Serial.begin (9600); Wire.begin (); // inicia o bus I2C initSAA1064 (); } void loop () {// lê as entradas do banco A Wire.beginTransmission (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // este byte contém os dados de comutação para os dígitos 1 e 2 // lê as entradas do banco B Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // este byte contém os dados do switch para os dígitos 3 e 4 // extrai o valor para cada switch // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // envia todos os dados do GPIO e do switch individual para o monitor serial // para depuração e interesse Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("dígito 1 ="); Serial.println (dig1, BIN); Serial.print ("dígito 2 ="); Serial.println (dig2, BIN); Serial.print ("dígito 3 ="); Serial.println (dig3, BIN); Serial.print ("dígito 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("dígito 1 ="); Serial.println (dig1, DEC); Serial.print ("dígito 2 ="); Serial.println (dig2, DEC); Serial.print ("dígito 3 ="); Serial.println (dig3, DEC); Serial.print ("dígito 4 ="); Serial.println (dig4, DEC); Serial.println (); // envia o valor da chave para o display LED via SAA1064 Wire.beginTransmission (0x38); Wire.write (1); Wire.write (dígitos [dig4]); Wire.write (dígitos [dig3]); Wire.write (dígitos [dig2]); Wire.write (dígitos [dig1]); Wire.endTransmission (); atraso (10); atraso (1000); }

E para os não crentes … uma demonstração em vídeo.

Então aí está. Quatro dígitos em vez de um e sobre o barramento I2C conservando os pinos de E / S digital do Arduino. Usando oito MCP23017s, você pode ler 32 dígitos de uma vez. Divirta-se fazendo isso!

Você pode solicitar chaves BCD e decimais em vários tamanhos da PMD Way, com entrega gratuita em todo o mundo.

Esta postagem foi trazida a você por pmdway.com - tudo para fabricantes e entusiastas de eletrônicos, com entrega gratuita em todo o mundo.

Recomendado: