Skocz do zawartości

Przesłyanie danych z jednego arduino do drugiego


rbng

Pomocna odpowiedź

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

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

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

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

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

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.