BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   Bussola elettronica CMPS10 + Arduino (https://www.baronerosso.it/forum/circuiti-elettronici/259563-bussola-elettronica-cmps10-arduino.html)

franz64 23 agosto 12 15:02

Bussola elettronica CMPS10 + Arduino
 
Salve a tutti,
stò interfacciando una bussola elettronica compensata modello CMPS10 ad un micro Arduino e non riesco a risolvere un problema. Premetto che il micro e il sensore dialogano perfettamente e riesco a vedere a monitor i gradi inviati dalla bussola.
La mia necessità è di poter contare il numero di giri che il velivolo dove è installata la bussola può fare. La bussola invia un dato che va da 0 a 359 gradi; quando però viene completato un giro no so come memorizzare questo dato stessa cosa quando da un giro compiutosi passa ad uno parziale. In parole povere io vorrei avere un contatore che si incrementa ogni volta che da 359 si passa a 0 e si decrementa quando da 0 si passa a 359. Ringrazio anticipatamente tutti.
Francesco

romoloman 23 agosto 12 20:27

Citazione:

Originalmente inviato da franz64 (Messaggio 3353313)
Salve a tutti,
stò interfacciando una bussola elettronica compensata modello CMPS10 ad un micro Arduino e non riesco a risolvere un problema. Premetto che il micro e il sensore dialogano perfettamente e riesco a vedere a monitor i gradi inviati dalla bussola.
La mia necessità è di poter contare il numero di giri che il velivolo dove è installata la bussola può fare. La bussola invia un dato che va da 0 a 359 gradi; quando però viene completato un giro no so come memorizzare questo dato stessa cosa quando da un giro compiutosi passa ad uno parziale. In parole povere io vorrei avere un contatore che si incrementa ogni volta che da 359 si passa a 0 e si decrementa quando da 0 si passa a 359. Ringrazio anticipatamente tutti.
Francesco

Il discorso è semplice e complesso allo stesso tempo...
suppongo tu abbia una funzione "leggibussola" chiamata da qualche interrupt
Codice:


int16_t giri=0;

void leggibussola() {
  static int16_t oldheading=-1;
  int16_t actualheading=gpsheading(); //gpsheading la funzione che legge l'heading
  if (oldheading!=-1) {
    if ((oldheading-actualheading)>350) {
      giri++;
    } else if ((actualheading-oldheading)>350) {
      giri--;
    }
  } else {
    // inizializziamo la direzione iniziale
    oldheading=actualheading;
  }
  oldheading=actualheading;
}

Tuttavia il codice sopra ha problemi di possibili rimbalzi attorno allo 0
allora è possibile aggirare il problema vedendo se si è passati almeno per i 180.

Codice:

#define false=0
#define true=1
int16_t giri=0;

void leggibussola() {
  static int16_t oldheading=-1;
  static bool thru180=false;
  int16_t actualheading=gpsheading(); //gpsheading la funzione che legge l'heading
  if (actualheading>120 && actualheading<<240) {
    thru180=true;
  }
  if (oldheading!=-1) {
    if (((oldheading-actualheading)>350) & thru180) {
      giri++;
      thru180=false;
    } else if (((actualheading-oldheading)>350) && thru180) {
      giri--;
      thru180=false;
    }
  } else {
    // inizializziamo la direzione iniziale
    oldheading=actualheading;
  }
  // aggiorniamo la posizione precedente
  oldheading=actualheading;
}

E' scritto in pseudo C ma non dovrebbe essere difficile adattarlo ad arduino.

franz64 26 agosto 12 11:47

Ringrazio moltissimo romoloman per il suo aiuto. Funziona.
Ancora grazie
Francesco

romoloman 26 agosto 12 12:29

Citazione:

Originalmente inviato da franz64 (Messaggio 3357026)
Ringrazio moltissimo romoloman per il suo aiuto. Funziona.
Ancora grazie
Francesco

ps: vedo ora che mi ero dimenticato una & nel primo if ma per puro culo funziona lo stesso essendo entrambi bool..


Tutti gli orari sono GMT +2. Adesso sono le 13:19.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002