Índice:

Uma solução rotativa Arduino completa: 5 etapas
Uma solução rotativa Arduino completa: 5 etapas

Vídeo: Uma solução rotativa Arduino completa: 5 etapas

Vídeo: Uma solução rotativa Arduino completa: 5 etapas
Vídeo: Aula 5 - Arduino no Atmel Studio 6, Parte 1/2 | Curso Arduino Express 2024, Dezembro
Anonim
Uma solução rotativa Arduino completa
Uma solução rotativa Arduino completa

Codificadores rotativos são botões de controle giratórios para projetos eletrônicos, geralmente usados com os microcontroladores da família Arduino. Eles podem ser usados para ajustar parâmetros, navegar em menus, mover objetos na tela, definir valores de qualquer tipo. Eles são substituições comuns para potenciômetros, porque eles podem ser girados com mais precisão e infinitamente, eles aumentam ou diminuem um valor discreto por vez, e muitas vezes integrados com um botão pressionável para funções de tipo de seleção. Eles vêm em todas as formas e tamanhos, mas é difícil fazer a interface com a faixa de preço mais baixa, conforme explicado abaixo.

Existem inúmeros artigos sobre os detalhes de funcionamento e modos de uso dos codificadores rotativos e vários códigos de amostra e bibliotecas sobre como usá-los. O único problema é que nenhum deles funciona 100% preciso com os módulos rotativos chineses da faixa de preço mais baixa.

Etapa 1: Codificadores Rotativos Internos

Codificadores rotativos internos
Codificadores rotativos internos
Codificadores rotativos internos
Codificadores rotativos internos
Codificadores rotativos internos
Codificadores rotativos internos

A parte rotativa do codificador tem três pinos (e mais dois para a parte opcional do switch). Um é terra comum (GND preto), os outros dois são para determinar a direção quando o botão é girado (eles são freqüentemente chamados de CLK azul e DT vermelho). Ambos estão conectados a um pino de entrada PULLUP do microcontrolador, tornando o nível ALTO sua leitura padrão. Quando o botão é girado para frente (ou no sentido horário), primeiro o CLK azul cai para o nível BAIXO, depois o DT vermelho segue. Virando mais longe, o azul CLK sobe de volta para HIGH, então conforme o patch GND comum deixa ambos os pinos de conexão, o DT vermelho também sobe de volta para HIGH. Concluindo assim um tick completo FWD (ou no sentido horário). O mesmo vai na outra direção BWD (ou anti-horário), mas agora o vermelho cai primeiro e o azul sobe por último, conforme mostrado nas imagens de dois níveis, respectivamente.

Etapa 2: miséria que causa dor real para muitos

Miséria que causa dor real para muitos
Miséria que causa dor real para muitos
Miséria que causa dor real para muitos
Miséria que causa dor real para muitos
Miséria que causa dor real para muitos
Miséria que causa dor real para muitos

Problema comum para entusiastas do Arduino, que os módulos codificadores rotativos baratos refletem mudanças extras nos níveis de saída, causando leituras de contagem de direção extras e incorretas. Isso evita uma contagem perfeita e torna impossível integrar esses módulos em projetos rotativos precisos. Esses saltos extras são causados pelos movimentos mecânicos dos patches sobre os pinos de conexão, e mesmo a aplicação de capacitores extras não pode eliminá-los completamente. Os rebatimentos podem aparecer em qualquer lugar nos ciclos completos do tique e são ilustrados por cenários da vida real nas imagens.

Etapa 3: Solução de máquina de estado finito (FSM)

Solução de máquina de estado finito (FSM)
Solução de máquina de estado finito (FSM)

A imagem mostra o espaço de estado completo das mudanças de nível possíveis para os dois pinos (CLK azul e DT vermelho), tanto para rejeições corretas quanto falsas. Com base nesta máquina de estado, pode ser programada uma solução completa que sempre funciona 100% precisa. Como não são necessários atrasos de filtragem nesta solução, ela também é a mais rápida possível. Outro benefício de separar o espaço de estado dos pinos do modo de trabalho é que se pode aplicar os modos de interrogação ou interrupção ao seu próprio gosto. Pesquisas ou interrupções podem detectar mudanças de nível nos pinos e uma rotina separada calculará o novo estado com base no estado atual e eventos reais de mudanças de nível.

Etapa 4: Código Arduino

Código Arduino
Código Arduino

O código a seguir conta os ticks FWD e BWD no monitor serial e também integra a função de switch opcional.

// Peter Csurgay 2019-04-10

// Pinos do rotativo mapeados para portas Arduino

#define SW 21 #define CLK 22 #define DT 23

// Valor atual e anterior do contador ajustado pelo rotativo

int curVal = 0; int prevVal = 0;

// Sete estados de FSM (máquina de estado finito)

#define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int state = IDLE_11;

void setup () {

Serial.begin (250000); Serial.println ("Iniciar…"); // O nível HIGH será o padrão para todos os pinos pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Ambos CLK e DT irão disparar interrupções para todas as mudanças de nível attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// Manuseio da chave opcional integrada em alguns codificadores rotativos if (digitalRead (SW) == LOW) {Serial.println ("Pressed"); enquanto (! digitalRead (SW)); } // Qualquer alteração no valor do contador é exibida no Monitor Serial if (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Transições de máquina de estado para mudanças de nível CLK

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (estado == IDLE_11) estado = SCLK_01; senão se (estado == SCLK_10) estado = SCLK_00; senão se (estado == SDT_10) estado = SDT_00; } else {if (state == SCLK_01) state = IDLE_11; senão se (estado == SCLK_00) estado = SCLK_10; senão se (estado == SDT_00) estado = SDT_10; senão se (estado == SDT_01) {estado = IDLE_11; curVal--; }}}

// Transições de máquina de estado para mudanças de nível de DT

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; senão se (estado == SDT_01) estado = SDT_00; senão se (estado == SCLK_01) estado = SCLK_00; } else {if (state == SDT_10) state = IDLE_11; senão se (estado == SDT_00) estado = SDT_01; senão se (estado == SCLK_00) estado = SCLK_01; senão se (estado == SCLK_10) {estado = IDLE_11; curVal ++; }}}

Etapa 5: Integração perfeita

Você pode verificar no vídeo anexo se a solução FSM funciona com precisão e rapidez, mesmo no caso de codificadores rotativos de baixo alcance com vários efeitos de salto esporádicos.

Recomendado: