Подключение Arduino к приемнику FrSky X8R

Немного о проблемах

Задача — подключение Arduino к приемнику FrSky X8R. Подключим используя протокол SBUS. По аналогии с автомобильной шиной CAN, S.Bus позволяет избавиться от прокладки большого количества проводов: от приемника к каждому сервоприводу. Под эту технологию выпущены специальные приемники, приводы, гироскопы и прочее оборудование. Это не что иное как протокол передачи команд сервоприводам по цифровому последовательному порту. В случае использования с микроконтроллерами S.Bus позволяет полностью избавиться от работы с ШИМ (PWM и PPM сигналы), переложив это на аппаратную часть. Как следствие – упрощение кода, уменьшение загрузки микроконтроллера и увеличение быстродействия.

Проблемы. Протокол SBUS — это инвертированный сигнал, который использует UART для последовательной передачи данных. Для подключения Arduino нужен внешний инвертор, либо не инвертированный сигнал.

 

Решение задачи

Выбрал сложный путь, без внешнего инвертора, т.е. возьмем не инвертированный сигнал из недр приемника X8R.

  1. Разбираем приемник.

ПРиемник без корпуса

ПРиемник без корпуса

2. Аккуратно выпаиваем верхнюю плату передатчика. Плата на тонком текстолите, тут нельзя ее перегреть. Добраться надо до инвертора, он как раз под верхней платой выделен красным. Красной точкой помечен вывод инвертора куда надо подпаять провод. Этот будет сигнал SBUS не инвертированный, который поймет Arduino.

3. Обрезать дорожки вокруг вывода SBUS. Если не хотите портить, выводите на внешний разъем.

5.Паяем провод как на фото ниже.

6. Можно запаивать верхнюю плату на место.

7. Собираем корпус.

Прошивка Arduino

На тестах использую Arduino Nano (она используется в контроллере Горыныча).

Схема подключенияСхема подключения Тестовый скетч

#include "SBUS.h"
#include 
SBUS x8r(Serial);
Servo myservo1;
Servo myservo2;

// channel, fail safe, and lost frames data
uint16_t channels[16];
bool failSafe;
bool lostFrame;

void setup() {
 // Serial.begin(115200);
  // begin the SBUS communication
   x8r.begin(); //инициализация sbus
   myservo1.attach(4); // инициализация сервы 1
   myservo2.attach(5); // инициализация сервы 1
}

void loop() {

  // look for a good SBUS packet from the receiver
  
  if(x8r.read(&channels[0], &failSafe, &lostFrame)){

myservo1.writeMicroseconds(channels[0]); //крутим серву 1
myservo2.writeMicroseconds(channels[1]); //крутим серву 2

if (channels[9]==172){
  digitalWrite(6, HIGH);}else {digitalWrite(6, LOW);}  //включаем светодиод 1
  
if (channels[8]==172){
  digitalWrite(7, HIGH);}else digitalWrite(7, LOW);//включаем светодиод 2
  }
}

 

Библиотека SBUS-master
Во время прошивки необходимо отключить SBUS от Arduino Nano в противном случает не будет прошиваться.  Прошили подключаем обратно провод SBUS и наслаждаемся.

Мной опробована работа также на Arduino Mega 2560, на ней лучше играться чем на Nano. У МЕГИ не один UART и поэтому можно выводить данные в порт. С Nano так не получится с данной библиотекой, т.к. UART занят шиной SBUS.

 

Видео процесса тестирования