dans un projet où je manque cruellement de place, j'ai pensé utiliser un arduino pour décoder le SBus. En clair, avec un seul fil qui va du récepteur (port sbus) à l'arduino, on reçoit les 16 voies de la radiocommande (une FrSky dans mon cas mais ca ne change rien, la librairie s'appelle d'ailleurs Futaba...), et on en fait ce qu'on veut.
L'idée principale, c'est d'extraire les voies, les envoyer aux servos, et en plus de gérer les phares, clignos, ... Genre je vais en marche arrière, j'envoie le signal au vario et j'allume le phare ad-hoc. Je sais que certains vario font cela nativement, mais sur un vario brushless... Un arduino nano coûte 5€, donc moins cher qu'un PS4xx , il suffit de le programmer un peu.
Il existe un libraire qui fait cela très bien:
https://github.com/mikeshub/FUTABA_SBUS
2 coups de cuillère à pot, et on lit les signaux:
Code : Tout sélectionner
#include <FUTABA_SBUS.h>
#include <Servo.h>
//Manage PWM Signals
const int PWMMin = 170;
const int PWMMax = 1800;
const int AngleMin = 5;
const int AngleMax = 175;
//Decode SBUS
FUTABA_SBUS sBus;
//Store canal value
struct channel {
unsigned long when;
int pwmvalue;
int angle;
byte b;
};
Servo myservo[6];
channel channels[16];
void setup(){
sBus.begin();
myservo[0].attach(3);
myservo[1].attach(5);
myservo[2].attach(6);
myservo[3].attach(9);
myservo[4].attach(10);
myservo[5].attach(11);
}
void loop(){
delay(300);
sBus.FeedLine();
if (sBus.toChannels == 1){
sBus.UpdateServos();
sBus.UpdateChannels();
sBus.toChannels = 0;
for (int x; x<16; x++) {
channels[x].when = millis();
channels[x].pwmvalue = sBus.channels[x];
channels[x].angle = pwmToDeg(channels[x].pwmvalue);
}
myservo[0].write(channels[0].angle);
myservo[1].write(channels[0].angle);
myservo[2].write(channels[2].angle);
myservo[3].write(channels[12].angle);
}
}
int pwmToDeg(int pwmvalue){
return map(pwmvalue, PWMMin, PWMMax, AngleMin, AngleMax);
}