Skocz do zawartości

I2c wzmocnienie sygnału


Pitraszek1

Pomocna odpowiedź

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 przez Pitraszek1
Link do komentarza
Share on other sites

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 przez H1M4W4R1
  • Lubię! 1
Link do komentarza
Share on other sites

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 

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

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

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

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)

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

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 przez Harnas
  • Lubię! 1
Link do komentarza
Share on other sites

2 godziny temu, Pitraszek1 napisał:

A jak z programem są jakieś poradnik i po polsku

Z punktu widzenia Arduino to jest zwykły UART:

Link do komentarza
Share on other sites

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

#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

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ę »
×
×
  • 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.