Skocz do zawartości

Problem przy jednoczesnym załączaniu bibliotek PCF8547.h oraz SoftwareSerial.h


pyrchewsky

Pomocna odpowiedź

Dzień dobry wszystkim forumowiczom.

Pomijając zbędny wstęp przejdę od razu do meritum.

Projekt oparty o Arduino UNO oraz NANO, nad którym aktualnie pracuję to układ do unikania kolizji w dronie latającym, zakładający użycie sensorów HC-SR04. Jak przedstawiono na załączonym rysunku, w celu maksymalnej eliminacji pola martwego wymaga on zastosowania aż 8 takich sensorów rozłożonych w na planie ośmiokąta foremnego. By móc to wykonać jedynie za pomocą 8-bitowych mikrokontrolerów musiałem wykorzystać więcej niż jeden układ, mianowicie założenie jest takie, by Arduino UNO zajmowało się kontrolą lotu (do niego podłączone jest 6 kanałów odbiornika oraz moduł akcelerometr+żyroskop o 6 stopniach swobody MPU-6050) z kolei Arduino NANO obsługuje wszystkie 8 sensorów ultradźwiękowych z pinami Trigger podłączonymi do ekspandera i pinami echo podłączonymi bezpośrednio do wejść cyfrowych mikrokontrolera, który również prowadzi cyfrową obróbkę danych (uśrednienie wyników pomiarów odległości).

Jedna płytka Arduino nie mogła obsłużyć wszystkiego z powodu ograniczonej ilości pinów cyfrowych, gdzie nie mogłem wykorzystać ekspandera, ponieważ interfejs I2C został już zajęty przez akcelerometr z żyroskopem, a jego (akcelerometru) podłączenie do ekspandera odpada (szybkość transmisji została by zmniejszona znacznie poniżej 100kHz). Dlatego też wykombinowałem następujące połączenie: 8 sensorów zostaje podłączonych do dodatkowego mikrokontrolera wraz z ekspanderem na I2C, następnie on wysyła dane przez interfejs UART do głównego mikrokontrolera lotu. W celu przejrzystego i łatwego programowania postanowiłem wykorzystać biblioteki dla ekspandera oraz dla komunikacji interfejsem szeregowym.

I tu pojawia się problem: Przy jednoczesnym załączaniu obydwu wymienionych bibliotek pojawia się następujący komunikat w trakcie kompilacji:

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':

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

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

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':

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

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

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':

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

libraries\PCF8574\PCF8574.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 Nano.

Widzę, że chodzi tu o wielokrotną definicję niektórych metod z tych bibliotek. Czy wykomentowanie w jednej z nich niepotrzebnych definicji pomoże rozwiązać sprawę i takie połączenie ma prawo zadziałać sprawnie? Testowy kod załączam do posta.

Link do komentarza
Share on other sites

Obie te biblioteki używają tych samych przerwań. Nie będą działać razem. Zresztą software serial to bardzo zły pomysł w systemie czasu rzeczywistego, bo wyłącza ci przerwania. Myślałeś, żeby komunikację między tymi płytkami zrobić po SPI?

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

To zły pomysł. Pomiar odległości w tych czujnikach bazuje na precyzyjnym zliczaniu czasu od wygenerowania zbocza TRIG do powrotu impulsu ultradźwiękowego. To są krótkie czasy i system musi być bardzo sprawny. Jak chcesz mierzyć czas echa mając wyzwalanie czujników na ekspanderze portów "odległym" od procesora o transmisję I2C. Tak to możesz sobie diodki zapalać. Po drodze będziesz miał jakąś bibliotekę generującą zdarzenia na I2C, przykrywającą zależności czasowe. Jak się dowiesz kiedy de facto pin wyjściowy został ustawiony i od kiedy zacząć liczenie czasu? Przecież nie bez powodu biblioteki obsługujące czujniki HC04 działają na prawdziwych pinach procesora a nie przez pośredników.

EDIT: Jeśli brakuje Ci pinów, użyj jakiegoś taniego multipleksera wejściowego (np. 74HC151) lub dekodera na wyjściu (np. 74HC138) albo obu na raz. To dużo tańsze niż skomplikowany ekspander portów. Na ile liczysz obrót całej pętli mierzącej 8 czujników?

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

Cała pętla będzie trwać 8*(2us+10us)=96us, gdzie 2us to czas trwania sygnału pomiarowego, a 10us to czas sczytywania odbitego dźwięku. Bibliotekę software serial można w zasadzie wyeliminować stosując dedykowane piny do komunikacji UART. Spróbuję wykonać manewr z multiplekserem sygnału, pozostaje jednak pytanie czy UART będzie wystarczająco szybki do dostarczenia danych na drugi mikrokontroler kontrolujący lot. Zanim dane do niego trafią są jeszcze poddawane operacji uśredniania odczytów na Arduino NANO (przez bufor składający się z 10 ostatnich pomiarów). Pytanie ode mnie: Czy multiplekser zwyczajnie powiela ten sam sygnał z jednego pina na wiele pinów, czyli sygnał trigger zostanie po prostu wysłany na raz do wszystkich sensorów?

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

A nie możesz sobie sprawdzić np. w wikipedii jak działa multiplekser?

Rozumiem, że chcesz mieć fajnie latającego drona. Ale bez znajomości podstaw elektroniki/informatyki przy założeniu "zapytam na forum to ktoś odpowie" to zanim ten dron wystartuje, będziesz miał dłuższą brodę niż basista z ZZTop.

Link do komentarza
Share on other sites

Gwoli informacji on już dawno lata i robi to bardzo dobrze. Jednakże postawiłem sobie za cel w tym akurat projekcie wykorzystanie tylko i wyłącznie 8-bitowców. Nie korzystałem nigdy z multipleksera, sądziłem, iż forum istnieje, by uzyskać informacje. Niemniej, widzę, że wirus elektrody zaraża wszędzie.

Link do komentarza
Share on other sites

Jeżeli przez "wirus elektrody" masz na myśli zalew użytkowników, którzy traktują to forum jak google, spodziewają się natychmiastowych odpowiedzi na każde pytanie i nie zamierzają sami nic wnieść, to chyba tak, zaczyna się tu pojawiać. Znak czasów, zapewne.

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.