Seit Version 0.88 der FC-Firmware kann man Futabas S.BUS-Empfänger, wie den im Shop erhältlichen R6203SB, verwenden.

Allerdings wird dies von Haus aus erst ab der FC 2.1 unterstützt, vermutlich weil die dafür notwendige Software in der kleineren CPU (ATmega644) der vorigen FC-Revisionen nicht mehr reinpaßt.

Mit etwas Bastelei und einer selbst kompilierten Firmware (oder durch Umrüstung der FC 2.0 auf den ATmega1280) läßt sich dies aber dennoch bewerkstelligen, s.u.

Futaba S.BUS an der FC v2.1

Die FC 2.1 ist schon vorbereitet für den Einsatz von S.BUS-Empfängern. Wie das geht, steht in der Anleitung zur FC ME 2.1

Futaba S.BUS an der FC v2.0

Hinweis: Dies ist eine Bastellösung, die nicht offiziell von HiSystems GmbH unterstützt wird. Insofern gilt: Auf eigene Gefahr!

Dieser Artikel wurde von tempolo erstellt, und er beantwortet auch gern Fragen hierzu.

Elektrischer Anschluß

Die Datenleitung des Empfängers wird am Pin3 des Steckers SV1 auf der FC angeschlossen. Pin3 findet sich neben Pin1 auf der Oberseite der Platine, und ist hier mit RxD (eigentlich: RxD1) bezeichnet. Die Diode sollte aber nicht angelötet sein. Auch wenn dort das Kabel zur NC angeschlossen ist - diese Leitung ist NC-seitig nicht belegt.

Weiterhin werden Masse (GND) und 5V für den Empfänger benötigt. Diese kann man z.B. von SV4, Pin 3 (5V) und Pin 5 (GND) abgreifen.

Firmware-Anpassungen

Hinweis: Statt zu versuchen, die Firmware für den ATmega644 anzupassen, wie hier beschrieben, kann man auch gegen den ATmega1280 austauschen (lassen) - den gibt's im Shop, und evtl. kann man die Umrüstung auch von HiSystems vornehmen lassen. Dann kan man sich den ganzen Kram mit der Software-Anpassung hier sparen und einfach die aktuelle Firmware wie bei der FC 2.1 installieren. Dann muss man nur noch mit dem MK-Tool einstellen, dass der Empfänger das S.BUS-Protokoll benutzt.


Die notwendigen Änderungen sind gering, weil eigentlich schon aller notwendiger Code existiert, der jedoch beim ATmega644 derzeit nicht verwendet wird.

Um die Firmware nach den Änderungen zu verwenden, muß sie mit WinAVR übersetzt werden (Versuche mit CrossPack-AVR f. OSX schlugen fehl - zwar ließ sich die Firmware damit erzeugen, lief dann aber nicht stabil), und dann wie üblich per MK-Tool auf die FC installiert werden.

Die Änderungen an den Dateien sind im Folgenden aufgeführt (basierend auf "V0.88n"):

user_receiver.c sieht neu so aus:

#include "sbus.h"

void User_Receiver_Init(void) {
  SbusUartInit();
};

void User_RX_Parser(unsigned char udr) {
  SbusParser(udr);
};

In sbus.h und sbus.c sind Zeilen wie folgt auszuklammern:

//#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))

...

//#endif

Ebenso sind die gleichen Zeilen um den Aufruf von "ProcessSBus" wie folgt auszuklammern:

//#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__))
  if(NewSBusData) ProcessSBus();  
  else
//#endif

Finally, in the makefile make sure it compiles for the ATmega644:

#MCU = atmega1284p
MCU = atmega644p

and also fix the version number (it should have been 13 for "o" but is 12 for "n")

VERSION_PATCH    =  13

Damit wäre eigentlich alles fertig. Leider wird damit der Code 12 Byte zu lang und läßt sich nicht an die FC übertragen.

Also ist noch etwas manuelle Code-Optimierung vonnöten (die aber die Funktionalität des Programms nicht beeinflußt). Hier ein Vorschlag:

In fc.c diese Zeilen finden:

if(tmp_long >  (long) FromNaviCtrl_Value.Kalman_MaxFusion)  tmp_long  = (long) FromNaviCtrl_Value.Kalman_MaxFusion;
if(tmp_long <  (long)-FromNaviCtrl_Value.Kalman_MaxFusion)  tmp_long  = (long)-FromNaviCtrl_Value.Kalman_MaxFusion;
if(tmp_long2 > (long) FromNaviCtrl_Value.Kalman_MaxFusion)  tmp_long2 = (long) FromNaviCtrl_Value.Kalman_MaxFusion;
if(tmp_long2 < (long)-FromNaviCtrl_Value.Kalman_MaxFusion)  tmp_long2 = (long)-FromNaviCtrl_Value.Kalman_MaxFusion;

und durch diese ersetzen:

long kmf = FromNaviCtrl_Value.Kalman_MaxFusion;
if(tmp_long >  (long) kmf)  tmp_long  = (long) kmf;
if(tmp_long <  (long)-kmf)  tmp_long  = (long)-kmf;
if(tmp_long2 > (long) kmf)  tmp_long2 = (long) kmf;
if(tmp_long2 < (long)-kmf)  tmp_long2 = (long)-kmf;

Sollte das nicht reichen, kann man einige Bytes einsparen, indem man die vielen Statusmeldungen findet und deren Texte verkürzt. Dazu einfach in den Quellen nach "printf" suchen.

Am Ende muss man dann in der Kopter-Konfiguration unter "Kanäle", "Empfänger wählen", auf "Benutzer" (statt "S.BUS") einstellen, damit diese Routinen benutzt werden.

Viel Erfolg!