qczek lrs – 433mhz 1w (30dbm) lora rc link with telemetry - новая народная?
А не проще Oled дисплей напрямую подключить к i2c контроллера и получить тоже самое. Inav это умеет.
Где? На ретрансляторе?
Есть идея воткнуть ардуинку буфером между mavlink tx модуля и блютус с дисплеем, парсить протокол, типа резервный вариант инфы. Отображать ток последнее достоверное, может даже в епром писать… Что думаете?
Тоже давно думаю об этом. Координаты последние, напряжение там… и т.д… Как у Кросфайр 😃)
Но в 168ю мегу не лезет парсер протокола, надо 328ю…
Что за библиотека? Тоже хочу в ретранслятор встроить OLED
Начал с этого: locarbftw.com/understanding-the-arduino-mavlink-li…
Без посылки запроса ток
Продолжу уже после сборки квадрика, буду сразу стараться на 433 его посадить. Мегу эту хотел заюзать для тбекона грин, теперь в раздумьях, что важнее)
Новая пока дойдет…
Тоже хочу в ретранслятор встроить OLED
Предлагаю объеденится. Что есть:
- библиотека для олед работает, буковки есть
- библиотека для парсинга мавлинк компилится, в основах вроде разобрался. Пока нет возможности подключить к контроллеру, но скоро
Итак, qczek восстанавливает эти msg_id (сообщения) мавлинка с inav: HEARTBEAT, ATTITUDE, POSITION_INT, SYS_STATUS, RC_CHANNELS_RAW
Вот полный список оных: groups.google.com/forum/#!topic/mavlink/1zgHUM67E-…
В библиотеке на каждый пакет заведен свой файлик h в /common, например из примера выше это mavlink_msg_gps_raw_int.h, там можно посмотреть структуру, ну и процедуру, которая парсит данные и сливает в эту структуру, например mavlink_msg_gps_raw_int_decode.
Однако, с этим мы уже пролетаем - этот пакет qczek не передает. Передает видимо MAVLINK_MSG_ID_GLOBAL_POSITION_INT 33, что описан в mavlink_msg_global_position_int.h
Уже из этого пакета мы получаем
uint32_t time_boot_ms; ///< Timestamp (milliseconds since system boot)
int32_t lat; ///< Latitude, expressed as * 1E7
int32_t lon; ///< Longitude, expressed as * 1E7
int32_t alt; ///< Altitude in meters, expressed as * 1000 (millimeters), above MSL
int32_t relative_alt; ///< Altitude above ground in meters, expressed as * 1000 (millimeters)
int16_t vx; ///< Ground X Speed (Latitude), expressed as m/s * 100
int16_t vy; ///< Ground Y Speed (Longitude), expressed as m/s * 100
int16_t vz; ///< Ground Z Speed (Altitude), expressed as m/s * 100
uint16_t hdg; ///< Compass heading in degrees * 100, 0.0…359.99 degrees. If unknown, set to: 65535
Теперь полезен будет MAVLINK_MSG_ID_SYS_STATUS 1
uint32_t onboard_control_sensors_present; ///< Bitmask showing which onboard controllers and sensors are present. Value of 0: not present. Value of 1: present. Indices: 0: 3D gyro, 1: 3D acc, 2: 3D mag, 3: absolute pressure, 4: differential pressure, 5: GPS, 6: optical flow, 7: computer vision position, 8: laser based position, 9: external ground-truth (Vicon or Leica). Controllers: 10: 3D angular rate control 11: attitude stabilization, 12: yaw position, 13: z/altitude control, 14: x/y position control, 15: motor outputs / control
uint32_t onboard_control_sensors_enabled; ///< Bitmask showing which onboard controllers and sensors are enabled: Value of 0: not enabled. Value of 1: enabled. Indices: 0: 3D gyro, 1: 3D acc, 2: 3D mag, 3: absolute pressure, 4: differential pressure, 5: GPS, 6: optical flow, 7: computer vision position, 8: laser based position, 9: external ground-truth (Vicon or Leica). Controllers: 10: 3D angular rate control 11: attitude stabilization, 12: yaw position, 13: z/altitude control, 14: x/y position control, 15: motor outputs / control
uint32_t onboard_control_sensors_health; ///< Bitmask showing which onboard controllers and sensors are operational or have an error: Value of 0: not enabled. Value of 1: enabled. Indices: 0: 3D gyro, 1: 3D acc, 2: 3D mag, 3: absolute pressure, 4: differential pressure, 5: GPS, 6: optical flow, 7: computer vision position, 8: laser based position, 9: external ground-truth (Vicon or Leica). Controllers: 10: 3D angular rate control 11: attitude stabilization, 12: yaw position, 13: z/altitude control, 14: x/y position control, 15: motor outputs / control
uint16_t load; ///< Maximum usage in percent of the mainloop time, (0%: 0, 100%: 1000) should be always below 1000
uint16_t voltage_battery; ///< Battery voltage, in millivolts (1 = 1 millivolt)
int16_t current_battery; ///< Battery current, in 10*milliamperes (1 = 10 milliampere), -1: autopilot does not measure the current
uint16_t drop_rate_comm; ///< Communication drops in percent, (0%: 0, 100%: 10’000), (UART, I2C, SPI, CAN), dropped packets on all links (packets that were corrupted on reception on the MAV)
uint16_t errors_comm; ///< Communication errors (UART, I2C, SPI, CAN), dropped packets on all links (packets that were corrupted on reception on the MAV)
uint16_t errors_count1; ///< Autopilot-specific errors
uint16_t errors_count2; ///< Autopilot-specific errors
uint16_t errors_count3; ///< Autopilot-specific errors
uint16_t errors_count4; ///< Autopilot-specific errors
int8_t battery_remaining; ///< Remaining battery energy: (0%: 0, 100%: 100), -1: autopilot estimate the remaining battery
отсюда мы вытащим батарейку.
Проблема: нет готового значения количества спутников… судя по описанию того, что сейчас пропускает qczek
А скорости размазаны по xyz и в м/сек, надо видимо подумать, какую брать… видимо по x, то есть
packet.vx*3.6
итого пока получается что то такое
#include <Wire.h>
#include “SSD1306Ascii.h”
#include “SSD1306AsciiWire.h”
#include <mavlink.h>#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire oled;mavlink_message_t msg;
mavlink_status_t status;
//__mavlink_sys_status_t
int8_t battery_remaining;
uint8_t voltage_battery;
int16_t current_battery;
//__mavlink_global_position_int_t
int32_t lat,lon,alt,relative_alt;
int16_t vx, vy, vz;
uint16_t hdg;//------------------------------------------------------------------------------
void setup() {
Wire.begin();
Wire.setClock(400000L);
oled.begin(&Adafruit128x32, I2C_ADDRESS);
oled.clear();
oled.setFont(font8x8);
oled.set2X();
oled.println(“WAIT FOR”);
oled.println(“MAVLINK”);
oled.set1X();
//
Serial.begin(57600);
}
//------------------------------------------------------------------------------
void loop() {
while(Serial.available()) {
uint8_t c= Serial.read();
Serial.write©;
if(mavlink_parse_char(MAVLINK_COMM_0, c, &msg, &status)) {
switch(msg.msgid) {
case MAVLINK_MSG_ID_GLOBAL_POSITION_INT: {
mavlink_global_position_int_t packet;
mavlink_msg_global_position_int_decode(&msg, &packet);
if(packet.hdg == 65535) packet.hdg = 0;
lat = packet.lat;
lon = packet.lon;
alt = packet.alt;
relative_alt = packet.relative_alt;
vx = packet.vx;
vy = packet.vz;
vy = packet.vz;
hdg = packet.hdg;
}
case MAVLINK_MSG_ID_SYS_STATUS: {
__mavlink_sys_status_t packet;
mavlink_msg_sys_status_decode(&msg, &packet);
battery_remaining = packet.battery_remaining;
voltage_battery = packet.voltage_battery;
current_battery = packet.current_battery;
}
break;
}//switch
oled.clear();
oled.setFont(font5x7);
oled.println((String)“GPS:”+lat+(String)" “+lon);
oled.println((String)“SPEED:”+vx*3.6+(String)” ALT:“+relative_alt);
oled.println((String)“HDG:”+hdg+(String)” V:“+voltage_battery/100+(String)” R: “+battery_remaining+(String)”%");
oled.println((String)“BAT: 6.8v 76% ||||_”);
}//if
}//while
}
Едрит, оно парсит протокол! Надпись wait for mavlink из скетча исчезает ток при успешном парсинге хоть одного сообщения
Ну и надо это по хорошему на таймер перевесить, наверное, чтоб затыков с пересылкой в тх не было. Либо вообще тх не юзать, rx ардуины и бт модуля вместе скрутить да и все.
Там 16,4 мм получается . Середина 433.450 мгц примерно
Вы миллиметры с сантиметрами не попутали?
ну да 16,4 см, при условии, что частоты по умолчанию не трогать.
Судя по чейнжлогам старых версий, поддерживается больше messages от mavlink, чем написано. Думаю, я как подсоберу в кучу всё, посмотрю что приходит через qczek телеметрию.
ну да 16,4 см, при условии, что частоты по умолчанию не трогать.
Я на 1мгц все пока задрал
Ну и надо это по хорошему на таймер перевесить, наверное, чтоб затыков с пересылкой в тх не было.
TX вообще не использовать. Телеметрия же однонаправленная. К тому же если использовать s.bus, то TX занят.
Главное принимать координаты и писать их в EEPROM. В случае краша будут последние координаты. Информацию писать при включении пока не будет получен первый пакет.
Да, логика хорошая. Я ещё мечтаю прикрутить компас, вычислять азимут между домашними координатами и uav, и сервой поворачивать антенну)
В eeprom тоже много писать вредно, правильнее будет это делать при отключении питания, пока конденсатор питает плату отдельно, через диод. Пока питание есть - он показывает полученные последние координаты. При отключении батареи пишет в епром их, при включении показывает
Можно вообще сделать меню и настраивать ретранслятор без ПК 😃))
Можно вообще сделать меню и настраивать ретранслятор без ПК 😃))
Давайте браться) в 328 меге места валом, 40% пока занято)
RSSI в режиме “pocket loss” практически не имеет линейности,99% мгновенно переходят в FS,м.б. дело в проходящей радиотрассе.Отлетал на 7км,8ххМгц пока радует,потери связи были кратковременные в одном месте.
я правильно понимаю, что на приемнике (на коптере) CPPM снимается с модуля с пина AUX, а если настроен конфигураторм sbus - то с TX?
Всегда на приемнике снимается сигнал с AUX
Кстати там желательно снимать по протоколу S.BUS. CPPM у меня почему то не пашет на приемнике. Хотя на передатчике именно так приходит. Если отключить режим молчания, то начинает CPPM работать.
Аппаратура никак не доедет, но мавлинк сквозь lsr уже идёт. Внизу тоже буду cppm, вверху под sbus приготовил
А rssi лучше аналоговый развести проводком или софтово можно, работает ли фича?
работает ли фича?
разобрался - работает, на вкладке reciever выбирается тот же канал, что и в конфигураторе qczek для rssi. Причем реально работает, меняется в зависимости от условий.
Сегодня опробовал самый маленький приёмник на 433 (e32-433t20s1)
После термоусадки и фольгрования получился такой вес
с такой антенной
С передатчиком настроенным на минимум (примерно 200мВт), ФС сработал на удалении 5км., высота 300. RSSI с 99% сразу упал на 0. На передающем модуле двухдиапазонная антенна Nagoya. На крыле антенна ориентирована вертикально. После срабатывания ФС наблюдал за возвратом в точку взлёта и на передающем модуле пробовал наклонять антенну горизонтально, при этом RSSI становился 99%, ставлю вертикально 0%.
Полагаю, что на мощности 200 мВт на частоте 433 МГц дальность должна быть больше. Измерить эффективность антенн нет возможности.
Подскажите, как правильно ориентировать вышеописанную антенну на крыле?
Ну раз rssi восстанавливался, то значит горизонтально и ставить, но только в одном месте. Если на крыле неудобно, то значит на земле повернуть.
Да, с flysky i6X/ia6b только 8 каналов по ppm. Буду sbus настраивать. Ну а так все работает, но в конфигураторе надо обязательно реальное число каналов ставить для tx. Я поставил 16 - неработало.
А фольгироание реально что то даёт? Такой же модуль на приеме у меня будет
e32-433t20s1 - такой же на 868 есть?