rbng Napisano Styczeń 18, 2017 Udostępnij Napisano Styczeń 18, 2017 Cześć Robię pewien projekt, jednak jestem amatorem i chciałbym prosić o pomoc. Mam dwa arduino uno. Na jednym z nich odbieram sygnał gps z odbiornika gps, oraz chciałbym odbierać dane przesyłane z drugiego arduino. Czy ktoś mógłby mi powiedzieć jak to napisać, aby działało poprawnie? Wrzucę kawałek kodu. #include <SoftwareSerial.h> SoftwareSerial ss(3, 4); void setup() { Serial.begin(115200); ss.begin(4800); } void loop() { while (ss.available()) { char c = ss.read(); Serial.write(c); } } Podłączam odbiornik gps na piny 3,4 i odbieram dane. I teraz gdybym chciał do tego odbierać dane z drugiego arduino, to wystarczy, że dopiszę coś takiego: #include <SoftwareSerial.h> SoftwareSerial ss(3, 4); [color=brown]SoftwareSerial dane(5);[/color] void setup() { Serial.begin(115200); ss.begin(4800); [color=brown]dane.begin(xxx)[/color] } void loop() { while (ss.available()) { char c = ss.read(); Serial.write(c); } [color=brown]while (dane.available()) { char d = dane.read(); Serial.write(d); } }[/color] ? (Na brązowo to co dodałem) Jednak nie na brązowo bo w codzie nie działają bbcodes 😃 jednak może zostawię to tak jak jest, żeby było wiadomo co dodałem. Dodatkowo te dane, które chcę odbierać z drugiego arduino będą miały postać zmiennej tekstowej, gdzie zawarte są trzy liczby zmiennoprzecinkowe. Na przykład 10.00,15.00,100.00 I teraz to trafia do zmiennej tekstowej d. Chciałbym to rozdzielić na te trzy liczby 10.00 15.00 100.00 i zapisać je do zmiennych liczbowych. Tutaj nie mam pojęcia jak to zrobić. Ktoś mógłby mi podpowiedzieć? Edit: Przeczytałem coś o funkcji sscanf Czy coś takiego byłoby poprawne: sscanf(dane,%f,%f,%f,pierwszaliczba,drugaliczba,trzecialiczba); Gdzie te zmienne pierwszaliczba, drugaliczba, trzecialiczba są zdefiniowane jako float? Dodatkowo jak powinien wyglądać kod na drugie arduino, gdzie wysyłałbym te dane? Wystarczy coś takiego: #include <SoftwareSerial.h> SoftwareSerial dane(5); void setup() { dane.begin(xxx); } void loop() { dane.write(10.00,15.00,100.00); } } ? Wtedy wystarczy, że połączę przewodem pin 5 jednego arduino z pinem 5 drugiego arduino i będzie to działać? Istotą tego projektu jest to, że porównuję oba te odebrane sygnały (ten z gps oraz ten przesłany z drugiego arudino) oraz na podstawie różnicy tych sygnałów obliczam pewien kąt i zadaję go na serwomechanizm, a więc tam pojawi się jeszcze część programu do obliczenia tego kąta oraz obsługa serwomechanizmu. W jaki sposób dobrać częstotliwość tej transmisji xxx, tak abym mógł jednocześnie odbierać sygnał z odbiornika gps oraz dane z drugiego arduino? Z góry dziękuję o porady i proszę o wyrozumiałość. Link do komentarza Share on other sites More sharing options...
deshipu Styczeń 18, 2017 Udostępnij Styczeń 18, 2017 Może zacznij od jakiegoś kursu C albo C++ i przeczytaj co dokładnie robi instrukcja "while" -- pozwoli ci to zrozumieć swój program i uniknąć bezsensownego kopiowania kawałków kodu z nadzieją, że jak jeden kawałek robi jedną rzecz, to powtórzony dwukrotnie zrobi dwie rzeczy na raz. Jak już to zrozumiesz, to będziesz musiał usiąść i zastanowić się jak to zrobić w jednej pętli. Do tego przyda się wiedza o operatorach logicznych -- z tego samego kursu. Jak już to ogarniesz, to prawdopodobnie z resztą już sobie poradzisz, ale jeśli nie, to napisz tu co masz a my spróbujemy doradzić dalej. Link do komentarza Share on other sites More sharing options...
rbng Styczeń 18, 2017 Autor tematu Udostępnij Styczeń 18, 2017 No tak, z tymi dwiema pętlami while to błąd. Ale mimo wszystko tutaj bym nie upatrywał mojej nieznajomości języka c (chociaż nie jest ona super) o ile zasad "arduino", bo nie wiem, czy w ogóle można w jednym programie pracować na dwóch różnych częstotliwościach, odbierać na nich dane itp. Przyznam się, że ta pętla while została skopiowana z przykładu z biblioteki tiny gps, ale teraz nie wiem, czy bez tej pętli zadziała. Zakładam, że tak, tylko najwyżej kiedy nie będzie dostępne (available) to odczytam jakieś głupoty/nic. #include <SoftwareSerial.h> SoftwareSerial ss(3, 4); SoftwareSerial dane(5); void setup() { Serial.begin(115200); ss.begin(4800); dane.begin(xxx) } void loop() { char c = ss.read(); Serial.write(c); char d = dane.read(); Serial.write(d); } Tak chyba poprawnie i z tego co widzę to bez while też odczytuję dane z gps. Co z resztą mojego posta? Link do komentarza Share on other sites More sharing options...
deshipu Styczeń 18, 2017 Udostępnij Styczeń 18, 2017 Nie, nie zadziała. Przestań robić losowe zmiany i pytać czy teraz dobrze, tylko doczytaj i zrób tak jak powinno być. Mówisz, że to nie nieznajomość C tylko Arduino, to weź dokumentację do Arduino i przeczytaj co robią te wszystkie funkcje, które tam wywołujesz w oryginalnym programie. Wtedy będziesz wiedział czy są potrzebne i do czego. Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »