Skocz do zawartości

I2c wzmocnienie sygnału


Pomocna odpowiedź

Napisano (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 przez Pitraszek1
(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 przez H1M4W4R1
  • Lubię! 1

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

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ę

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
(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 przez Harnas
  • Lubię! 1

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ą

#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ć

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...