Skocz do zawartości

Błąd przy jednoczesnym korzystaniu z <SoftwareSerial.h> i <Encoder.h>


Wrona

Pomocna odpowiedź

Zamierzam skomunikować dwie płytki Arduino poprzez programowy Serial. Nadajnik ma dodatkowo regulacje częstotliwości wysyłania danych zaprogramowaną na Enkoderze. Problem w tym że obie biblioteki się "pogryzły" (o ile dobrze rozumiem poniższy błąd).

Arduino:1.8.13 (Windows 10), Płytka:"Arduino Uno"
libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':
(.text+0x0): multiple definition of `__vector_5'
libraries\Encoder\Encoder.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 Uno.

Czy jakaś ingerencja w biblioteki pomoże? Jeśli tak, to co mam w nich pozmieniać?

 

Edytowano przez Wrona
Link do komentarza
Share on other sites

Obie bilbioteki używają przerwań zewnętrznych. Niestety, to jakiego rodzaju są to przerwania zależy od tego z jakimi parametrami tworzysz obiekt związany z biblioteką. A tego nie pokazałeś. Mówiąc inaczej, jeśli Encoder ma szansę, to użyje przerwań INT0 i INT1, ale te są związane z konkretnymi dwoma pinami procesora. Natomiast komunikat:

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

sugeruje, że problem jest we współużywaniu wektora przerwań od zmiany stanu pinu (tzw. PCINT). SoftwareSerial także używa przerwań zewnętrznych po to, by np. precyzyjnie wykryć początek odbieranego bitu startu znaku. Pokaż kawałek kodu w którym tworzysz obiekty Encoder i SoftwareSerial. Zawsze jest możliwość, aby użyć przełącznika ENCODER_DO_NOT_USE_INTERRUPTS, który wymusza na bibliotece enkodera obsługę przez "podglądanie" pinów. Zanim jednak zaczniesz radośnie zmieniać swój kod, koniecznie poczytaj co na ten temat (znaczy ww. przełącznika a nie zmian w kodzie) pisze autor tej biblioteki. Tam też jest przykład jej użycia właśnie bez przerwań. No i porada na przyszłość: jeśli jakiś obcy kod wygląda z opisu na czarną magię, zawsze staraj się znaleźć jego źródła i tam zajrzeć - to zwykle wyjaśnia wszelkie problemy, choćby takie z kompatybilnością:

https://github.com/PaulStoffregen/Encoder - szczególnie plik encoder.h i przykłady w katalogu "examples"

https://github.com/PaulStoffregen/SoftwareSerial

 

  • Lubię! 2
Link do komentarza
Share on other sites

@marek1707 Dzięki, faktycznie zmieniam bibliotekę enkodera na tą która wskazałeś, by nie działać na przerwaniach. Uruchomiłem przykład:

#define ENCODER_DO_NOT_USE_INTERRUPTS
#include <Encoder.h>
Encoder myEnc(2, 3);
void setup() {
  Serial.begin(9600);
  Serial.println("Basic NoInterrupts Test:");
}

long position  = -999;

void loop() {
  long newPos = myEnc.read();
  if (newPos != position) {
    position = newPos;
    Serial.println(position);
  }
}

Krótkie pytanko? Dlaczego jeden krok enkodera daje w efekcie czterokrotne zliczanie?

Przykładowo startujemy od 0. Obracam enkoder o jeden "krok a na monitorze mam od razu 1, 2, 3 i 4, kolejny krok i od razu 5, 6, 7 i 8.

Link do komentarza
Share on other sites

Odróżnij "krok" w sensie mechanicznej zapadki na osi, od "kroku" elektrycznego - zdarzenia (czyli zbocza narastającego lub opadającego) na jednym z dwóch sygnałów. Jeśli przeszkadza Ci to, że Twój enkoder generuje 4 zdarzenia elektryczne na jedną zapadkę (a program biblioteki to wyłapuje i oddaje Ci w postaci pozycji), to podziel wynik przez 4, proste.

BTW: Zaraz, chyba nie zmieniasz żadnej biblioteki, przecież do tej pory też chyba używałeś Encoder. Dodajesz tylko definicję jednego symbolu zmieniającą sposób kompilacji (i  w rezultacie sposób działania) tej samej biblioteki.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@marek1707 Próbowałem dzielenia przez 4 i robił się syf w kolejności cyfr. Na spokojnie ogarnę to później. 

Natomiast faktycznie bibliotekę musiałem zmieniać. Dotychczasowa nie rozumiała co właściwie chce jej przekazać i dopiero nowa z linku jaki podałeś rozumiała o co chodzi z tym ENCODER_DO_NOT_USE_INTERRUPTS.

Na razie dzięki. Muszę przemyśleć swoje priorytety, bo być może najlepszym rozwiązaniem będzie zamiana enkodera na potencjometr i przycisk. 

 

 

Link do komentarza
Share on other sites

2 minuty temu, Wrona napisał:

 Próbowałem dzielenia przez 4 i robił się syf w kolejności cyfr.

Mógłbyś wyjaśnić? Może jakiś przykłąd z ekranu monitora portu? Bo wydaje się, że jeśli zamiast:

Serial.println(position);

napiszesz:

Serial.println(position/4);

to w żaden sposób nie jest to groźne i powinno pokazać wynik 4-krotnie mniejszy. Może Arduino i jest głupie, ale dzielić liczby 16-bitowe umie przecież robić. Kolejność cyfr??? A może właśnie nadepnąłeś na problem w trybie "bezprzerwaniowym" opisany przez autora biblioteki - czytałeś? Biblioteka Encoder, po zabronieniu jej przerwań, straszliwie zużywa moc obliczeniową CPU na bardzo częste podglądanie pinów i procesor nie bardzo ma czas na inne rzeczy. Wstaw zatem do pętli jakiś delay(200) - to powinno odciążyć port szeregowy i sam procesor. Może tak naprawdę nie potrzebujesz 100 razy na sekundę wysyłać pozycję przez UART?

Link do komentarza
Share on other sites

@marek1707 

25 minut temu, marek1707 napisał:

Serial.println(position/4);

to w żaden sposób nie jest to groźne i powinno pokazać wynik 4-krotnie mniejszy. 

No właśnie coś tam się kiełbasiło. Nawet jeśli kręciłem tylko w jedna stronę to liczby nie zawsze narastały a czasem malały. Już do tego nie wrócę by Ci to zademonstrować bo musiałem uporządkować biblioteki Enkodera. Przerwania nie pomagały a właściwie zaprzepaszczały sens stosowania enkodera. Na razie serdecznie dziękuje za dotychczasową pomoc. W międzyczasie zająłem się kolejnym problemem do rozwiązania. Jak coś znów spierniczę to się odezwę 🙂 Dzięki.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.