Кому надо, те знают, что такое Futaba SBUS и SBUS2. Сейчас есть системы 18MZ и T14SG с телеметрией, которые используют SBUS2. По некоторым слухам 8J тоже может использовать телеметрию на железном уровне. Возможно, будет апгрейд прошивки и/или новая 8JSuper c протоколом S-FHSSTest (забиваю copyright на название протокола :) и новым приемником, как уже было с 8FG.
Протокол SBUS уже давно известен. Есть описание на русском с ссылками на оригиналы, прошу ознакомиться, если раньше не читали про SBUS. Есть библиотеки для ARDUINO , всякие разные декодеры-приемники от FRSky и прочих китайских товарищей.
Вернемся к SBUS2. Протокол телеметрии тоже не секрет. Многие его применяют, но не публикуют детали. Например - efuelgauge или JLOG2 и т.д. Понятно, они делают для продажи.
Этот парень, Jerry, копает SBUS2 сам. Он собрал и выложил всю необходимую информацию еще в марте, но не спешит с анализом. Не хочется ждать рождества, давайте разберемся сами.
Из его исследований видно, что в SBUS2 изменился последний 25-ый байт пакета. Для SBUS он всегда 00h, в SBUS2 он разный - 04h, 14h, 24h, 34h. Получаются 4 пакета данных с разными последними байтами. Между пакетами остается пустое пространство для телеметрии, примерно 8 миллисекунд. Ребята из JLOG назвали их фреймами (Frame), пусть будет Frame, чтобы не путаться.
Frame0 после пакета c последним байтом 04h, Frame1 после пакета c последним байтом 14h, Frame2 после пакета c последним байтом 24h, Frame3 после пакета c последним байтом 34h. Из мануала 14SG имеем 31 slot для датчиков. По данным с сайта JLOG ( хотя это и так очевидно, если посмотреть осциллографом), имеем такое распределение слотов. Frame 0: Slot 0…7 (slot0 – всегда занят RX-сом), Frame 1: Slot 8…15, Frame 2: Slot 16…23, Frame 3: Slot 24…31.
Примеры.
Slot 0 занят под датчики приемника, он выдает три байта после пакета c последним байтом 04h, один раз 03h C0h 33h, второй раз 03h C4h 4Fh. Смотрите картинки на сайте Jerry http://sbustelemetrysensors.blogspot.ru/ для наглядности.
Как отмечает Jerry, 03h – это номер слота, в данном случае Slot 0. C0h и C4h это переключатель канала, внутреннее и внешнее напряжение. Последний байт – это значение. 33h (десятичное 51) – соответствует 5,1 вольта. 4Fh (десятичное 79) – 7.9v. Передатчик заранее знает форматы данных для датчика в слоте 0. В конкретном случае, перед выводом на экран, передатчик делит значения на 10.
Посмотрим формат данных на примере датчика температуры SBS-01T, установленного в Slot 1 .
Jerry любезно предоставляет такую информацию:
Slot1 - 83h 81h 80h. На экране +29 градусов С.
83h - номер слота. 81h 80h –данные, где 81h младший байт, 80h – старший байт. По каким - то соображениям старший байт начинается с 80h, если будет 70h – нет индикации, на экране “-------“.
Проверим на железе и составим таблицу для SBS-01T.
Как видим, значение могут меняться так:
00h (младший байт данный) 80h (старший байт данных) - на экране “-100” градусов С.
64h (младший байт данный) 80h (старший байт данных) - на экране – “0” градусов С.
FFh (младший байт данный) FFh (старший байт данных) - на экране “+32667” градусов С.
Приемник уже знает, что Slot1 занят датчиком SBS-01T, отнимает 100 от абсолютного значения и выводит на экран. Получаем диапазон на экране от -100 до 32667 градусов С. В мануале для SBS-01T есть предупреждение “!The maximum operating temperature for the SBS-01T is 200С!” Естественно это касается физических свойств самого датчика температуры.
Почему старший байт начинается с 80h? Не знаю. Могу предположить, что для других датчиков это, например полярность. Все датчики, кроме RX, имеют формат - номер слота 1 байт и 2 байта данных. Приемник знает тип датчика в данном слоте и декодирует данные соответствующем образом.
Пример из блога Jerry.
Датчик GPS SBS-01G, занимает восемь слотов, по умолчанию с 8-го по 15-й. Выдает такие данные, первый байт – номер слота ;
13h 53h 1Ah
93h 71h D0h
53h DEh E2h
D3h AFh D7h
33h BFh 00h
B3h 2Eh 30h
73h BCh BBh
F3h E2h AEh
На флешку пишется лог (Jerry счастливый обладатель 18MZ) DISTANCE, SPEED, ALTITUDE, VARIOMETER, LATITUDE, LONGITUDE, TIME(UTC) - 1, 0, 0, 0, N 41:07.8440, W110:34.3932, 22:18:22 соответственно. Получаем 8 слотов, а пишем на флешку 7 значений. Почему? Ответ очевиден, широта и долгота – это большие числа, скорее всего для них используется по 3 или 4 байта. То есть 3 или 4 слота (6-8 байт данных) несут информацию о широте и долготе.
C форматами этого и других датчиков пока не разбирался. Если кто уже разобрался, поделитесь, пожалуйста.
Адрес слота.
На первый взгляд, кажется, что какая-то закономерность есть, но не очень понятная. Если посмотреть в двоичном виде, то все становится на свои места.
Все просто.
Почему номер слота всегда содержит ноль и две единицы в младших (левых) разрядах? Могу предположить, что это команда. По аналогии с системой команд процессоров - “код операции / адрес / данные”. Код 011 означает “запись данных по адресу SlotX”, например. Или команды для конфигурации. Оригинальные датчики имеют идентификатор и уникальный серийный номер. Например, VARIO-F1712 ID - 130. Серийный номер от 0 до 65536 (2 байта). Это применяется для изменения слота датчика и автоматической регистрации на шине. Смотри мануал 14SG страница 103. То есть оригинальный датчик может вести двунаправленный обмен при конфигурации по запросам от TX. Для создания своего датчика это не нужно, мы сами можем установить слот при программировании и будем следить, что бы несколько датчиков не вылезали на шину в одно и то же время.
Про железо.
Железо применяется разное. JLOG2 использует Atmega644P и адаптер для SBUS2.
Схема адаптера выглядит довольно сердито.
В устройстве “SBUS2 Electric Fuel Gauge” стоит PIC контроллер и SN74AUP2G240.
SN74AUP2G240 – весьма симпатичная маленькая штучка, два инвертора с третьим ( высокоимпедансным, извините за выражение) состоянием, как раз для такого случая. Эта микросхема на 3,3 вольта, но у Texas Instruments есть 5-вольтовая версия - SN74LVC2G240. Хочу такую.
Для экспериментов я использовал клон Arduino Nano, пару транзисторов и диод. То, что нашлось в хозяйстве.
Один из транзисторов BC817, второй КТ3102А. Резистор на базе T1 стоит 5 кОм. Выглядит, как кучка мусора на столе. Работает? Ага. Надеюсь, видео доказательств на Youtube не требуется.
Если будет время и желание, сделаю мост I2C - SBUS2. Хочу подцепить Eagle Tree altimeter на SBUS2. Ардуину использовать не буду, у нее какие-то проблемы с delay() и сигналы гуляют по времени если выполняются еще какие-то действия на I2C и т.д. Для программирования жестких таймингов не гадицца (или я не умею : ). Но для экспериментов, что бы занять пару слотов на шине, вполне приемлемо. Послал по ошибке две пачки с одинаковыми адресами (slot1) и разными данными. На экран вылезли данные второй пачки, скорее всего данные первой пачки тоже были приняты, но быстро затерты следующими данными для того же слота. Похоже, что прием данных не зависит от времени, только от адреса слота.
Хорошая идея.
Можно взять I2C выход с EagleTree eLogger и транслировать на SBUS2. Куча EagleTree датчиков подключены к eLogger, в программе Data Recorder указываем нужные данные для вывода на ETPP дисплей, имитируем ETPP как I2C slave, передаем на SBUS2. Получаем - куча датчиков, логгер и телеметрия. Красотища! Теоретически ….
Пока всё
Alex K.