Índice:

Arduino HMI usando máquinas de estado: 9 etapas
Arduino HMI usando máquinas de estado: 9 etapas

Vídeo: Arduino HMI usando máquinas de estado: 9 etapas

Vídeo: Arduino HMI usando máquinas de estado: 9 etapas
Vídeo: FAÇA UMA MÁQUINA DE ESTADOS FINITOS COM ARDUINO | Curso de Arduino #245 2024, Julho
Anonim
Arduino HMI usando máquinas de estado
Arduino HMI usando máquinas de estado

Neste Instructable, vou mostrar como usar YAKINDU Statechart Tools para realizar uma IHM simples e expansível usando um teclado de LCD 16x2 para Arduino.

As máquinas de estado finito (FSM) são um padrão de projeto poderoso para desenvolver interfaces homem-máquina (IHM) complexas. Como a funcionalidade de uma IHM pode aumentar, é útil usar um padrão de projeto como máquinas de estado.

O exemplo completo está embutido em YAKINDU Statechart Tools. Além disso, o Eclipse C ++ IDE para Arduino Plugin foi usado para compilar e atualizar no IDE.

Uma breve sinopse das ferramentas de gráficos de estado YAKINDU

Com esta ferramenta, é possível criar máquinas de estados gráficos. Ele permite ao usuário gerar código C, C ++ ou Java a partir da máquina de estado. Com essa abordagem, o modelo pode ser alterado ou expandido e o usuário pode simplesmente recriar o código e não precisa escrever código-fonte simples.

Suprimentos

Partes:

  • Arduino (Uno, Mega)
  • Cabo USB
  • Protetor de teclado LCD 16x2

Ferramentas:

  • YAKINDU Statechart Tools
  • Eclipse C ++ IDE para Arduino

Etapa 1: O Hardware

Image
Image

O escudo do teclado LCD pode ser simplesmente conectado ao Arduino. Ele tem um display LCD 16x2 e, adicionalmente, tem seis botões:

  • Deixou
  • Direito
  • Acima
  • Baixa
  • Selecione
  • (Redefinir)

Obviamente, cinco deles podem ser usados. As chaves são conectadas a um divisor de tensão e são detectadas usando o pino A0 dependendo da tensão. Usei o software debouncing para detectá-los corretamente.

Etapa 2: Definir como isso deve funcionar

Controle HMI
Controle HMI

O aplicativo deve ser capaz de fazer três coisas.

  1. Manipular estadosAqui desejo usar os botões para navegar entre cinco estados: Superior, Meio, Inferior, Esquerda e Direita
  2. CronômetroUm cronômetro simples, que pode ser iniciado, interrompido e zerado. Deve ser incrementado a cada 100 milissegundos
  3. ContadorA terceira parte contém um contador simples para cima / para baixo. Deve ser capaz de contar números positivos e deve ser reinicializável

O menu ativo (ou o estado) será exibido no LCD 16x2 na linha superior. O aplicativo (Estado, Temporizador ou Contador) será exibido na linha inferior. Para navegação, os botões esquerdo e direito devem ser usados.

Etapa 3: interface da máquina de estado

Os botões serão depurados e conectados à máquina de estado. Eles podem ser usados como em eventos na máquina de estado. Além disso, as operações são definidas para exibir o menu atual. E pelo menos duas variáveis, uma para o temporizador e outra para o contador, são definidas.

interface:

// botões como eventos de entrada no evento à direita no evento à esquerda no evento para cima no evento para baixo na seleção de evento // exibe os valores específicos da HMI operação displayLCDString (valor: string, comprimento: inteiro, posição: inteiro) operação displayLCDInteger (valor: inteiro, posição: inteiro) operação clearLCDRow (posição: inteiro) interno: // variáveis para armazenamento var cnt: inteiro var timeCnt: inteiro = 0

Depois de gerar o código C ++, os eventos de entrada devem ser depurados e conectados à interface. Este trecho de código mostra como fazer isso.

A princípio, os botões serão definidos:

#define NENHUM 0 # define SELECCIONE 1 #define ESQUERDA 2 #define BAIXO 3 #define ACIMA 4 #define DIREITO 5

Depois, há uma função definida para ler o botão. Os valores podem variar, dependendo do fabricante do LCD Shield.

static int readButton () {int result = 0; resultado = analogRead (0); if (resultado <50) {return RIGHT; } if (resultado <150) {return UP; } if (resultado <300) {return DOWN; } if (resultado <550) {return LEFT; } if (resultado <850) {return SELECT; } return NONE; }

No final, os botões serão debitados. Obtive bons resultados com 80 ms. Assim que um botão for liberado, ele aumentará o de acordo com o evento.

int oldState = NONE; estático void raiseEvents () {int buttonPressed = readButton (); atraso (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> raise_select (); pausa; } case LEFT: {stateMachine-> raise_left (); pausa; } case DOWN: {stateMachine-> raise_down (); pausa; } case UP: {stateMachine-> raise_up (); pausa; } case RIGHT: {stateMachine-> raise_right (); pausa; } padrão: {break; }}}}

Etapa 4: Controle HMI

Cada estado é usado para uma parte do menu. Existem subestados, onde o aplicativo - por exemplo, o cronômetro - será executado.

Com este design, a interface pode ser facilmente expandida. Menus adicionais podem ser simplesmente adicionados usando o mesmo padrão de design. Ler o valor de um sensor e exibi-lo em um quarto item do menu não é grande coisa.

Por enquanto, apenas a esquerda e a direita são usadas como controle. Mas para cima e para baixo também podem ser usados como uma extensão de navegação no menu principal. Apenas o botão de seleção será usado para inserir um item de menu específico.

Etapa 5: lidar com estados

Handle States
Handle States

O menu de estados do identificador é usado apenas como um exemplo adicional de navegação. Usar cima, baixo, direita ou esquerda permite alternar entre os estados. O estado atual sempre será impresso na segunda linha do visor LCD.

Etapa 6: cronômetro

Cronômetro
Cronômetro

O cronômetro é bastante simples. Inicialmente, o valor do temporizador será zerado. O cronômetro pode ser iniciado usando o botão esquerdo e alternado usando a esquerda e a direita. Usar para cima ou para baixo zera o cronômetro. O cronômetro também pode ser zerado usando o botão de seleção duas vezes - saindo do menu e entrando nele mais uma vez, já que o cronômetro será zerado ao entrar inicialmente no cronômetro.

Etapa 7: Contador

Contador
Contador

Pelo menos, existe um contador implementado. Entrar no estado do contador zera o contador. Ele pode ser iniciado usando qualquer botão, exceto o botão de seleção. É implementado como um contador simples de subir / descer, cujo valor não pode ser menor que 0.

Etapa 8: Simulação

Etapa 9: Obtenha o exemplo

Você pode baixar o IDE aqui: YAKINDU Statechart Tools

Depois de fazer o download do IDE, você encontra o exemplo via Arquivo -> Novo -> Exemplo

É gratuito para entusiastas, mas você também pode usar um teste de 30 dias.

Recomendado: