Подключение Arduino к приемнику FrSky X8R
Немного о проблемах
Задача — подключение Arduino к приемнику FrSky X8R. Подключим используя протокол SBUS. По аналогии с автомобильной шиной CAN, S.Bus позволяет избавиться от прокладки большого количества проводов: от приемника к каждому сервоприводу. Под эту технологию выпущены специальные приемники, приводы, гироскопы и прочее оборудование. Это не что иное как протокол передачи команд сервоприводам по цифровому последовательному порту. В случае использования с микроконтроллерами S.Bus позволяет полностью избавиться от работы с ШИМ (PWM и PPM сигналы), переложив это на аппаратную часть. Как следствие – упрощение кода, уменьшение загрузки микроконтроллера и увеличение быстродействия.
Проблемы. Протокол SBUS — это инвертированный сигнал, который использует UART для последовательной передачи данных. Для подключения Arduino нужен внешний инвертор, либо не инвертированный сигнал.
Решение задачи
Выбрал сложный путь, без внешнего инвертора, т.е. возьмем не инвертированный сигнал из недр приемника X8R.
- Разбираем приемник.
2. Аккуратно выпаиваем верхнюю плату передатчика. Плата на тонком текстолите, тут нельзя ее перегреть. Добраться надо до инвертора, он как раз под верхней платой выделен красным. Красной точкой помечен вывод инвертора куда надо подпаять провод. Этот будет сигнал SBUS не инвертированный, который поймет Arduino.
3. Обрезать дорожки вокруг вывода SBUS. Если не хотите портить, выводите на внешний разъем.
5.Паяем провод как на фото ниже.
6. Можно запаивать верхнюю плату на место.
7. Собираем корпус.
Прошивка Arduino
На тестах использую Arduino Nano (она используется в контроллере Горыныча).
Схема подключения Тестовый скетч
#include "SBUS.h" #includeSBUS 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.
Видео процесса тестирования