• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Mavlink biblioteka jak używać?
#1
Znalazłem bibliotekę udało mi się w grać na nano według tego poradnika .
https://www.locarbftw.com/understanding-...k-library/
Gość wgrywał ją na mega chyba bo ma 2 razy sprzętowy uart.
Ale jak widać programowy też używał bo widać za komentowane piny do programowego uart
I działa. No ale za chiny nie wiem jak ja używać. A tym bardziej jak ja połączyć z tym
https://github.com/adis1313/iBUSTelemetry-Arduino
Najpierw bym się skupił na pierwszej bo ta druga używam i cos tam robi.
Może ktoś mi to wytłumaczy łopatologicznie , jak z niej korzystać.
Wiem że nikt tego za mnie nie napisze , ale dzięki waszej pomocy 2 projekciki pykły .
Chodzi o porady i sugestie itp . morze uda mi się za trybic  .

Udało mi się połączyć do gps i bicie serca z tego linku
https://www.locarbftw.com/arduino-mavlin...ght-modes/
Wyświetla w serial prawie to co chce 
Jeszcze prąd i napięcie próbuje dalej.
 
Odpowiedź
#2
Jak masz przykład zrobiony na hard serial, a poruszasz się na razie po omacku to nie kombinuj i zrób hardware. Softwarowy niekoniecznie obsługuje wybraną prędkość, na pewno działają na wybranych pinach OK, w UNO zwykle 2 i 3 na 9600.
Na UNO już lepiej softwarowy wykorzystać do komunikacji z PC, a do peryferiów użyć sprzętowy. Trzeba z tym jednak trochę pokombinować, użyć zewnętrznego konwertera USB-SERIAL, softowo dużo łatwiej wysłać dane, niż je odbierać, na czas wysyłania można nawet zatrzymać wykonywanie programu, całe skupienie ofiarowując temu wysyłaniu, a z odbieraniem to niekoniecznie zadziała, bo nie wiadomo kiedy się ustawić na odbiór, gotowym trzeba być zawsze, dlatego sprzętowy UART napędzany przerwaniami lepiej się tu sprawdza.
Jak nie masz MEGA to można też użyć LEONARDO/MICRO, USB to tutaj osobny sprzęt, a Serial na pinach 0 i 1 to sprzętowy Serial1.
 
Odpowiedź
#3
Photo 
Może wytłumaczę o co chodzi. Mega na pewno będzie za duże i prądożerne .
https://forum.arduinopolska.pl/watek-fly...-na-attyni
To działa i ma mało pinów i wiadomo zegar wewnętrzny różnie pracuje pokazuje 2 temperatury i napięcie i prąd.
Zabrakło mi fiksuGps ale tu juz nic nie dołożę.
Słabo mi idzie poruszanie po tej bibliotece mavlink ponoć jak ja obsłużyć można dojść po plikach xxx.h tylko trochę tego nie rozumiem.
A idea ma być taka biblioteka mavlink ma odczytać z APM tak zakładam co by się przydało.
Prąd.        -
Napięcie. -
Pozycje gps +
Fixgps + dziwne troszke
Ilosc satelit
Flyght mode +
Fajna by była odległość od home do łudeczki-
Ilość zapisanych punktów-
Tam gdzie plusik juz odczytuje na pc
Do tego będzie uart sprzętowy 328p taki posiada
Resztę pinów z atmegi myślę o 4 ptc do pomiary temperatury i 2 czyjniki zalania wodom i cos tam jeszcze do tego uzyje biblioteki ibus i wysle do odbiornika a odbiornik do aparatury
A leonardo i mikro posiada 1 uart to czyli pozostaje dalej przy 328p
   
Zastosowanie do łódki zanętowej
 
Odpowiedź
#4
Leonardo ma co prawda 1 UART, ale do komputera używa USB sprzętowego i ten jeden UART jest wolny w przeciwieństwie do UNO/NANO.
PRO MINI ma jeden, ale nie jest podłączony do niczego, za to przy komunikacji z PC zwykle się z niego korzysta, choć do wysyłania danych na PC można spokojnie wykorzystać softowy UART jak pisałem wcześniej i podłączyć go nawet pod analogi A0-A3, jest trochę lepiej niż w UNO bo UART nie koliduje z tym na płytce.
Jak Ci zależy na poborze prądu to wybierz MICRO lub PRO MINI, albo sam procek 328P na swojej płytce uniwersalnej, czy na pająka.
Z PRO MINI można wylutować ledy i usypiać do poziomu poboru prądu poniżej 1uA.
NANO i MEGA nie ma znaczącej różnicy w poborze prądu, powinieneś sobie ściągnąć PDF z datasheet do używanych w Arduino uC, na pierwszej stronie masz pobór prądu Atmega328P 200uA przy 1MHz, a dla MEGA2501 to jest 500uA. Z takich rzeczywistych pomiarów mi się kojarzy 10mA przy 16MHz w 328P, a MEGA nie testowałem. Jednak cała płytka NANO bierze już 40mA, bo ten wbudowany mostek UART-USB bierze resztę, więc nawet jak uśpisz tak że uC pobiera 1uA, to i tak całe NANO/UNO pobiera dalej 30mA. Więc też przy porównaniu NANO z MEGA to będzie jakieś 50 vs 30mA.
W sumie to zrobiłem test teraz, podróba MEGA pobiera 42mA, podróba UNO 22, podróba UNO taka bardzo podobna do oryginału z drugim uC Atmega jako mostek USB pobiera 71mA, podróba NANO 23mA.
Nie wiadomo na co trafisz na płytce, one nie są do zasilania z baterii, swoją płytkę możesz doposażyć w przetwornicę o większej sprawności jeśli ma pracować bez usypiania, lub stabilizator liniowy jeśli coś ma głównie spać, a najlepiej w ogóle bez stabilizatora, 328P może pracować taktowany 8MHz na aku 3.7V od 4.2 do 3V, albo trzy AA zasilą go od 4.8 do 2.4V bez problemu. Kwestia tylko czy takie IO na tym poziomie Vcc dogada się z innymi elementami urządzenia.

A jak już użyć gołego uC na swojej płytce uniwersalnej to horyzonty są dużo szerzej, jest Atmega328PB, która ma dwa sprzętowe UART, kilka pinów IO dodatkowych, bo te A6 i A7 już są też cyfrowe, a do tego jest dużo tańsza niż 328P, jest Atmega644 w DIP40, albo wyjątkowa 1284 z 16kb RAM, z jednej strony fajna na początek, bo można ją wbić w stykówkę i zadziała, ale teraz ceny są absurdalne, bo już "wincy nie będzie".
Nietypowe dla Arduino uC są obsługiwane po dodaniu core zapaleńców, którzy je robili, robi się to kilkoma kliknięciami wg instrukcji na stronie danego projektu - MINI CORE, Mighty Core, MEGA core.
 
Odpowiedź
#5
Kupiłem nano z 328pb do pc nie potrzebuje komunikacji tylko apm -uart0- atmega -uart1- odbiornik flyski
Tak to zrobić w piatek przyjdzie będę testowałh.
Ta ibus biblioteka jest na przerwaniach da sie ja przerobic na uart ?
 
Odpowiedź
#6
Wszystko jest na przerwaniach, czy to uart programowy czy sprzętowy, tylko działanie jest inne, może być na przerwaniach na różnych poziomach programu.
Np. Uart sprzętowy w Arduino działa na przerwaniach w taki sposób, że jest sprzętowy moduł nadawczy, jak jest pusty to zgłasza przerwanie i funkcja zdefiniowana do jego obsługi kopiuje mu do bufora bajt do wysłania, kończy swoje wykonywanie, UART klepie bity na linie i jak skończy sytuacja się powtarza.
Przy odbiorze analogicznie zgłasza, że ma gotowy bajt w buforze do odbioru a sam moduł sprzętowy zabiera się za odbiór kolejnego, ma miejsce na odbiór iluś tam, zależy od modelu płytki.
Uart programowy używa timera by określić długości stanów pinów, co określony czas wywołuje funkcję do obsługi tego przerwania, a funkcja decyduje, czy ma coś do wysłania, czy powinna ustawić pin na 1 czy na 0. To musi być częściej i trwa dłużej. A przy odbieraniu softowym to znowu inne przerwanie zgłasza, że odbiornik zauważył zmianę stanu pinu 0->1 lub 1->0, wywołuje funkcję, która weryfikuje co to oznacza i coś z tym robi.
Do odbioru mogą być jeszcze przerwania INT lub PCINT, pierwsze w UNO są tylko 2, drugie są wolniejsze.
A biblioteka działająca na przerwaniach to po prostu może sobie używając jakiegoś timera odliczać swój rytm działania, albo może znaczyć to zupełnie coś innego.
W AVR jednak obsługiwane jest tylko jedno przerwanie w danej chwili, wszystko inne, również instrukcje w pętli loop czekają na swoją kolej, dlatego to się nazywa przerwanie. Jak widać takie softowe obsługiwanie komunikacji zajmuje dużo więcej czasu, jak dojdą jeszcze inne przerwania to program w pętli loop w ogóle będzie miał czkawkę cały czas zajęty przerwaniami, nie zdąży odebrać znaków, czasy mu się nie będą zgadzać, będą błędy transmisji. Mogą być jeszcze funkcje w bibliotece o dużej zależności czasowej, ktoś może zablokować wykonywanie przerwań by mu się czas nie rozjechał. Bufor sprzętowy odbierze ze dwa bajty w UNO, programowy UART po prostu jest głuchy.
Gotowa płytka NANO może nie mieć wyprowadzonych odpowiednio pinów 328PB, na schemacie do wszystkich pinów GND VCC jest doprowadzona ścieżka odpowiednio z GND i VCC, tak jak to jest potrzebne w 328P, a w PB zdublowane piny zasilania są zamienione na dodatkowe IO. Trzeba sobie porównać schematy, PINOUT 328P i 328PB, a pinów IO,  które  zostały podłączone do zasilania na stałe użyć do IO nie wolno, jak dasz 1 na pin podłączony do GND to zrobisz zwarcie.
https://github.com/MCUdude/MiniCore#pinout
Lepiej kupić goły scalak, uniwersalną płytkę qfp32 i sobie polutować.
Obejrz płytkę NANO z 328PB bo wątpię by to zostało zmienione,
Akurat drugi UART w 328PB jest na pinach 11 i 12 Arduino, więc tylko koliduje ewentualnie z jednoczesnym użyciem SPI, do zasilania są podłączone piny drugiego I2C - arduinowe 23 i 24.
   
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
Odpiąłem te dwa piny i w grałem szkic odziwo cos działa ale jeszcze dużo roboty.
Tak
Apm wysyła do nano na piny seriall1
Nano wysyła po seriall do pc
A softserial ibus do aparatury
Ciekawe czemu nie działa na nano bez pc według to jest to samo
A da sie zrobic most miedzy serial a serial1 bo pod seriall bym podpiol bt

Kod:
#include <mavlink.h>          
#include <iBUSTelemetry.h>
#define UPDATE_INTERVAL 500
iBUSTelemetry telemetry(8);
uint32_t prevMillis = 0;
int FM;
int SAT;
int VOLT;
int AMPER;
void setup() {               
Serial.begin(57600);
Serial1.begin(57600);
request_datastream();
telemetry.begin();
telemetry.addSensor(IBUS_MEAS_TYPE_FLIGHT_MODE);
telemetry.addSensor(IBUS_MEAS_TYPE_GPS_STATUS);
telemetry.addSensor(IBUS_MEAS_TYPE_EXTV);
telemetry.addSensor(IBUS_MEAS_TYPE_BAT_CURR);
}

void loop() {                
MavLink_receive(); 
updateValues();
telemetry.run();
}

//////////////////////////////////////////////////ODBIERA BICIE SERCA I GPS////////////////////////////////////////////////
void MavLink_receive()
  {
  mavlink_message_t msg;
  mavlink_status_t status;

  while(Serial1.available())
  {
    uint8_t c= Serial1.read();

    //Get new message
    if(mavlink_parse_char(MAVLINK_COMM_0, c, &msg, &status))
    {

    //Handle new message from autopilot
      switch(msg.msgid)
      {

        case MAVLINK_MSG_ID_GPS_RAW_INT:
      {
        mavlink_gps_raw_int_t packet;
        mavlink_msg_gps_raw_int_decode(&msg, &packet);
       
        Serial.print("GPS Fix: ");Serial.println(packet.fix_type);
        SAT = packet.fix_type;
        Serial.print("GPS Latitude: ");Serial.println(packet.lat);
        Serial.print("GPS Longitude: ");Serial.println(packet.lon);
        Serial.print("Sats Visible: ");Serial.println(packet.satellites_visible);
      
      }
      break;
       case MAVLINK_MSG_ID_HEARTBEAT:
       {
       mavlink_heartbeat_t hb;
       mavlink_msg_heartbeat_decode(&msg,&hb);
      
        Serial.print("Flight Mode:");Serial.println(hb.custom_mode);
      FM = hb.custom_mode;
      }
      break;
      case MAVLINK_MSG_ID_SYS_STATUS:  // #1: SYS_STATUS
      {
        mavlink_sys_status_t sys_status;
        mavlink_msg_sys_status_decode(&msg, &sys_status);
// #ifdef SOFT_SERIAL_DEBUGGING    
Serial.print("V");
Serial.println(sys_status.voltage_battery);
VOLT = sys_status.voltage_battery;
Serial.print("A");
Serial.println(sys_status.current_battery);
AMPER = sys_status.current_battery;
// #endif
}
break;
      }
    }
  }
}
/////////////////////////////////////////////////TU COS WYSYLA MAWLINK///////////////////////////////////////////////////////////////////
void request_datastream() {
//Request Data from Pixhawk
  uint8_t _system_id = 255; // id of computer which is sending the command (ground control software has id of 255)
  uint8_t _component_id = 2; // seems like it can be any # except the number of what Pixhawk sys_id is
  uint8_t _target_system = 1; // Id # of Pixhawk (should be 1)
  uint8_t _target_component = 0; // Target component, 0 = all (seems to work with 0 or 1
  uint8_t _req_stream_id = MAV_DATA_STREAM_ALL;
  uint16_t _req_message_rate = 0x01; //number of times per second to request the data in hex
  uint8_t _start_stop = 1; //1 = start, 0 = stop

  mavlink_message_t msg;
  uint8_t buf[MAVLINK_MAX_PACKET_LEN];

  // Pack the message
  mavlink_msg_request_data_stream_pack(_system_id, _component_id, &msg, _target_system, _target_component, _req_stream_id, _req_message_rate, _start_stop);
  uint16_t len = mavlink_msg_to_send_buffer(buf, &msg);  // Send the message (.write sends as bytes)

  Serial1.write(buf, len);//Write data to serial port
}
////////////////////////////////////////////////////////////////IBUS////////////////////////////////////////////////////////////////////////////////
void updateValues()
{
    uint32_t currMillis = millis();

    if (currMillis - prevMillis >= UPDATE_INTERVAL) { // Code in the middle of these brackets will be performed every 500ms.
        prevMillis = currMillis;


        telemetry.setSensorValue(1, FM);
        telemetry.setSensorValue(2, telemetry.gpsStateValues(3, SAT)); // As GPS status consists of two values,
                                                                     // use gpsStateValues(firstVal, secondVal) to set it properly.
        telemetry.setSensorValueFP(3, VOLT);
        telemetry.setSensorValueFP(4, AMPER);
    }
}
taki miks wyszedł. na pc

.bmp   serial.bmp (Rozmiar: 3 MB / Pobrań: 3)
i na aparaturze
   
Zastanawiam sie czy moge rozdzielic kablem Y
O takim mysle
https://www.google.com/search?q=apm+bt+Y...QtNSsgwp5M
 
Odpowiedź
#8
Na nano z 328 pb działa oderwałem 2 nóżki tak jak kaczakat mówiłeś.
Teraz mam taki mega problem ze ta biblioteka obsługuje 15 czujników
https://github.com/adis1313/iBUSTelemetry-Arduino
I z tym sobie nie poradzę .
Ale wiem że inav to też jakiś kontroler też obsługuje ibus .

I żeby dodać więcej czujników dodaje kilka tych samych id .
Id jest 4 bit czyli 15 zero nie jest brane pod uwagę .
   
 
Odpowiedź
#9
Gdzie ja napisałem, by odrywać jakieś nóżki? To nie mucha, wystarczyło nimi nie sterować?
Nie mam pojęcia o tej telemetrii, może tak jak z I2C, jeśli masz kilka urządzeń o tym samym adresie to muszą być na innej magistrali, może w tej bibliotece da się obsługiwać dwie magistrale, na dwóch pinach, choć nie wiem czy to ma jakiś sen, może masz te czujniki już na jednej magistrali. Tworzysz wtedy obiekt1 odwołujący się do 11 jak w przykładzie i na 10 kolejny, itd.:
iBUSTelemetry telemetry1(11);
iBUSTelemetry telemetry2(10);
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#10
Powiem tak miałeś rację że te piny są podpięte do zasilania .
Bardziej miałem na myśli odlutowałem i zostawiłem w powietrzu ale to przez to że czasami uważny nie jestem lub zbyt zmęczony .....Prawdopodobnie uda się wysłać info po 15 czujnikach i dowiedziałem się że do tego można użyć przesunięcia bitowego .Się potrenuje to się może uda zrobić .
Z tej biblioteki udało mi się podstawy ogarnąć.
https://www.locarbftw.com/arduino-mavlin...ght-modes/
Ponoć można odczytać misje i skasować .
Prawdopodobnie można dużo więcej i szukam od niej speca ....
Chodzi o odczyt pozycji domowej która zapisuje się przy uruchomieniu.(jej zmiana ewentualnie)
Odczyt ilości punktów punktów
Wybór punktu
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości