Índice:
- Etapa 1: Codificadores Rotativos Internos
- Etapa 2: miséria que causa dor real para muitos
- Etapa 3: Solução de máquina de estado finito (FSM)
- Etapa 4: Código Arduino
- Etapa 5: Integração perfeita
Vídeo: Uma solução rotativa Arduino completa: 5 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:37
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
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
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)
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
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:
Arduino - Robô de solução de labirinto (MicroMouse) Robô que segue a parede: 6 etapas (com imagens)
Arduino | Maze Solving Robot (MicroMouse) Wall seguindo Robot: Bem-vindo, sou Isaac e este é meu primeiro robô " Striker v1.0 ". Este robô foi projetado para resolver um labirinto simples. Na competição, tivemos dois labirintos e o robô foi capaz de identificá-los. Quaisquer outras mudanças no labirinto podem exigir uma mudança no
Uma solução de visão acessível com braço robótico baseado em Arduino: 19 etapas (com imagens)
Uma solução de visão acessível com braço robótico baseado em Arduino: Quando falamos sobre visão de máquina, sempre parece tão inacessível para nós. Enquanto fazíamos uma demonstração da visão de código-fonte aberto, que seria muito fácil de fazer para todos. Neste vídeo, com a câmera OpenMV, não importa onde esteja o cubo vermelho, o robô ar
SKY CAM uma solução de câmera aérea: 10 etapas (com fotos)
SKY CAM uma solução de câmera aérea: Este manual de instruções explicará como fiz um sistema de câmera a cabo de controle remoto (semi-autônomo) para meu projeto de produtos eletrônicos GCSE na escola e, com sorte, permitirá que você crie seu próprio sistema! Este é um guia aproximado
Uma solução simples para o infame problema da mão amiga: 9 etapas
Uma solução simples para o infame problema da mão amiga: Recentemente, comprei uma daquelas mãos ajudantes baratas e comecei a notar que as " mãos amiga " estavam perdendo o efeito, então tentei encontrar uma solução inteligente (e barata, é claro) para este pequeno problema. O problema é este: o parafuso de fixação era
Uma solução de centro de mídia que até mesmo mulheres e filhos usarão: 9 etapas
Uma solução de centro de mídia que até mesmo a esposa e filhos usarão: Este Instructable é um resumo da minha experiência tentando uma grande variedade de aplicativos de centro de mídia, sistemas operacionais, hardware e formatos de arquivo. Este não é um PVR como e não permite que você grave ou pause a TV ao vivo, embora eu vá sugerir uma boa alternativa