DIY Décodeur SBUS
3 participants
Page 1 sur 1
DIY Décodeur SBUS
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
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
Invité- Invité
Re: DIY Décodeur SBUS
Joli boulot Chapeau
Je connais pas la teensy, le code ressemble à de l'arduino non ?
Sympa ton oscillo
Ouhla je viens d'aller voir le tarif, ça pique un peu quand même
Je connais pas la teensy, le code ressemble à de l'arduino non ?
Sympa ton oscillo
Ouhla je viens d'aller voir le tarif, ça pique un peu quand même
Invité- Invité
Re: DIY Décodeur SBUS
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 !
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 !
Invité- Invité
Re: DIY Décodeur SBUS
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
En fait la taille m'avais trompée.
Je vais m'y intéresser je pense
Invité- Invité
Re: DIY Décodeur SBUS
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
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
Invité- Invité
Re: DIY Décodeur SBUS
De quoi, de qui?? Qui me parle ??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 ?
Sympa ta bestiole !
J'aime bien ton scope aussi !
_________________
Pas de support par MP !! Pour garder l'esprit communautaire, on partage tout sur le forum.
Maintenant que vous avez tout lu, vous pouvez poser vos questions !
OpenTX is user friendly!!! It's just selective about who its friends are....
Re: DIY Décodeur SBUS
Très intéressant le prix !!
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 ??
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 ??
_________________
Pas de support par MP !! Pour garder l'esprit communautaire, on partage tout sur le forum.
Maintenant que vous avez tout lu, vous pouvez poser vos questions !
OpenTX is user friendly!!! It's just selective about who its friends are....
Re: DIY Décodeur SBUS
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.
http://www.amazon.fr/gp/product/B00DR59DQC?psc=1&redirect=true&ref_=oh_aui_detailpage_o00_s00
on arrive au même prix qui est lui H.T.
http://www.amazon.fr/gp/product/B00DR59DQC?psc=1&redirect=true&ref_=oh_aui_detailpage_o00_s00
Invité- Invité
Re: DIY Décodeur SBUS
Ces deux lignes me paraissent incomplètes :
- Code:
voie[1] = ((buf[1]|buf[2]<< & 0x07FF);
...
...
voie[9] = ((buf[12]|buf[13]<< & 0x07FF);
Sacre100- Messages : 1889
Date d'inscription : 30/11/2013
Age : 67
Localisation : Blonay - Suisse
Re: DIY Décodeur SBUS
Voilà la partie original prise dans le FUTABA_SBUS.CPP
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]
- 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
Invité- Invité
Re: DIY Décodeur SBUS
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.
http://www.amazon.fr/gp/product/B00DR59DQC?psc=1&redirect=true&ref_=oh_aui_detailpage_o00_s00
Super ! Merci
C'est le 1102 que tu as ? Tu en es content ?
_________________
Pas de support par MP !! Pour garder l'esprit communautaire, on partage tout sur le forum.
Maintenant que vous avez tout lu, vous pouvez poser vos questions !
OpenTX is user friendly!!! It's just selective about who its friends are....
Re: DIY Décodeur SBUS
@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 !
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
Invité- Invité
Re: DIY Décodeur SBUS
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);
Sacre100- Messages : 1889
Date d'inscription : 30/11/2013
Age : 67
Localisation : Blonay - Suisse
Re: DIY Décodeur SBUS
bien vue il manque le 8 et ) (2xfois)
j'essai de corrigé la haut
.... corrigé c'est bien le forum qui bouffe le 8 )
j'essai de corrigé la haut
.... corrigé c'est bien le forum qui bouffe le 8 )
Invité- Invité
Re: DIY Décodeur SBUS
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.
_________________
Pas de support par MP !! Pour garder l'esprit communautaire, on partage tout sur le forum.
Maintenant que vous avez tout lu, vous pouvez poser vos questions !
OpenTX is user friendly!!! It's just selective about who its friends are....
Re: DIY Décodeur SBUS
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.
_________________
Pas de support par MP !! Pour garder l'esprit communautaire, on partage tout sur le forum.
Maintenant que vous avez tout lu, vous pouvez poser vos questions !
OpenTX is user friendly!!! It's just selective about who its friends are....
Re: DIY Décodeur SBUS
_________________
Pas de support par MP !! Pour garder l'esprit communautaire, on partage tout sur le forum.
Maintenant que vous avez tout lu, vous pouvez poser vos questions !
OpenTX is user friendly!!! It's just selective about who its friends are....
Re: DIY Décodeur SBUS
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
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
blonblon- Messages : 214
Date d'inscription : 25/03/2014
Age : 73
Localisation : pres d'Uzes (Gard)
Re: DIY Décodeur SBUS
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 ;
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 ;
Invité- Invité
Re: DIY Décodeur SBUS
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
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
blonblon- Messages : 214
Date d'inscription : 25/03/2014
Age : 73
Localisation : pres d'Uzes (Gard)
Re: DIY Décodeur SBUS
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 ....
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 ....
Invité- Invité
Re: DIY Décodeur SBUS
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
http://www.rcmf.co.uk/4um/index.php/topic,101234.0.html
J'ai trouvé ceci pour ralentir le flux de données afin d'utiliser des servos standard
http://www.rcmf.co.uk/4um/index.php/topic,101234.0.html
blonblon- Messages : 214
Date d'inscription : 25/03/2014
Age : 73
Localisation : pres d'Uzes (Gard)
Sujets similaires
» [Important] info concernant le Décodeur SBus/CPPM vers PWM
» Servos analogiques compatibles décodeur sbus ?
» Décodeur CPPM/Sbus sur récepteur Archer GR8 ?
» CONFIGURATION D"UN DECODEUR S/BUS
» une vidéo bien utile pour les débutants :-) décodeur S-BUS et programmateur de voie
» Servos analogiques compatibles décodeur sbus ?
» Décodeur CPPM/Sbus sur récepteur Archer GR8 ?
» CONFIGURATION D"UN DECODEUR S/BUS
» une vidéo bien utile pour les débutants :-) décodeur S-BUS et programmateur de voie
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum