• 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
Arduino Mini Pro - Błędy podczas weryfikacji + biblioteki
#1
Mam problem z programem, podczas weryfikacji wyświetla błąd i nie wiem jak go wyeliminować.
Korzystam z programu stąd:
https://www.rcgroups.com/forums/showthre...-to-openTX

Kod:
/*
 Author: flarssen, 05/2015
 GPS to FrSky Telemetry interface, + FAS&FLVS-01 sensor data
 using
 FrSky S-Port Telemetry library http://www.rcgroups.com/forums/showthread.php?t=2245978
 NazaDecoder library http://www.rcgroups.com/forums/showthread.php?t=1995704
 Guy who messed everythin up trying to learn: poteroa 2/2016
 Thank you Fred for easing old farts headache.
 THIS IS NOT FOR COMMERCIAL USE, PLEASE RESPECT THE ORIGINAL AUTHOR!
*/
#include "SoftwareSerial.h"
#include "NazaDecoderLib.h"
#include "FrSkySportSensor.h"
#include "FrSkySportSensorGps.h"
#include "FrSkySportSingleWireSerial.h"
#include "FrSkySportTelemetry.h"

#define NO_PIN 255        
#define LED_PIN 13                     // the pin connected to onboard LED
#define PIN_SerialTelemetryRX 10       // the pin to use for D series data input
#define PIN_SerialTelemetryTX 12       // the pin to use for serial data to the FrSky receiver
#define MAX_FRAME 5

SoftwareSerial serialD(PIN_SerialTelemetryRX, PIN_SerialTelemetryTX, true);
SoftwareSerial telemetryTypeCheck(PIN_SerialTelemetryTX, NO_PIN, true); // Tx pin will be input
FrSkySportSensorGps gps;                // Sport GPS sensor
FrSkySportTelemetry telemetry;          // Sport telemetry object

uint32_t sentenceTime1, sentenceTime2, currentTime, lastDDataIn = 0UL;
uint8_t DDataset[32][MAX_FRAME];
float f_lat, f_lon, f_alt, f_hdg, f_speed, f_sats, f_fix; //removed satfix as did not get proper data. (tried to send as temp1 value 0x02)
boolean telemetryTypeX;
byte count;
byte gpsSentences = 0;
byte X[] = {3,1,1,3,0};     // -..-
byte D[] = {3,1,1,0};       // -..
boolean DDatareceived;

void morse(byte values[])
{
 for(int i=0; values[i]; i++) {
   digitalWrite(LED_PIN, HIGH);
   delay(values[i]*100);
   digitalWrite(LED_PIN, LOW);
   delay(100);
 }
 delay(300);
}  

boolean isTelemetryTypeX(void) {
 unsigned long startTime;
 boolean x = false;
 
 telemetryTypeCheck.begin(57600);
 startTime = millis();
 while (millis() - startTime < 1000UL) {
   while (telemetryTypeCheck.available()) {
     if(telemetryTypeCheck.read() == FRSKY_TELEMETRY_START_FRAME) {
       x = true;
       break;
     }
   }
 }
 telemetryTypeCheck.end();
 pinMode(PIN_SerialTelemetryTX, OUTPUT);
 return x;
}

void SetDValue(uint8_t ID, uint16_t Value) {
 uint8_t lsb = Value & 0x00ff;
 uint8_t msb = (Value & 0xff00)>>8;
 uint8_t stuffed = 0;
 uint8_t frame = 0;
 
 while(DDataset[frame][0] != 0x5e && frame < 31)
   frame++;
 DDataset[frame][0] = ID;  
 if(lsb == 0x5E) {
   DDataset[frame][1] = 0x5D;
   DDataset[frame][2] = 0x3E;
   stuffed++;
 }
 else if(lsb == 0x5D) {
   DDataset[frame][1] = 0x5D;
   DDataset[frame][2] = 0x3D;
   stuffed++;
 }
 else {
   DDataset[frame][1] = lsb;
 }
 if(msb == 0x5E) {
   DDataset[frame][2+stuffed] = 0x5D;
   DDataset[frame][3+stuffed] = 0x3E;
 }
 else if(msb == 0x5D) {
   DDataset[frame][2+stuffed] = 0x5D;
   DDataset[frame][3+stuffed] = 0x3D;
 }
 else {
   DDataset[frame][2+stuffed] = msb;
 }
}

static void convertCoordinate(int32_t gpsCoordinate, uint16_t *b, uint16_t *a)
{
 int32_t base, deg, min;
 base = abs(gpsCoordinate); // base in micro degrees
 deg = base / 1000000;
 base = (base - deg * 1000000) * 60; // base in micro minutes
 min = base / 1000000; // whole minutes left
 *b = deg * 100 + min;
 *a = (base - min * 1000000) / 100; // 4 digit minute decimal
}

void SetDGpsData(void) {
 int32_t lat, lon, alt, tmp, tmp2;
 uint16_t msd, lsd, hdg, knots;
 int year;
 unsigned long age;
 uint16_t degr, mins;

 lat = f_lat*1000000;
 lon = f_lon*1000000;
 alt = f_alt*100;
 hdg = f_hdg*100;
 tmp = f_sats;
 tmp2 = f_fix;
 convertCoordinate(lat, &msd, &lsd);
 SetDValue(0x13, msd);        // Latitude (DDMM)
 SetDValue(0x1B, lsd);        // Latitude (.MMMM)
 SetDValue(0x23, (uint16_t)(lat < 0 ? 'S' : 'N'));
 convertCoordinate(lon, &msd, &lsd);
 SetDValue(0x12, msd);        // Longitude (DDMM)
 SetDValue(0x1A, lsd);        // Longitude (.MMMM)
 SetDValue(0x22, (uint16_t)(lon < 0 ? 'W' : 'E'));
 SetDValue(0x01, (int16_t)(alt / 100));                   // Altitude m
 SetDValue(0x09, (uint16_t)(abs(alt) % 100));             // Altitude centimeter
 SetDValue(0x11, (uint16_t)(knots / 100));                // Speed knots
 SetDValue(0x19, (uint16_t)(knots % 100));                // Speed decimals
 SetDValue(0x14, (uint16_t)(hdg / 100));               // Course degrees
 SetDValue(0x1C, (uint16_t)(hdg % 100));               // Course decimals
 SetDValue(0x02, (uint16_t)(tmp));                    //Amount of satellites as temp1 value to FRsky
 SetDValue(0x05, (uint16_t)(tmp2));                  //Fixtype (1 = no Fix, 2 = 2D Fix, 3 = 3D Fix.
}

void SendDData(void)
{
 uint8_t frame = 0;
 uint8_t index;
 
 digitalWrite(LED_PIN, HIGH);
 while(DDataset[frame][0] != 0x5e && frame < 31) {
   serialD.write(0x5e);
   index = 0;
   while(DDataset[frame][index] != 0x5e && index < MAX_FRAME) {
     serialD.write(DDataset[frame][index]);
     DDataset[frame][index] = 0x5e;
     index++;
   }
   serialD.write(0x5e);
   frame++;
 }
 digitalWrite(LED_PIN, LOW);
}

void processExternalByte (uint8_t ExternalByte) {
 static uint8_t DData[MAX_FRAME];
 static unsigned int index = 0;
 static byte stuffed = 0;
 uint8_t frame = 0;
 
 lastDDataIn = millis();
 if (DDatareceived == false)
   DDatareceived = true;  
 if (ExternalByte == 0x5e) { // Head/Tail
   if (index == 3 + stuffed) { // Valid frame size
     while(DDataset[frame][0] != 0x5e && frame < 31)
       frame++;
     for (int i=0; i < index; i++)
       DDataset[frame][i] = DData[i];
   }      
   index = 0;
   stuffed = 0;
   return;
 }
 if (index <  MAX_FRAME) {
   DData[index++] = ExternalByte;
   if (ExternalByte == 0x5d)
     stuffed++;
 }
}  

void setup()
{
 pinMode(LED_PIN, OUTPUT);
 telemetryTypeX = false;//isTelemetryTypeX();  
 if (telemetryTypeX) {
   telemetry.begin(FrSkySportSingleWireSerial::SOFT_SERIAL_PIN_12, &gps);
   morse(X);
 }
 else {
   for (int i=0; i<32; i++)
     memset(DDataset[i], 0x5e, MAX_FRAME);    
   serialD.begin(9600);
   morse(D);
 }
 Serial.begin(115200);
}

void loop() {
 while(Serial.available())
 {
   uint8_t decodedMessage = NazaDecoder.decode(Serial.read());
   switch (decodedMessage)
   {
     case NAZA_MESSAGE_GPS:
       // if 3D Fix -> set Values
       // if ((uint8_t) NazaDecoder.getFixType() == 3) // Uncomment this line if you want data only when 3D fix.
       {
         f_lat = (float) NazaDecoder.getLat();
         f_lon = (float) NazaDecoder.getLon();
         f_alt = (float) NazaDecoder.getGpsAlt();
         f_speed = (float) NazaDecoder.getSpeed();
         f_hdg = (float) NazaDecoder.getHeadingNc();
         f_sats = (float) NazaDecoder.getNumSat();
         f_fix = (float) NazaDecoder.getFixType();        
         if (telemetryTypeX)
           gps.setData(f_lat, f_lon, f_alt, f_speed, f_hdg, 16, 1, 1, 0, 0, 0);
         else {
           SetDGpsData();
           currentTime = millis();
           if (currentTime - lastDDataIn > 1000UL)
             SendDData();
         }
       }
       break;
   }
 }
 if (telemetryTypeX)
   telemetry.send();
 else {
   while(serialD.available() > 0)
     processExternalByte(serialD.read());
   currentTime = millis();
   if (DDatareceived && currentTime - lastDDataIn > 50UL) {
     SendDData();
     DDatareceived = false;
  }
 }
}

Dograne biblioteki przez opcję "Dodaj bibliotekę .ZIP" (bez względu czy library w Dokumenty czy w katalogu programu, błąd ten sam):

https://www.rcgroups.com/forums/showthre...nfigurable
FrSkySportTelemetry_20180402

https://www.rcgroups.com/forums/showthre...no-library
NazaDecoder20141130

Błędy przy weryfikacji:
Kod:
Arduino:1.8.5, Płytka:"Arduino Pro or Pro Mini, ATmega328P (5V, 16 MHz)"

libraries\NazaDecoder\NazaDecoderLib.cpp.o (symbol from plugin): In function `NazaDecoderLib::pwm2Deg(unsigned long)':

(.text+0x0): multiple definition of `__vector_5'

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Błąd kompilacji dla płytki Arduino Pro or Pro Mini."
Pisałem z jednym użytkownikiem i mówił, że mu nie wywala błędów, nie wiem czy coś robię nie tak czy gdzieś faktycznie jest problem.
 
Odpowiedź
#2
Skompiluj z użyciem hardwarowego serial - Arduino MEGA 2560 lub Leonardo lub Micro i zobacz czy coś się zmieni. Przecież dodałeś sobie ten softserial tam. Nie musisz mieć takiej płytki, po prostu wybierz jako docelową, pozmieniaj co trzeba w kodzie apropos serial i skompiluj.
 
Odpowiedź
#3
Jeżeli chodzi o "SoftwareSerial" to nie dodawałem go, chyba jest zaszyty w Arduino (korzystam z wersji portable), przejrzałem katalogi z bibliotekami i nie znalazłem tego pliku.
Doczytałem, że w przypadku błędu w pliku biblioteki NazaDecoder "NazaDecoderLib.h" należy linijkę:
// Uncomment the line below if you want to disable attitude (pitch/roll) sensing. This may be useful when you experience a conflict with another library that also uses the interrupt
// or on a board that does not support the interrupt used. Note that for Teensy boards attitude sensing will be disabled by default.
//#define ATTITUDE_SENSING_DISABLED

zmienić na:
#define ATTITUDE_SENSING_DISABLED

po prostu trzeba usunąć "//".
W tym momencie weryfikacja przebiega prawidłowo i program wgrywa się na Adruino Mini Pro więc chyba jest to dobre rozwiązanie?

Jeżeli chodzi o sam kod to obsługuje on dane z GPS oraz czujniki:
- Fas-100 voltage and current
- Flvs-01 lipo cell voltage

Chciałbym usunąć obsługę tych czujników, a dodać obsługę Tems-01 (czujnik temperatury, jest to po prostu termistor 100k z dwoma przewodami ale fabrycznie musi być podłączony przez HUB, a nie bezpośrednio do nadajnika więc chyba obsługa musi być dodana w programie).
Niestety nie wiem co w tym programie muszę zmienić.
 
Odpowiedź
#4
Chodziło mi o " dodałeś", w sensie, że jest używany konkretnie tylko z atmegą 328, a na stronie tego nie było, pisało tam by dodać do 328, bo ona ma tylko 1 UART, jak są potrzebne dwa to drugi musi być programowy, czyli softserial. W wymienionych płytkach byś mógł użyć po prostu innego UART. Softserial używa do mierzenia czasu timera i przerwań (interrupt ) tak samo jak PWM. Stąd konflikt w bibliotekach - obie korzystały z tego samego zasobu sprzętowego.
Termistor podłączasz do pinu analogowego https://learn.adafruit.com/thermistor/us...thermistor i innych przykładów jest w sieci pińcet.
Zabawa z Arduino to dwie drogi - znajdujesz gotowiec, wgrywasz i się cieszysz z tego co masz. Jak nie działa i wystarczą drobne modyfikacje to zapytasz na forum, ale nikt za Ciebie nie nauczy się programować. Jak chcesz modyfikować kod to są Tutoriale od A do Z i będziesz mógł modyfikować kod - jak się nauczysz.
 
Odpowiedź
#5
Skoro się kompiluje to trzeba wgrać i sprawdzić. Jakoś kompilator doszedł do tego, że główny program jest w pliku obok i skompilował.
Pisałeś wcześniej, że chcesz coś dodać, nie dodałeś przypadkiem gdzieś przy okazji delay(cośtam)? Albo nie wywołujesz pomiaru temperatury 15tys. razy na sekundę?
 
Odpowiedź
#6
Nie, tutaj nic nie dodawałem, jest to drugi program ale jest coś nie tak, bo po wgraniu niestety nie działa, W Arduino dioda jedna świeci, druga miga ale telemetria nie działa więc nie wiem czy wgrało wszystko co powinno czy nie.
Tutaj jest program:
https://github.com/MikeBland/SportToHub
Składa się z 4 plików, otwieram SportToHub.ino i na początku linii dodaję // (tak napisał autor ponieważ w Arduino 1.8.5 przy weryfikacji bez // wywala błędy, z tym weryfikacja przebiega prawidłowo.
Otwierają się 4 zakładki z nazwami plików, klikam Wgraj i wgrywa.
Na koniec pojawia się:
Kod:
Szkic używa 4028 bajtów (13%) pamięci programu. Maksimum to 30720 bajtów.
Zmienne globalne używają 211 bajtów (10%) pamięci dynamicznej, pozostawiając 1837 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów.
Jednak wydaje mi się, że program jest większy niż ten, który wstawiłem na początku tematu, a po wgraniu wygląda, że zajmuje mniej miejsca. Po wgraniu tego z początku tematu pojawia się:
Kod:
Szkic używa 11034 bajtów (35%) pamięci programu. Maksimum to 30720 bajtów.
Zmienne globalne używają 916 bajtów (44%) pamięci dynamicznej, pozostawiając 1132 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów.
Może faktycznie czegoś nie wgrywa tak jak powinno?
 
Odpowiedź
#7
Rozwiązanie masz powyżej - albo się uczysz programować, albo wgrywasz co dają, w konfiguracji sprzętu dokładnie takiej jak ktoś opracował. Bez nauki i narzędzi nic nie sprawdzisz. Tutaj równie dobrze możesz wywalić pusty plik projektu *.ino, zmienić nazwę tamtego *.cpp na *.ino o tej samej nazwie i skompilować.
Można podłączyć się pod piny gdzie są UARTY konwerterem UART-USB i popatrzeć czy moduł coś wysyła, na jakiej prędkości, czy reaguje na jakieś dane wrzucane.
Poprzedni program komunikował się z prędkością 9600, ten ma 57600 w jedynym i 9600 w innym module. To nie jest tak że to błąd, gość sobie to napisał pod coś tam, może wie jakie parametry sobie ustawił w odbiorniku,może odbiornik dopasowuje prędkość automatycznie, może trzeba mu tę prędkość ustawić, może trzeba to poprawić. Nie wiem z czym to ma gadać, jaka jest składnia.

Co do modyfikacji pytałem o poprzedni kod. Na stronie projektu było wyraźnie napisane, że jak coś modyfikujesz na pałę to możesz tracić dane, nie zdążysz ich odebrać. Skoro gubiłeś część danych kod był całkiem niezły. Pytanie czy gubił po Twoich modyfikacjach, a autor to przewidział? Dlatego zapytałem czy modyfikowałeś. Jak zmodyfikujesz coś w tym projekcie w taki sam sposób jak w tamtym (zakładając, że w ogóle ruszy) to efekt będzie taki sam. UNO nie jest, delikatnie mówiąc, stworzone do obsługi 3 UART mając wbudowany 1. Jeśli miałoby wysyłać jakieś dane to pół biedy, możesz sobie gadać kiedy chcesz to 10 osób, do każdego po kolei w dowolnym momencie, to problem tamtych ludzi by usłyszeć i zrozumieć, jak zacznie do Ciebie gadać 10 osób akurat w tym samym czasie to nic nie zrozumiesz.
 
Odpowiedź
#8
To teraz opiszę na spokojnie (ogólnie wgrywam to na Arduino Mini Pro 5V 16Hz), jednak autor bibliotek napisał, że program o którym pisałem powyżej (SportToHub) dotyczy nie tego co mnie interesuje więc należy go pominąć.

Program z pierwszego posta jest taki jaki został stworzony przez autora, chyba nie do końca jest prawidłowy właśnie. Dodatkowo obsługuje 2 czujniki których nie używam ale nie wiem co usunąć aby ich się pozbyć ( FAS&FLVS-01)
Autor biblioteki (inny niż pierwszego programu) napisał, że wszystko jest tutaj:
https://www.rcgroups.com/forums/showthre...nfigurable
Wgrałem przykład (Example), który był w bibliotece i na wyświetlaczu pojawiły mi się dane ale jak zauważyłem były to dane takie jakie są na sztywno wpisane w programie, nie zmieniają się/nie odświeżają. Niestety nie wiem jak poprawić pierwszy program lub jak na podstawie biblioteki napisać prostszą wersję aby odbierała dane z GPS (TX) podłączonego do RX Arduino, dodatkowo +5V i GND, a pinem 11 dane wychodzą do nadajnika, który wysyła telemetrię do aparatury. Póki co pierwszy program chociaż częściowo działa ale właśnie gubi dane, wysyła nieprawidłowe koordynaty itp. działa w nim kompas i wysokość oraz pokazuje czy jest FIX oraz czy jest 2D, czy 3D, a także z iloma satelitami jest połączony GPS.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości