Pitraszek1 Napisano Listopad 25, 2021 Udostępnij Napisano Listopad 25, 2021 (edytowany) Witam zaproggramowalem Arduino Uno i aduino mega 2560 które przesyłają między sobą dane wszystko działa super ale gdy oddalę je na 10 M to po włączeniu Arduino zawiesza się z tego co wyczytałem okazało się że to działa tylko na bliskich odległościach czego nie przemyślałem czy mogę użyć takiego expandera aby to działało https://botland.com.pl/czujniki/18234-extenderactive-terminator-ltc4311-wzmacniacz-sygnalu-i2c-adafruit-4756.html?gclid=Cj0KCQiAhf2MBhDNARIsAKXU5GSsBpvzg7UXvICmcGIUK7I9ywIHKt38qk-zseRlW7uxkGwVRnrn02EaAv93EALw_wcB Edytowano Listopad 25, 2021 przez Pitraszek1 Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Listopad 25, 2021 Udostępnij Listopad 25, 2021 (edytowany) Osobiście wolałbym przerobić to na RS422 (aka RS485 tylko w obie strony 😄), ale jak jesteś uparty na I2C to powinno zadziałać (tylko ja bym sobie nie ufał). Zależy to głównie od częstotliwości, jak używasz 10kbit/s to powinno starczyć, jak koło 100kbit/s to raczej bym unikał tego, bo wtedy i2c to max ok. 1m... Edytowano Listopad 25, 2021 przez H1M4W4R1 1 Link do komentarza Share on other sites More sharing options...
_LM_ Listopad 25, 2021 Udostępnij Listopad 25, 2021 Dokładnie tak jak pisze @H1M4W4R110m to stanowczo zbyt duża odległość, są lepsze połączenia. Na teraz możesz zrobić 2 rzeczy: obniżyć prędkość transferu, zastosować rezystory podciągające sda, scl o mniejszej rezystancji 1 Link do komentarza Share on other sites More sharing options...
Pitraszek1 Listopad 25, 2021 Autor tematu Udostępnij Listopad 25, 2021 też myślałem nad RS485 ale boje się że będę musiał dużo przerabiać kod i ja mam tak że z arduino uno przesyłam dane do arduino mega 2560 oraz z arduino mega 2560 przesyłam dane do uno a z RS485 chyba można z jednego przesyłać do drugiego a w drogą stronę już nie chyba że się mylę 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
H1M4W4R1 Listopad 25, 2021 Udostępnij Listopad 25, 2021 10 minut temu, Pitraszek1 napisał: a z RS485 chyba można z jednego przesyłać do drugiego a w drogą stronę już nie chyba że się mylę RS422 działa w obie strony (po prostu dwie linie RS485, po jednej w każdą ze stron) 1 Link do komentarza Share on other sites More sharing options...
Pitraszek1 Listopad 25, 2021 Autor tematu Udostępnij Listopad 25, 2021 A jak z programem są jakieś poradnik i po polsku Link do komentarza Share on other sites More sharing options...
Harnas Listopad 25, 2021 Udostępnij Listopad 25, 2021 (edytowany) Generalnie ciężko będzie to wzmocnić. Piny I2C są OD więc ładowanie pojemności przewodu z 0->1 odbywa się przez sporą rezystancję. Plus oba sygnały muszą iść synchronicznie wobec siebie. Możesz spróbować zmniejszyć prędkość transmisji do np: 1kHz i może będzie git. A jak nie to RS485 jak polecali koledzy wyżej. Edytowano Listopad 25, 2021 przez Harnas 1 Link do komentarza Share on other sites More sharing options...
pmochocki Listopad 25, 2021 Udostępnij Listopad 25, 2021 Moduły oparte na tych układach można kupić za 20zł: więc tu nie ma się nad czym zastanawiać. Link do komentarza Share on other sites More sharing options...
pmochocki Listopad 25, 2021 Udostępnij Listopad 25, 2021 2 godziny temu, Pitraszek1 napisał: A jak z programem są jakieś poradnik i po polsku Z punktu widzenia Arduino to jest zwykły UART: https://forbot.pl/blog/kurs-arduino-uart-komunikacja-z-komputerem-pc-zmienne-id3836 https://forbot.pl/blog/kurs-arduino-kontynuacja-uart-serwomechanizmy-id7520 Google: Arduino UART Link do komentarza Share on other sites More sharing options...
Pitraszek1 Grudzień 2, 2021 Autor tematu Udostępnij Grudzień 2, 2021 kupiłem taki konwenter https://abc-rc.pl/product-pol-9572-Konwerter-RS422-TTL-na-MAX490-Modul-do-komunikacji-na-dalekie-odleglosci-1km-Arduino.html tylko nie wiem czy dobrze go podłączyłem złącza TXD i RXD podłączyłem do pinów w arduino tylko nie wiem jak podłączyć wyjścia ARK bo ja podłączyłem : A do Y B do Z Z do B Y do A a kod w arduino jest taki zmienne które zczytuje i wysyła if (zapis.available()) { Serial.println(ar); Serial.println(h); Serial.println (den_gora); Serial.println(den_dol); Serial.println(przekladnia_gora); Serial.println(przekladnia_dol); Serial.println(klapa_gora); Serial.println(klapa_dol); Serial.println(koncowa_przekladnia); Serial.println(koncowa_den); Serial.println(silownik3); zapis.restart(); } i drugi które je odbiera if (odczyt.available()) { if (Serial.available() > 0) { // slave may send less than requested ar = Serial.read(); h = Serial.read(); den_gora = Serial.read(); den_dol = Serial.read(); przekladnia_gora = Serial.read(); przekladnia_dol =Serial.read(); klapa_gora =Serial.read(); klapa_dol = Serial.read(); koncowa_przekladnia =Serial.read(); koncowa_den = Serial.read(); } odczyt.restart(); czy to jest dobrze zrobione bo nie odczytuje mi jak wchodzę w port szeregowy to dane sie nie zgadzają Link do komentarza Share on other sites More sharing options...
pmochocki Grudzień 2, 2021 Udostępnij Grudzień 2, 2021 Podłączenia masz poprawnie: 1 Link do komentarza Share on other sites More sharing options...
Pitraszek1 Grudzień 5, 2021 Autor tematu Udostępnij Grudzień 5, 2021 #include <Timers.h> // Nadajnik // Definiujemy strukturę struct strukturaDanych { int temperatura; int wilgotnosc; int cisnienie; int termopara; int obroty; } mojeDane; Timer klapa; Timer zapis; // Definiujemy strukturę struct strukturaDanych1 { int temperatura1; int wilgotnosc1; int cisnienie1; int termopara1; int obroty1; } *mojeDane1; uint8_t usartBuffer[sizeof(strukturaDanych1)] = {0}; int temperatura1 = 0; // Jakaś przykładowa zmienna void setup() { // put your setup code here, to run once: Serial.begin(9600); klapa.begin(1000); zapis.begin(1000); // Wypełniamy strukturę jakimiś danymi mojeDane.temperatura = 25; mojeDane.wilgotnosc = 50; mojeDane.cisnienie = 995; mojeDane.termopara = 70; mojeDane.obroty = 200; } void loop() { // put your main code here, to run repeatedly: if (zapis.available()) { // Wysyłamy dane przez USART: Serial.write(buf, len) // Rzutowanie typów (uint8_t *)&mojeDane // powoduje, że Serial.Write() "widzi" zmienną mojeDane jako tablicę składającą się z bajtów Serial.write((uint8_t *)&mojeDane, sizeof(mojeDane)); // Krótka przerwa przed kolejnym wysłaniem danych zapis.restart(); } if (klapa.available()) { if (Serial.readBytes(usartBuffer, sizeof(strukturaDanych1))) mojeDane1 = (strukturaDanych1*)usartBuffer; // W odbiorniku zmienna mojeDane jest zmienną wskaźnikową // więc aby uzyskać dostęp elementów struktury używamy innego operatora // jak poniżej. temperatura1= mojeDane1->temperatura1; Serial.println(temperatura1); klapa.restart(); } } napisałem kod w ten sposób odbiornik i nadajnik #include <Timers.h> // Odbiornik // Definiujemy strukturę struct strukturaDanych { int temperatura; int wilgotnosc; int cisnienie; int termopara; int obroty; } *mojeDane; uint8_t usartBuffer[sizeof(strukturaDanych)] = {0}; int temperatura = 0; // Jakaś przykładowa Timer klapa; Timer zapis; // Definiujemy strukturę struct strukturaDanych1 { int temperatura1; int wilgotnosc1; int cisnienie1; int termopara1; int obroty1; } mojeDane1; void setup() { // put your setup code here, to run once: Serial.begin(9600); klapa.begin(1000); zapis.begin(1000); // Wypełniamy strukturę jakimiś danymi mojeDane1.temperatura1 = 40; mojeDane1.wilgotnosc1 = 200; mojeDane1.cisnienie1 = 995; mojeDane1.termopara1 = 70; mojeDane1.obroty1 = 200; } void loop() { // put your main code here, to run repeatedly: if (zapis.available()) { if (Serial.readBytes(usartBuffer, sizeof(strukturaDanych))) mojeDane = (strukturaDanych*)usartBuffer; // W odbiorniku zmienna mojeDane jest zmienną wskaźnikową // więc aby uzyskać dostęp elementów struktury używamy innego operatora // jak poniżej. temperatura = mojeDane->temperatura; Serial.println(temperatura); zapis.restart(); } if (klapa.available()) { Serial.write((uint8_t *)&mojeDane1, sizeof(mojeDane1)); // Krótka przerwa przed kolejnym wysłaniem danych klapa.restart(); } } gdy ustawie że jedno arduino odbiera i drugi nadaje przesyłanie danych jest prawidłowe ale gdy zrobiłem tak jak w tych kodach że arduino nadaje i jednocześnie odbiera z drugiego to serial monitor pokazuje jakieś dziwne znaki nie wiem co mam zrobić Link do komentarza Share on other sites More sharing options...
pmochocki Grudzień 5, 2021 Udostępnij Grudzień 5, 2021 Opisz trochę jak to masz podłączone. Jaka odległość? Używasz skrętki, czyli np. kabla ethernetowego? Link do komentarza Share on other sites More sharing options...
Pitraszek1 Grudzień 5, 2021 Autor tematu Udostępnij Grudzień 5, 2021 przez RS422 odległość 10cm bo na razie testuje, a potem będzię z 10m Link do komentarza Share on other sites More sharing options...
Pitraszek1 Grudzień 5, 2021 Autor tematu Udostępnij Grudzień 5, 2021 przez RS422 odległość 10cm bo na razie testuje, a potem będzię z 10m Link do komentarza Share on other sites More sharing options...
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ę »