spacer.png, 0 kB

Torna indietro   Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale > Robotica di base > Arduino

Rispondi
 
Strumenti discussione Modalità  visualizzazioe
  #1  
Vecchio 11-01-2016, 17.04.09
bigmike bigmike non è collegato
Robottaro senior
 
Data registrazione: 12-01-2013
Residenza: Treviso
Messaggi: 55
Potenza reputazione: 30
bigmike E' per ora ancora un mistero
Predefinito Lettura ingressi avanzata

Per una volta tanto niente richiesta di aiuto, ma un semplice contributo al forum.
Una semplice utilità da inserire nei nostri sketch, che permette una gestione degli ingressi per così dire avanzata, ottimizzando il codice.

L'idea di base è partita nel dover gestire una serie di pulsanti, ma si adatta ad altre funzionalità, conta impulsi, pulsanti a doppia funzione, pulsanti on/off, ecc.

In sostanza le 5 righe poste all'inizio del 'void loop'
- lettura dello stato dell’ingresso
- confronto dello stato attuale con il precedente tramite operazione XOR
- memorizzazione stato attuale
- calcolo variazione high > low (FALLING)
- calcolo variazione low > high (RISING)

Il contenuto delle variabili resta 'vero' per un singolo ciclo di loop e pertanto non è necessario preoccuparsi di impostare flag di controllo.

Se poi i vari pulsanti sono connessi alla stessa porta di Arduino, modificando lo shetch è possibile ottenere un ulteriore ottimizzazione del codice, leggendo in un colpo solo 8 ingressi e calcolo delle relative variazioni.

Codice:

  #define IngrPin 4
  #define LedPin 13
  
  byte IngrOld;          // stato ingresso precedente
  byte Ingr;             // stato ingresso attuale
  byte IngrX;            // risultato xor logico
  byte IngrDown;         // vero se ingresso high > low (FALLING)
  byte IngrUp;           // vero se ingresso low > high (RISING)

  word Counter;          // a supporto dell'esempio contaimpulsi

// -----------------------------------------------------------------------------------------------

void setup() {
  Serial.begin(9600);
  pinMode (LedPin,OUTPUT);
  pinMode (IngrPin,INPUT_PULLUP);
  Ingr = digitalRead(IngrPin);     // legge nuovo stato ingresso

}

// -----------------------------------------------------------------------------------------------

void loop() {


//-----------------------------------------------------------------------
// Blocco funzionale per aggiornare le variabili

  IngrOld  = Ingr;                     // memorizza stato precedente
  Ingr     = digitalRead(IngrPin);     // legge nuovo stato ingresso
  IngrX    = Ingr ^ IngrOld;           // esegue xor logico
  IngrDown = IngrX & IngrOld;
  IngrUp   = IngrX & Ingr;
//-----------------------------------------------------------------------

// Esempio dell'implemetazione di un semplice contaimpulsi
// Non sono richieste ulteriori operazioni 

  Counter += IngrUp;


// Esempi per intercettare la pressione o rilascio del tasto
// o meglio le transizioni FALLING o RISING

  if (IngrUp){     // RISING 
    Serial.println(" Tasto rilasciato");

    Serial.print(" Counter = "); Serial.println(Counter);
  }

  if (IngrDown){   // FALLING
    Serial.println(" Tasto premuto");

    // Pulsante ON/OFF
    digitalWrite(LedPin,!digitalRead(LedPin));
  }


// Il comando delay successivo l'ho inserito in questo esempio con la
// funzione di "anti-debouncing". Da eliminare nello sketch definitivo

delay (30);
}




Se l'idea vi fosse già nota mi ritiro in buon ordine, altrimenti resto a disposizione per fornire ulteriori dettagli sull’uso.

Rispondi citando
  #2  
Vecchio 15-01-2016, 01.01.18
L'avatar di aldofad
aldofad aldofad non è collegato
Robottaro sostenitore
 
Data registrazione: 22-01-2007
Residenza: Treviso
Età : 43
Messaggi: 936
Potenza reputazione: 86
aldofad Il suo nome è noto a tutti
Invia un messaggio via MSN a aldofad Send a message via Skype™ to aldofad
Predefinito

Manca il debounce, vedi esempio https://www.arduino.cc/en/Tutorial/Debounce

Prima di gestire 5 pulsanti rendi il codice OOP
Rispondi citando
  #3  
Vecchio 15-01-2016, 12.47.00
bigmike bigmike non è collegato
Robottaro senior
 
Data registrazione: 12-01-2013
Residenza: Treviso
Messaggi: 55
Potenza reputazione: 30
bigmike E' per ora ancora un mistero
Predefinito

Citazione:
Orginalmente inviato da aldofad Visualizza messaggio
Manca il debounce, vedi esempio https://www.arduino.cc/en/Tutorial/Debounce

Prima di gestire 5 pulsanti rendi il codice OOP
Non è scopo del mio suggerimento entrare nel merito dei problemi legati al debounce.

Ho inserito quel "delay(30);" perchè il codice dell'esempio è talmente rapido che sicuramente per chi va a testarlo si ritroverà detti problemi.

Scusa l'ignoranza cosa si intendi "rendi il codice OOP"?

Ultima modifica di bigmike : 15-01-2016 alle ore 15.15.05
Rispondi citando
  #4  
Vecchio 15-01-2016, 15.32.52
L'avatar di aldofad
aldofad aldofad non è collegato
Robottaro sostenitore
 
Data registrazione: 22-01-2007
Residenza: Treviso
Età : 43
Messaggi: 936
Potenza reputazione: 86
aldofad Il suo nome è noto a tutti
Invia un messaggio via MSN a aldofad Send a message via Skype™ to aldofad
Predefinito

Usare un delay per sopperire al debounce, non e' proprio il massimo.

OOP=Object Oriented Programming
Rispondi citando
  #5  
Vecchio 15-01-2016, 18.26.09
bigmike bigmike non è collegato
Robottaro senior
 
Data registrazione: 12-01-2013
Residenza: Treviso
Messaggi: 55
Potenza reputazione: 30
bigmike E' per ora ancora un mistero
Predefinito

Non capisco il senso di insistere in questa osservazione.

L'oggetto del post sono le prime righe del programma del mio esempio, perchè di esempio si tratta.
Ogni utente pertanto è libero di risolvere il problema del debounce come meglio crede via softwareo hardware.

Con il mio intervento speravo di aprire un confronto costruttivo sulle possibilità della mia soluzione, la facilità con cui si riesce ad implementare un contaimpulsi piuttosto che un pulsante ad azione trattenuta per un certo tempo, ecc.

Non mi aspettavo di certo di dover affrontare sterili confronti sull'uso del delay.

Io per primo evito l'uso del delay nella versione definitiva, confinandone l'uso solo in fase di debug e sviluppo.
Rispondi citando
  #6  
Vecchio 16-01-2016, 02.18.06
L'avatar di aldofad
aldofad aldofad non è collegato
Robottaro sostenitore
 
Data registrazione: 22-01-2007
Residenza: Treviso
Età : 43
Messaggi: 936
Potenza reputazione: 86
aldofad Il suo nome è noto a tutti
Invia un messaggio via MSN a aldofad Send a message via Skype™ to aldofad
Predefinito

Per contare impulsi si usa l'interrupt, se disponibile
Rispondi citando
  #7  
Vecchio 16-01-2016, 16.32.55
bigmike bigmike non è collegato
Robottaro senior
 
Data registrazione: 12-01-2013
Residenza: Treviso
Messaggi: 55
Potenza reputazione: 30
bigmike E' per ora ancora un mistero
Predefinito

Ho il sospetto che da parte tua non ci sia la benchè minima voglia di discutere l'argomento, ma ......
Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione
Modalità  visualizzazioe

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code è Attivato
Le smilies sono Attivato
[IMG] è Attivato
Il codice HTML è Disattivato

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
AND tra due ingressi scollegato Arduino 19 23-12-2013 14.30.25
Ingressi analogici cpc P. in C, C++ 3 03-04-2012 12.41.27
Ingressi TTL e ST chiccow Forum generale 3 11-04-2008 15.36.55
Elettronica generale..... avanzata marnic Elettronica 3 12-09-2005 20.30.06
Gestione ingressi PIC MarkNitro P. in C, C++ 2 30-01-2003 16.35.00


Tutti gli orari sono GMT. Adesso sono le: 15.00.54.


Basato su: vBulletin Versione 3.8.8
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Realizzazione siti web Cobaltica Foligno
spacer.png, 0 kB