Le forum français des radios FrSKY

DIY Décodeur SBUS

Voir le sujet précédent Voir le sujet suivant Aller en bas

DIY Décodeur SBUS

Message par djsyl le Dim 1 Fév 2015 - 19:29

Bon voilà un nouveau sujet pour l'hiver

Ce weekend je vous ait préparer un décodeur SBUS sur la base d'un teensy 3.1






c'est surtout un exercice de style car les décodeurs existent, mais cette base ouvre plein de possibilitées et permet aussi de d'éviter le problème de rafraichissement trop rapide du modèle du commerce hein Lapin ?

Voila le code

Code:

#include <Servo.h>
#define SBUS Serial1
#define SBUSEvent serialEvent1

int led = 13;
int buf[25];
int voie[18];
int memread;
int cpt;
int ser;

Servo myservo;

void setup() {
  pinMode(led, OUTPUT); // led de controle utiliser sur une réception SBUS
  myservo.attach(3); // connexion d'un servo sur la pin 3 pour essai
  SBUS.begin(100000, SERIAL_8N2_RXINV_TXINV); // activation de la liaison SBUS
  Serial.begin(115200); // activation de la sortie serie pour le debug
}

void loop() {
  // conversion des données SBUS pour les 16 Voies
  recup();
  
  // debug lecture des 16 + 2 voies récuperer sur la sortie serie
   for(int x = 0 ; x < 19 ; x++)
   {
    
    if ( x == 0 ) {
      
      
        if (voie[0] == 0) {
          Serial.print("FS,");  // Failsafe
        }else{
          Serial.print("NO,");  // Normal
        }

    
    }else{  
    Serial.print(voie[x],DEC);
    Serial.print(",");
    } // x == 0
    
   }// for
   Serial.println();

 // ecriture dans de la voie 3 pour la sortie servo
  //ser = map(voie[3], 0, 2048, 0, 180);  
  ser = map(voie[3], -100, +100, 0, 180);
  myservo.write(ser);  
  
  
    delay(100); // un petit delay a ajuster selon ce que l'on fait dans la boucle principale
}

void SBUSEvent() {  // reception de donnée sur la ligne SBUS
digitalWrite(led, HIGH); // on alume la led

  while ( SBUS.available() ) { // tant qu'un octet arrive sur le SBUS
    int val = SBUS.read();  // lecture de l'octet
    
    if  (( memread == 0 ) and ( val == 15)) { // detection de la fin et debut de la trame SBUS (une trame fini par 0 et commence par 15)
      cpt = 0; // remise a zero du compteur dans la trame
    }
    
    memread = val; // memorisation de la dernière valeur reçu
    buf[cpt] = val; // stock la valeur reçu dans le buffer
    cpt +=1;        // incrémente le compteur
    if (cpt == 26) {cpt=0;} // au cas ou on aurait pas reçu les caractères de synchro on reset le compteur
  
  } // fin du while
 
  digitalWrite(led, LOW); //on eteind la led
}

void recup(void){
// récuperation des données SBUS et conversion dans le tableau des voies
// les données SBUS sont sur 8 bits et les données des voies sont sur 11 bits
// il faut donc jouer a cheval sur les octets pour calculer les voies.

  voie[1]  = ((buf[1]|buf[2]<< 8 ) & 0x07FF);
  voie[2]  = ((buf[2]>>3|buf[3]<<5) & 0x07FF);
  voie[3]  = ((buf[3]>>6|buf[4]<<2|buf[5]<<10) & 0x07FF);
  voie[4]  = ((buf[5]>>1|buf[6]<<7) & 0x07FF);
  voie[5]  = ((buf[6]>>4|buf[7]<<4) & 0x07FF);
  voie[6]  = ((buf[7]>>7|buf[8]<<1|buf[9]<<9) & 0x07FF);
  voie[7]  = ((buf[9]>>2|buf[10]<<6) & 0x07FF);
  voie[8]  = ((buf[10]>>5|buf[11]<<3) & 0x07FF);
 
  voie[9]  = ((buf[12]|buf[13]<< 8 ) & 0x07FF);
  voie[10]  = ((buf[13]>>3|buf[14]<<5) & 0x07FF);
  voie[11] = ((buf[14]>>6|buf[15]<<2|buf[16]<<10) & 0x07FF);
  voie[12] = ((buf[16]>>1|buf[17]<<7) & 0x07FF);
  voie[13] = ((buf[17]>>4|buf[18]<<4) & 0x07FF);
  voie[14] = ((buf[18]>>7|buf[19]<<1|buf[20]<<9) & 0x07FF);
  voie[15] = ((buf[20]>>2|buf[21]<<6) & 0x07FF);
  voie[16] = ((buf[21]>>5|buf[22]<<3) & 0x07FF);
  
  ((buf[23]) & 1 )      ? voie[17] = 2047 : voie[17] = 0 ;
  ((buf[23] >> 1) & 1 ) ? voie[18] = 2047 : voie[18] = 0 ;
  
  // detection du failsafe
  if ((buf[23] >> 3) & 1) {
    voie[0] = 0; // Failsafe
  }
    else{
    voie[0] = 1; // Normal
  }
  for(int x = 1; x<19 ; x++){
  voie[x]= (lround(voie[x]/9.92) - 100) ;
  }
  

}





Dernière édition par djsyl le Ven 20 Fév 2015 - 15:07, édité 6 fois
avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par paparomeo le Dim 1 Fév 2015 - 19:52

Joli boulot Chapeau

Je connais pas la teensy, le code ressemble à de l'arduino non ?

Sympa ton oscillo Wink

Ouhla je viens d'aller voir le tarif, ça pique un peu quand même Shocked





avatar
paparomeo

Messages : 136
Date d'inscription : 15/05/2014
Age : 55
Localisation : Montélimar

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par djsyl le Dim 1 Fév 2015 - 20:09

L'environnement de dev pour le teensy est le même que arduino !

On installe une couche en plus teensyduino !

le teensy 3.1 est un peut plus cher mais offre beaucoup d'avantages comme 3 ports série hardware et surtout la possibilité d'inversé les signaux TX/RX ce qui permet dans ce cas de lire en direct le SBUS sans inverseur !

avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par paparomeo le Dim 1 Fév 2015 - 20:57

En effet, je viens de voir qu'au niveau hardware il était pas mal du tout.
En fait la taille m'avais trompée.
Je vais m'y intéresser je pense Wink
avatar
paparomeo

Messages : 136
Date d'inscription : 15/05/2014
Age : 55
Localisation : Montélimar

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par djsyl le Dim 1 Fév 2015 - 22:19

Yes c'est un très bon circuit tailleur si tu regarde RCgroups il l'utilisent beaucoup

j'en suis a 3 applications avec ce même circuit

celle-ci

un décodeur can pour récupérer les infos des naza vers sport taranis

un décodeur mavlink -> Sport pour récupérer les télémétries des pixhawk vers taranis


Petite motif dans le code
ajout des voies numérique 17 et 18 et de l'info failsafe dans la voie 0
avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par LapinFou le Dim 1 Fév 2015 - 22:45

djsyl a écrit:c'est surtout un exercice de style car les décodeurs existent, mais cette base ouvre plein de possibilitées et permet aussi de d'éviter le problème de rafraichissement trop rapide du modèle du commerce hein Lapin ?
De quoi, de qui?? Qui me parle ?? Very Happy
Sympa ta bestiole !

J'aime bien ton scope aussi !
avatar
LapinFou
Modérateur

Messages : 6998
Date d'inscription : 09/09/2014
Age : 42
Localisation : Falaise

http://falaisemodeleclub.fr/

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par djsyl le Dim 1 Fév 2015 - 23:48

Pour le scope c'est [Vous devez être inscrit et connecté pour voir ce lien]
avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par LapinFou le Lun 2 Fév 2015 - 10:04

Très intéressant le prix !! Shocked
Par contre, c'est un 1152 que tu as ?? Tu l'as acheté directement sur ce site ?? Car c'est un site Hollandais, donc pas de douane et vrai garantie.
Tu en es content ? Stable, précis ??
avatar
LapinFou
Modérateur

Messages : 6998
Date d'inscription : 09/09/2014
Age : 42
Localisation : Falaise

http://falaisemodeleclub.fr/

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par djsyl le Lun 2 Fév 2015 - 10:27

Non en fait j'ai acheter sur amazon.fr pas de douane et tva incluse ...

on arrive au même prix qui est lui H.T.

[Vous devez être inscrit et connecté pour voir ce lien]
avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par Sacre100 le Lun 2 Fév 2015 - 10:48

Ces deux lignes me paraissent incomplètes :

Code:

  voie[1]  = ((buf[1]|buf[2]<<  & 0x07FF);
...
...
  voie[9]  = ((buf[12]|buf[13]<<  & 0x07FF);
avatar
Sacre100

Messages : 1889
Date d'inscription : 30/11/2013
Age : 60
Localisation : Blonay - Suisse

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par djsyl le Lun 2 Fév 2015 - 10:53

Voilà la partie original prise dans le FUTABA_SBUS.CPP

Code:

channels[0]  = ((sbusData[1]|sbusData[2]<<  8 ) & 0x07FF);
  channels[1]  = ((sbusData[2]>>3|sbusData[3]<<5) & 0x07FF);
  channels[2]  = ((sbusData[3]>>6|sbusData[4]<<2|sbusData[5]<<10) & 0x07FF);
  channels[3]  = ((sbusData[5]>>1|sbusData[6]<<7) & 0x07FF);
  channels[4]  = ((sbusData[6]>>4|sbusData[7]<<4) & 0x07FF);
  channels[5]  = ((sbusData[7]>>7|sbusData[8]<<1|sbusData[9]<<9) & 0x07FF);
  channels[6]  = ((sbusData[9]>>2|sbusData[10]<<6) & 0x07FF);
  channels[7]  = ((sbusData[10]>>5|sbusData[11]<<3) & 0x07FF); // & the other 8 + 2 channels if you need them
  #ifdef ALL_CHANNELS
  channels[8]  = ((sbusData[12]|sbusData[13]<< 8 )  & 0x07FF);
  channels[9]  = ((sbusData[13]>>3|sbusData[14]<<5) & 0x07FF);
  channels[10] = ((sbusData[14]>>6|sbusData[15]<<2|sbusData[16]<<10) & 0x07FF);
  channels[11] = ((sbusData[16]>>1|sbusData[17]<<7) & 0x07FF);
  channels[12] = ((sbusData[17]>>4|sbusData[18]<<4) & 0x07FF);
  channels[13] = ((sbusData[18]>>7|sbusData[19]<<1|sbusData[20]<<9) & 0x07FF);
  channels[14] = ((sbusData[20]>>2|sbusData[21]<<6) & 0x07FF);
    channels[15] = ((sbusData[21]>>5|sbusData[22]<<3) & 0x07FF);


J'ai pas d'erreur de valeur au décodage de ces voies !!!

attention j'ai décaler les voies de 1 pour mettre le failsafe dans voie[0]


Dernière édition par djsyl le Lun 2 Fév 2015 - 11:24, édité 1 fois
avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par LapinFou le Lun 2 Fév 2015 - 11:02

djsyl a écrit:Non en fait j'ai acheter sur amazon.fr pas de douane et tva incluse ...

on arrive au même prix qui est lui H.T.

[Vous devez être inscrit et connecté pour voir ce lien]

Super ! Merci
C'est le 1102 que tu as ? Tu en es content ?
avatar
LapinFou
Modérateur

Messages : 6998
Date d'inscription : 09/09/2014
Age : 42
Localisation : Falaise

http://falaisemodeleclub.fr/

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par djsyl le Lun 2 Fév 2015 - 11:08

@Lapin oui la version 100Mhz comme le lien amazon

super bien je ne regrette qu'une chose qu'il n’intégre pas de de sérial décodeur ( il y en a dans les serie 2000 mais c'est 4 fois le prix plus l'option )

@sacre100
Par contre faut que je regarde entre futaba et frsky si il y a pas un loup

on se retrouve avec des mini max entre 172 et 1811 au lieu de 0 a 2047 !


Dernière édition par djsyl le Lun 2 Fév 2015 - 11:12, édité 1 fois
avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par Sacre100 le Lun 2 Fév 2015 - 11:12

djsyl a écrit:Voilà la partie original prise dans le FUTABA_SBUS.CPP

Code:

channels[0]  = ((sbusData[1]|sbusData[2]<<  & 0x07FF);
  channels[1]  = ((sbusData[2]>>3|sbusData[3]<<5) & 0x07FF);
  channels[2]  = ((sbusData[3]>>6|sbusData[4]<<2|sbusData[5]<<10) & 0x07FF);
  channels[3]  = ((sbusData[5]>>1|sbusData[6]<<7) & 0x07FF);
  channels[4]  = ((sbusData[6]>>4|sbusData[7]<<4) & 0x07FF);
  channels[5]  = ((sbusData[7]>>7|sbusData[8]<<1|sbusData[9]<<9) & 0x07FF);
  channels[6]  = ((sbusData[9]>>2|sbusData[10]<<6) & 0x07FF);
  channels[7]  = ((sbusData[10]>>5|sbusData[11]<<3) & 0x07FF); // & the other 8 + 2 channels if you need them
  #ifdef ALL_CHANNELS
  channels[8]  = ((sbusData[12]|sbusData[13]<<  & 0x07FF);
  channels[9]  = ((sbusData[13]>>3|sbusData[14]<<5) & 0x07FF);
  channels[10] = ((sbusData[14]>>6|sbusData[15]<<2|sbusData[16]<<10) & 0x07FF);
  channels[11] = ((sbusData[16]>>1|sbusData[17]<<7) & 0x07FF);
  channels[12] = ((sbusData[17]>>4|sbusData[18]<<4) & 0x07FF);
  channels[13] = ((sbusData[18]>>7|sbusData[19]<<1|sbusData[20]<<9) & 0x07FF);
  channels[14] = ((sbusData[20]>>2|sbusData[21]<<6) & 0x07FF);
    channels[15] = ((sbusData[21]>>5|sbusData[22]<<3) & 0x07FF);


J'ai pas d'erreur de valeur au décodage de ces voies !!!

attention j'ai décaler les voies de 1 pour mettre le failsafe dans voie[0]


Je viens d'aller regarder le code original, y'a un petite erreur, surement due au forum, qui bousille  le " << 8 ) ".

Code:

channels[0] = ((sbusData[1]|sbusData[2]<<  8 ) & 0x07FF);
...
...
channels[8] = ((sbusData[12]|sbusData[13]<< 8 )  & 0x07FF);
avatar
Sacre100

Messages : 1889
Date d'inscription : 30/11/2013
Age : 60
Localisation : Blonay - Suisse

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par djsyl le Lun 2 Fév 2015 - 11:14

bien vue il manque le 8 et ) (2xfois)

j'essai de corrigé la haut



.... corrigé c'est bien le forum qui bouffe le Cool 8 )
avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par LapinFou le Lun 2 Fév 2015 - 12:52

djsyl a écrit:@Lapin oui la version 100Mhz comme le lien amazon

super bien je ne regrette qu'une chose qu'il n’intégre pas de de sérial décodeur ( il y en a dans les serie 2000 mais c'est 4 fois le prix plus l'option )

Merci !!

Cela me tente bien.
avatar
LapinFou
Modérateur

Messages : 6998
Date d'inscription : 09/09/2014
Age : 42
Localisation : Falaise

http://falaisemodeleclub.fr/

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par djsyl le Lun 2 Fév 2015 - 14:35

Dans quel série SDS1102 ou dans la série 2000 ?
avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par LapinFou le Lun 2 Fév 2015 - 15:41

Le même que le tien, voir la version juste au-dessus avec 150MHz de bandwidth. Mais ce n'est pas pour tout de suite.
avatar
LapinFou
Modérateur

Messages : 6998
Date d'inscription : 09/09/2014
Age : 42
Localisation : Falaise

http://falaisemodeleclub.fr/

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par djsyl le Lun 2 Fév 2015 - 15:46

Tu va devoir te privé de quel que bon falaisiens
avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par blonblon le Ven 20 Fév 2015 - 14:58

Bonjour

J'ai regarde ce post dans le code il y a ceci que je ne comprend pas, quel est l'utilite de ces deux lignes.

((buf[23]) & 1 ) ? voie[17] = 2047 : voie[17] = 0 ;
((buf[23] >> 1) & 1 ) ? voie[18] = 2047 : voie[17] = 0 ;

Peut on envisager de decoder le SBus en envoyant des valeurs telemetriques simultanement, tout en ayant des elements telemetriques FRSKY
avatar
blonblon

Messages : 220
Date d'inscription : 25/03/2014
Age : 66
Localisation : pres d'Uzes (Gard)

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par djsyl le Ven 20 Fév 2015 - 15:06

en faite dans le protocole Sbus il existe 2 voie numeriques

en plusdes 16, 17 et 18 qui sont du tout ou rien je ne sais si elles sont exploitées en FrSky le fait est quelle existe!

quand au code il y a peut'être une faute sur la dernière ligne qui devrait incrémenté la voie 18 et pas 17

je corrige de suite dans le post !

ça donne donc :

 ((buf[23]) & 1 )      ? voie[17] = 2047 : voie[17] = 0 ;
 ((buf[23] >> 1) & 1 ) ? voie[18] = 2047 : voie[18] = 0 ;
avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par blonblon le Ven 20 Fév 2015 - 18:33

Merci pour ta réponse djsyl

Encore deux questions la voie 0 elle n'est pas utilisée dans le programme
Peut on envisager de décoder le SBus en envoyant des valeurs télèmétriques simultanément, tout en ayant des élèments télémétriques FRSKY
avatar
blonblon

Messages : 220
Date d'inscription : 25/03/2014
Age : 66
Localisation : pres d'Uzes (Gard)

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par djsyl le Ven 20 Fév 2015 - 19:21

oui mais les éléments télémétrie sont a envoyé sur le coté Sport


pour ce qui est de la voie 0 je m'en sert pour noter si on est failsafe ou normal

ici :

      if (voie[0] == 0) {
         Serial.print("FS,");  // Failsafe
       }else{
         Serial.print("NO,");  // Normal
       }

et la :


if ((buf[23] >> 3) & 1) {
   voie[0] = 0; // Failsafe
 }
   else{
   voie[0] = 1; // Normal
 }


ce n'est pas vraiment une voie mais une information ....
avatar
djsyl

Messages : 1322
Date d'inscription : 11/12/2014
Age : 58
Localisation : Yerres (91330)

http://club-aquilon.fr

Revenir en haut Aller en bas

Re: DIY Décodeur SBUS

Message par blonblon le Ven 20 Fév 2015 - 19:30

Je comprend que ce SBus et SmartPort sont deux liaisons différentes, ce que je me demande c'est si le circuit aurait assez de ressources pour gérer les deux flux de données.
J'ai trouvé ceci pour ralentir le flux de données afin d'utiliser des servos standard
[Vous devez être inscrit et connecté pour voir ce lien]
avatar
blonblon

Messages : 220
Date d'inscription : 25/03/2014
Age : 66
Localisation : pres d'Uzes (Gard)

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum