Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'RS485'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 6 wyników

  1. Już myślałem, że mam ogarnięty temat RS-485. Jednak nie i znów potrzebuję pomocy. Czy są jakieś zasady / dobre praktyki, które należy stosować do obsługi komunikacji dwukierunkowej w trybie half duplex? Ew. ktoś to robił i może mi pomóc z moją aplikacją (np. jakiś wieczorny calll?) Aktualnie robię w miarę prosty układ obsługujący komunikację RS-485, wykorzystując 2 płytki: UNO R4 i GIGA. Całość ma działać tak: 1. (działa) Wciskam przycisk podpięty do UNO. UNO wysyła komunikat do GIGA. Kod: void sendReadMessage(int command) { char message[BatteryMonitor_Message_Lenght]; int commandValueParameter = 1; //wg przykładów z instrukcji urządzenia każdy read wysyła wartość = 1. int checksum = getChecksum(commandValueParameter); sprintf(message, ":R%02i=%i,%i,%i,\r\n", command, batteryMonitorParameters.deviceAddress, checksum, commandValueParameter); //Active HIGH for Driver Input Enable; Active LOW for Receiver Output Enable. digitalWrite(receiverOutputEnablePinNumber, HIGH); batteryMonitorSerialDevice->print(message); batteryMonitorSerialDevice->flush(); delay(WaitTimeAfterSend); //Active HIGH for Driver Input Enable; Active LOW for Receiver Output Enable. digitalWrite(receiverOutputEnablePinNumber, LOW); } W klasie instancją której operuję jest definicja zmiennej: Stream* batteryMonitorSerialDevice; a przy inicjowaniu podpinam pod nią Serial1 na którym jest poprawnie wpięty konwerter RS-485. 2. (działa) GIGA odbiera i prasuje komunikat. W zależności od treści otrzymanego i przetworzonego komunikatu ustala odpowiedź do wysyłki. Kod: void loop() { returnMessage = ""; switch (readMessage()) { case 0: { returnMessage = ":r00=1,47,1120,100,101,\r\n"; break; } case 50: { returnMessage = ":r50=2,215,2056,200,5408,4592,9437,14353,134,0,0,0,162,30682,\r\n"; break; } default: break; } if (returnMessage.length() > 0) { sendMessage(returnMessage); } delay(100); } int readMessage() { String returnMessage_local = ""; char message[BatteryMonitor_Message_Lenght]; int startIndex = 0; int endIndex = 0; bool receivedFullMessage = false; bool receivedMessage = false; int index = 0; while (Serial1.available() > 0) { message[index] = Serial1.read(); receivedMessage = true; if (message[index] == '\n') { receivedFullMessage = true; break; } index++; } if (receivedMessage and receivedFullMessage) { //parsuję wiadomość i szukam interesującego mnie kodu operacji for (int i = 0; i <= index; i++) { if (message[i] == 'R') { startIndex = i + 1; } if (message[i] == '=') { endIndex = i - 1; i = index + 1; //leave the loop } } for (int i = startIndex; i <= endIndex; i++) { returnMessage_local += message[i]; } if (returnMessage_local == "") { return -1; } else { return returnMessage_local.toInt(); //kod operacji } } return -1; } 3. (zaczynają się problemy) GIGA wysyła komunikat po RS-485. Nie mam żadnych oznak niepoprawnego działania. Kod: void sendMessage(String message) { message.toCharArray(messageToSend, BatteryMonitor_Message_Lenght); digitalWrite(ReceiverOutputEnablePinNumber, HIGH); for (int i = 0; i < message.length(); i++) { Serial1.write(messageToSend[i]); } Serial1.flush(); delay(100); digitalWrite(ReceiverOutputEnablePinNumber, LOW); } 4. (nie działa) UNO czeka na przychodzący komunikat. Jeżeli coś się pojawia to odbiera i wyświetla na serial (USB). Niestety przy kolejnych naciśnięciach przycisku albo nic nie odbiera, albo odbiera śmieci. Ani razu nie dotarła wiadomość zwrócona przez GIGA. void loop() { if (digitalRead(5) == LOW) { //Jeśli przycisk jest wciśnięty readBasicInformation(); SerialDebug_BM_BasicInformation(); //na potrzeby debugowania wyświetla otrzymane informacje na Serial / USB } delay(150); } void readBasicInformation() { char returnMessage[140]; String complexField = ""; char nextCharacter; int index = 0; //funkcja wysyłania z pkt 1 – ta działająca. Na wejściu kod operacji sendReadMessage(BatteryMonitor_Functions_ReadBasicInfo); //wiadomości są zakończone dwoma znakami: \r\n int tmpTimeout = 0; //czekam na wiadomość. Aby nie zawiesić aplikacji symulacja timeout w oczekiwaniu na komunikat. Kod do refactoringu while (batteryMonitorSerialDevice->available() <=0 && tmpTimeout <=30) { delay(150); tmpTimeout++; } //odczyt znak po znaku i wyświetlanie na Serial w celu debugowania while (batteryMonitorSerialDevice->available() > 0) { //tu dostaję śmieci lub nic nie dostaję…. returnMessage[index] = batteryMonitorSerialDevice->read(); Serial.print(returnMessage[index]); index++; } //odczyt wyświetlanie na Serial w celu debugowania Serial.print("Return message full: "); Serial.println(returnMessage); } Co mogę robić źle?
  2. Satysfakcja gwarantowana, nawet jeśli nie będzie działać🙂, zobacz fotografie. Do rzeczy, jest to kontynuacja projektu o którym pisałem już jaki czas temu LINK, i z różnych przyczyn projekt został zmieniony, powodów jest kilka, a plusy takie: dostał STM32 zamiast AVR, napięcie 3.3V, koszt podzespołów, wydajność..... Z powodu znaczących zmian zdecydowałem się na utworzenie nowego tematu na forum. Głównym celem tego projektu jest zrobienie urządzenia, sterownika głównego, który przy pomocy dodatkowych modułów, będzie sterować w domu różnym sprzętem, np. rolety, podlewanie, oświetlenie, PV, Brama garażu i wjazdowa itp. Chciałbym zainstalować Suplę (może kiedyś mój własny system online), jedno z założeń, dlatego będzie esp12F i W5500. Jedno gniazdo USB B, do obsługi w komputerze terminala, wykorzystuję podczas testowania programu, łatwiej się pisze program. Pamięć ram, flash, oraz kartę pamięci SD do przetwarzania danych. Osprzęt który się znajdzie na płytce to : -STM32L431RCT, kwarc zegarowy 32KHz, bateria, - NRF24l01 - SRAM na SPI - LY68L6400 (64Mb) - slot karty pamięci mikro SD - pamięć FLASH SPI W25Q128JVS ( 128Mb) - Moduł Ethernet WIZnet W5500 ( jestem zwolennikiem kabla) - ESP12F ( nie wszędzie mam kabel;/) - interfejs RS485 ( 2 dniazda) - USB ( np. do terminala) - wyświetlacz ze sterownikiem GMG12864 lub FT811CB - kilka mikro switchy do obsługi Menu itp. - kilka wejść/ wyjść 3.3V - 16 diod LED -Buzzer - dwie przetwornice indukcyjne 3.3V i 5V Projekt tworzę w Kicad 6, płytki oraz montaż SMT zlecam JLCPCB, dzisiaj wysłałem pliki, już trafiło do produkcji. Myślę ze za około trzy tygodnie produkty dotrą do domu. Dzięki.
  3. Jako że wpadł do mnie na warsztat NVR z wyjściem RS485 oraz kilka kamer analogowych postanowiłem na testy zbudować sobie kamerkę z PTZ, no może bez Z. Na początek wyjaśnię co to jest PTZ skrót rozwijamy jako Pan Tilt Zoom, system wykorzystywany w kamerach do obracania kamerą oraz jeśli kamera posiada taką funkcjonalność regulacji ogniskowej. Głodnych wiedzy odsyłam do https://en.wikipedia.org/wiki/Pan–tilt–zoom_camera Zaczęło się od tego że znalazłem na stronie thingverse parę projektów: https://www.thingiverse.com/thing:107957 https://www.thingiverse.com/thing:2467743 Wydrukowałem jeden z nich i po szybkim złożeniu konstrukcji podłączeniu pod arduino nano, oraz napisaniu testowego programu wyszło coś takiego: Serwa które użyłem to Serwo TowerPro SG-90. Aby ruszyć dalej trzeba było zapoznać się z protokołem który wykorzystywany jest w komunikacji rejestrator -> kamera, padło na protokół Pelco-D. Znalazłem manual z 1999 roku dotyczący tego protokołu i całość prac programistycznych poszła dosyć sprawnie. pelco-d.pdf Szybkie podłączenie modułu rs485 do Arduino Nano i mojego nvr’a, krótki program i zaczynamy debug komunikacji. Przykład danych które odbieram poniżej: 255 4 0 4 39 0 47 SUM: 47 255 4 0 4 39 0 47 SUM: 47 255 4 0 4 39 0 47 SUM: 47 255 4 0 2 39 0 45 SUM: 45 255 4 0 2 39 0 45 SUM: 45 255 4 0 2 39 0 45 SUM: 45 Pierwszy bajt to synchronizacja, drugi to adres kamery, trzeci i czwarty to bajty w których przekazywane są polecenia, nas najbardziej interesuje bajt czwarty, gdzie 4 to obrót w lewo a 2 to obrót w prawo, dodatkowo w bajcie piątym i szóstym przekazywane są informacje o prędkości, a bajt siódmy to suma kontrolna. Teraz wystarczyło połączyć 2 programy w jeden i można kamerkę powiesić w warsztacie 🙂 no i nie do końca. Od tego momentu natrafiłem na pewną trudność. Okazało się że biblioteka Servo.h oraz SoftwareSerial.h korzystają z tego samego timera, co objawiało szarpaniem serwami przy jakiejkolwiek komunikacji po rs485. ehh…. Znalazłem inną bibliotekę ServoTimer2.h która według wielu źródeł powinna usunąć opisywaną trudność, więc po przerobieniu programu tak aby korzystał z nowej biblioteki, nic nie uległo zmianie 😞 Więc postanowiłem obejść problem programowo. //Look for incoming data from Pelco-D controller if (RS485Serial.available() > 0) { servo1.detach(); servo2.detach(); Wyłączając serwa na czas odczytu danych po rs485. Od tej pory wszystko zaczęło działać płynnie. Tak jak na poniższym filmie. Dodatkowo dorobiłem kontaktron na drzwi do warsztatu, tak aby kamera przy otwarciu drzwi ustawiała się na wchodzącego, a po zadanym czasie z powrotem kierowała się na okno. Program przewiduje obroty kamerą w wszystkie strony z uwzględnieniem prędkości wysyłanej z NVR’a, scan kamerą po pomieszczeniu, oraz presety. switch (data) { case 0x00 : break; case 0x02 : pulseWidth1 = pulseWidth1 + turnRate1; break; // right case 0x04 : pulseWidth1 = pulseWidth1 - turnRate1; break; // left case 0x10 : pulseWidth2 = pulseWidth2 - turnRate2; break; // down case 0x08 : pulseWidth2 = pulseWidth2 + turnRate2; break; // up case 0x0C : pulseWidth1 = pulseWidth1 - turnRate1; pulseWidth2 = pulseWidth2 + turnRate1; break; // left-up case 0x0A : pulseWidth1 = pulseWidth1 + turnRate1; pulseWidth2 = pulseWidth2 + turnRate1; break; // right-up case 0x14 : pulseWidth1 = pulseWidth1 - turnRate1; pulseWidth2 = pulseWidth2 - turnRate2; break; // left-down case 0x12 : pulseWidth1 = pulseWidth1 + turnRate1; pulseWidth2 = pulseWidth2 - turnRate2; break; // right-down case 0x1B : scan = 1; break;// scan on case 0x1D : scan = 0; break;// scan off case 0x07 : // presets if (byteReceived[5] == 1) // drukarka { pulseWidth1 = 90; pulseWidth2 = 140; } else if (byteReceived[5] == 2) // tv { pulseWidth1 = 35; pulseWidth2 = 140; } else if (byteReceived[5] == 3) // drzwi { pulseWidth1 = drzwiS1; pulseWidth2 = drzwiS2; } else if (byteReceived[5] == 4) // okno { pulseWidth1 = oknoS1; pulseWidth2 = oknoS2; } break; } W planach mam funkcjonalność ustawiania presetów z rejestartora, lecz nie było mi to potrzebne w tej chwili, a dostęp do ardiuno mam na wyciągnięcie ręki, więc zawsze mogę go przeprogramować. Zastanawiała mnie również żywotność serwomechanizmów, jak narazie cała konstrukcja wisi już ponad pół roku, do warsztatu wchodzę przynajmniej 5 razy dziennie, w soboty i niedziele licznik wejść myślę że dobija do jakiś 20 i jak dotychczas nic złego im się nie dzieje. Poniżej udostępniam również kod do arduino gdyby ktoś chciał się również pobawić. Lista użytych elementów: Arduino nano Nano Expansion Adapter Serwomechanizmy moduł RS485 Kod źródłowy: PTZ_rs485.zip
  4. Witam Państwa, jestem na etapie przygotowywania się od projektu, który będzie systemem kontroli dostępu do pomieszczeń. Raspberry Pi będzie głównym urządzeniem na którym będą przechowywane w bazie danych informacje o dostępach dla użytkowników. Sterownikiem otwarcia drzwi będzie układ oparty o Arduino Uno. Arduinio będzie wykorzystane maksymalnie w ilości 5 sztuk. Zastanawia mnie komunikacja czy będzie można wykorzystać standard RS485? Jeżeli tak to jakiej biblioteki najlepiej użyć. Komunikacja zawsze będzie dwustronna pomiędzy Raspberry a Arduino lub Arduino a Raspberry. Liczę na Waszą wiedzę i doświadczenie, pozdtawiam.
  5. Witam. Muszę wykonać projekt robota pomiarowego. Ostatnim elementem, jaki mi został jest przesyłanie danych z kontrolera MIC488 do Arduino. Chciałbym to wykonać wykorzystując MODBUS-a RTU. Zaopatrzyłem się w układ MAX485. Potrzebuję pomocy z użyciem bibliotek MODBUS(jaka wybrać do mojego projektu oraz jak jej używać). Przykłady w Internecie sa dla mnie niejasne. Z początku myślałem nad stworzeniem zmiennej o strukturze takiej samej jak ramka danych z MIC488 i do niej odczytywać wszystkie bajty. Pojawił się problem z informacją zwrotną do sterownika MIC488, dlatego wolałbym wykorzystać jakaś istniejąca bibliotekę. Liczę na Waszą pomoc.
  6. Witam, moj pierwszy post na tym forum wiec pozdrawiam wszystkich 🙂 Przy okazji instalacji fotowoltaniki w gospodarstwie domowym stwierdziłem, ze fajnie by było monitorować bilans energetyczny. W tym celu zakupiłem licznik, po pierwszych nieudanych próbach połączenia z NodeMcu stwierdziłem ze wygodniej będzie postawić tam jakieś Raspberry - licznik jest w trudno dostępnym miejscu, Arduino OTA się nie sprawdziło, wiec postawiłem na wygodę czyli SSH. Zakupiłem Raspberry Pi Zero oraz nakładkę z interfejsem RS485 https://botland.com.pl/pl/raspberry-pi-hat-komunikacja/11722-rs485-pi-sn65hvd72-interfejs-rs485-dla-raspberry-pi-7426787870163.html?search_query=RS485+hat&results=3. Przygotowałem raspberry tak jak jest napisane tutaj http://minimalmodbus.readthedocs.io/en/master/installation.html i napisalem spkrypt: import minimalmodbus SLAVE_ADDRESS = 1 REGISTER_ADDRES = 0 # przykladowo minimalmodbus.BAUDRATE = 9600 minimalmodbus.PARITY = 'E' ins = minimalmodbus.Instrument('/dev/ttyAMA0' SLAVE_ADDRESS) print(ins.read_register(REGISTER_ADDRESS)) Problem w tym, ze skrypt zachowuje się losowo, czasem zadziała czasem wyrzuci IOError (No connection with module), kiedy np dla rejestru 32 bitowego używam read_long() lub dla floata read_float() wyrzuca albo IOError lub ValueError. Czy ktoś ma doświadczenie w tej materi i wie co posprawdzać, co może byc nie tak? Jak będę w domu wrzucę pełne opisy błędów. z gory dzięki 🙂
×
×
  • 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.