S.Bus with Arduino

Created by: Ben Davidson

This page contains a brief overview of the S.Bus protocol and how to read it using an Arduino.

S.Bus Protocol

S.Bus is primarily used to control Futaba S.Bus digital servos, but it can also be used to send data to certain flight controllers such as the Pixhawk. The following links have more information:

Futaba’s S.Bus Explanation Reverse Engineering SBUS

Reading S.Bus with Arduino

To read the S.Bus signal with an Arduino, the signal must first be inverted. This is achieved using a transistor inverter made from a 2N3904 transistor (Q1) and 1k resistors (R1 and R2).

(Image Source: http://www.ernstc.dk/arduino/pic/inverter_sbus.jpg) The “RX Arduino” node on the above schematic should be connected to a serial RX pin on the Arduino.

To actually read the S.Bus signal, we will use the FUTABA_SBUS library. It works, but it has almost no comments or other documentation. By default, it blindly assumes that you are using an Arduino Mega and have connected the inverted signal to RX1 (pin 19), although this pin can be changed by editing line 12 of the FUTABA_SBUS.h file as shown below. You can also choose to read channels other than 1-8 by uncommenting line 13.

#include <FUTABA_SBUS.h>
#include <Streaming.h>


void setup(){

void loop(){
  if (sBus.toChannels == 1){
    sBus.toChannels = 0;
  • The UpdateServos() command is unnecessary if you simply want to read the channel values.
  • The Streaming library is unnecessary and is only used to simplify serial print statements.
  • Channel values are stored in the channels array and can be accessed using channels[channel_of_interest]. Be aware that this is a zero-indexed array.

Safety warnings

  • There are no guarantees about the reliability of this setup. Don’t use it in safety-critical applications.

Other notes/See also

Arduino Forum Thread about S.BUS

Was this article helpful? Votes: 0