Sommario:

Arduino HMI con macchine a stati: 9 passaggi
Arduino HMI con macchine a stati: 9 passaggi

Video: Arduino HMI con macchine a stati: 9 passaggi

Video: Arduino HMI con macchine a stati: 9 passaggi
Video: Creare una macchina a stati con Arduino - parte 2 - #208 2024, Dicembre
Anonim
Arduino HMI che utilizza macchine a stati
Arduino HMI che utilizza macchine a stati

In questo Instructable, ti mostrerò come utilizzare YAKINDU Statechart Tools per realizzare un HMI semplice ed espandibile utilizzando uno scudo tastiera LCD 16x2 per Arduino.

Le macchine a stati finiti (FSM) sono un potente modello di progettazione per sviluppare complesse interfacce uomo-macchina (HMI). Poiché la funzionalità di un HMI può aumentare, è utile utilizzare un modello di progettazione come le macchine a stati.

L'esempio completo è incorporato in YAKINDU Statechart Tools. Inoltre, l'IDE Eclipse C++ per il plug-in Arduino è stato utilizzato per la compilazione e il flashing nell'IDE.

Una breve sinossi degli strumenti YAkinDU Statechart

Con questo strumento è possibile creare macchine a stati grafiche. Consente all'utente di generare codice C, C++ o Java dalla macchina a stati. Con questo approccio, il modello può essere modificato o ampliato e l'utente può semplicemente rigenerare il codice e non deve scrivere codice sorgente semplice.

Forniture

Parti:

  • Arduino (Uno, Mega)
  • Cavo USB
  • Schermo tastiera LCD 16x2

Utensili:

  • Strumenti per diagrammi di stato YAKINDU
  • Eclipse C++ IDE per Arduino

Passaggio 1: l'hardware

Image
Image

Lo schermo della tastiera LCD può essere semplicemente collegato ad Arduino. Ha un display LCD 16x2 e inoltre ha sei pulsanti:

  • Sinistra
  • Destra
  • Su
  • Fuori uso
  • Selezionare
  • (Ripristina)

Ovviamente se ne possono utilizzare cinque. I tasti sono collegati a un partitore di tensione e vengono rilevati utilizzando il Pin A0 a seconda della tensione. Ho usato il software antirimbalzo per rilevarli correttamente.

Passaggio 2: definire come dovrebbe funzionare

Controllo HMI
Controllo HMI

L'applicazione dovrebbe essere in grado di fare tre cose.

  1. Gestire gli statiQui voglio usare i pulsanti per navigare tra cinque stati: Alto, Medio, Basso, Sinistra e Destra
  2. CronometroUn semplice cronometro, che può essere avviato, fermato e azzerato. Dovrebbe essere incrementato ogni 100 millisecondi
  3. ContatoreLa terza parte contiene un semplice contatore avanti/indietro. Dovrebbe essere in grado di contare i numeri positivi e dovrebbe essere ripristinabile

Il menu attivo (o lo stato) verrà visualizzato sul display LCD 16x2 sulla riga superiore. L'applicazione (Stato, Timer o Contatore) verrà visualizzata nella riga inferiore. Per la navigazione devono essere utilizzati i pulsanti sinistro e destro.

Passaggio 3: interfacciare la macchina a stati

I pulsanti verranno antirimbalzati e collegati alla macchina a stati. Possono essere usati come negli eventi nella macchina a stati. Inoltre, vengono definite le operazioni per visualizzare il menu corrente. E sono definite almeno due variabili, una per il timer e una per il contatore.

interfaccia:

// pulsanti come eventi di input nell'evento a destra nell'evento a sinistra nell'evento su nell'evento giù nell'evento seleziona // visualizza i valori specifici dell'HMI operazione displayLCDString (valore: stringa, lunghezza: intero, posizione: intero) operazione displayLCD intero (valore: intero, posizione:integer) operazione clearLCDRow(position:integer) internal: //variables for storage var cnt: integer var timeCnt: integer = 0

Dopo aver generato il codice C++, gli eventi in devono essere antirimbalzati e collegati all'interfaccia. Questo frammento di codice mostra come farlo.

Inizialmente, i pulsanti saranno definiti:

#define NONE 0#define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5

Poi c'è una funzione definita per leggere il pulsante. I valori possono variare, a seconda del produttore dello schermo LCD.

static int readButton() { int risultato = 0; risultato = analogRead(0); if (risultato < 50) { return DESTRA; } if (risultato < 150) { return UP; } if (risultato < 300) { return GI; } if (risultato < 550) { return SINISTRA; } if (risultato < 850) { return SELECT; } restituisce NESSUNO; }

Alla fine, i pulsanti verranno antirimbalzati. Ho ottenuto buoni risultati con 80 ms. Una volta che un pulsante verrà rilasciato, solleverà il secondo in caso.

int oldState = NONE;static void raiseEvents() { int buttonPressed = readButton(); ritardo(80); oldState = buttonPressed; if (oldState != NONE && readButton() == NONE) { switch (oldState) { case SELECT: { stateMachine->raise_select(); rottura; } case SINISTRA: { stateMachine->raise_left(); rottura; } case DOWN: { stateMachine->raise_down(); rottura; } case UP: { stateMachine->raise_up(); rottura; } case RIGHT: { stateMachine->raise_right(); rottura; } predefinito: { pausa; } } } }

Passaggio 4: controllo HMI

Ciascuno stato viene utilizzato per una parte del menu. Ci sono stati secondari, in cui l'applicazione, ad esempio il cronometro, verrà eseguita.

Con questo design, l'interfaccia può essere facilmente ampliata. È possibile aggiungere altri menu semplicemente utilizzando lo stesso modello di progettazione. Leggere un valore di un sensore e visualizzarlo in una quarta voce di menu non è un grosso problema.

Per ora, solo sinistra e destra vengono utilizzate come controllo. Ma su e giù possono essere utilizzati anche come estensione di navigazione nel menu principale. Solo il pulsante di selezione verrà utilizzato per accedere a una voce di menu specifica.

Passaggio 5: gestire gli stati

Gestire gli Stati
Gestire gli Stati

Il menu degli stati degli handle viene utilizzato solo come ulteriore esempio di navigazione. Utilizzando su, giù, destra o sinistra è possibile passare da uno stato all'altro. Lo stato attuale sarà sempre stampato sulla seconda riga del Display LCD.

Passaggio 6: cronometro

Cronometro
Cronometro

Il cronometro è abbastanza semplice. Inizialmente, il valore del timer verrà reimpostato. Il timer può essere avviato utilizzando il pulsante sinistro e alternato utilizzando sinistra e destra. Usando su o giù si azzera il timer. Il timer può anche essere azzerato utilizzando il pulsante di selezione due volte, uscendo dal menu e accedendo nuovamente, poiché il timer verrà azzerato inserendo inizialmente il cronometro.

Passaggio 7: contatore

Contatore
Contatore

Almeno, c'è un contatore implementato. L'ingresso nello stato del contatore azzera il contatore. Può essere avviato utilizzando qualsiasi pulsante, ad eccezione del pulsante di selezione. È implementato come un semplice contatore avanti/indietro, il cui valore non può essere inferiore a 0.

Passaggio 8: simulazione

Passaggio 9: ottenere l'esempio

Puoi scaricare l'IDE qui: YAKINDU Statechart Tools

Una volta scaricato l'IDE, trovi l'esempio tramite File -> N ew -> Esempio

È gratuito per gli hobbisti, ma puoi anche utilizzare una prova di 30 giorni.

Consigliato: