Több arduino összekötése RS485-el.

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
spotlite
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. február 23. szerda, 7:00
Tartózkodási hely: Érd-Parkváros
Kapcsolat:

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: spotlite » 2014. október 18. szombat, 21:55

Szia!

Bár én zöldfülű vagyok a témában, de a arduino tele van mindenféle biztosítékkal, nem hinném, hogy az ellenállások kihagyása okozza a problémát. Pont a minap olvasgattam egy másik problémámmal kapcsolatban a Watchdog-ról. Nem tudom, hogy azt külön kell bekapcsolni, vagy ez alapból működik, de lehet, hogy az blokkolja a kontrollert. Idézném Róbert tanfolyamából az ide vonatkozó részt:
Watchdog

A megszakítások különleges alfaja. Egy belső, önálló időzítővel és számlálóval bíró egység a Watchdog. Feladata a rendszer stabilitásának biztosítása olymódon, hogyha a program valami módon nem válaszol (végtelen ciklusba kerül, kiakad), akkor a chip újraindulását kezdeményezi. Gyakorlatilag egy hardware resetkérelmet generál.
A watchdog amilyen hasznos, Arduino alatt annyira túlbiztosított működésű. Ha a chip indulásakor érzékeli, hogy WatchDog volt az újraindulás oka, akkor amíg a szoftvert nem frissítjük az Arduino hardware-ben - megakadályozza a főprogram indulását!
A watchdog közvetlenül nem kezelhető standard Arduino utasításokkal.

Ha kipróbáltunk Watchdogot tartalmazó kódot és fejreálltunk, akkor a főprogram frissítés menete:

Reset gombot nyomva tartjuk,
Arduinot a PCre csatlakoztatjuk (resetgomb nyomva!),
Arduino keretrendszer indít és a Example - basic - digital - blink betölt,
File - Upload,
Ahogy a soros kommunikációt jelző LED felvillan, a reset-gombot elengedni!
Ha a feltöltés sikerült, a WatchDog jelzés törlésre kerül.
A WatchDog ilymódon a téves programindulásokat, áramköri lefagyásokat hivatott megakadályozni.
És miért tud jól működni?
- mert a belső, független oszcillátorról jár - nem egy bizonytalan felépítésű külső jelről,
- belső, önálló számlálója van, így 1 msec és 2 sec közt beállítható a billenési ideje,
- tetszőlegesen indítható-leállítható-nullázható.
- a watchdog hardware független a processzor kritikus részeitől.

Remélem ez megoldja a problémádat!

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9917
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: Robert » 2014. október 19. vasárnap, 8:34

Ha elhagyod az ellenallast, akkor mindket ic vetelen van : lebeg a busz. Ez bizony soros veteli hibat okoz. Es ha nincs a programod felkészítve, akkor ez örök várakozást/programhibát okoz. De erre nem megoldás a watchdog!
Tessék a hibát lekezelni/megelőzni. A tüneti kezeléssel csak még nagyobb katasztrófa fele lehet sodródni... :!:

Avatar
spotlite
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. február 23. szerda, 7:00
Tartózkodási hely: Érd-Parkváros
Kapcsolat:

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: spotlite » 2014. október 23. csütörtök, 7:35

Nekem is sikerült tegnap éjjel összehoznom az "A", "B" küldözgetős kommunikációt. Bár ahhoz, hogy működjön a Slave programokban a beolvasott érték hibás definiálását int-ről módosítani kellett char-ra, így már volt esélye hogy megegyezzen a küldött és a várt karakter. A teljesség kedvéért 5 db mega panellal próbálkoztam, és ebay-es szerelt max485-ös lapkákkal most is stabilan működik. Következő lépésként most reggel próbáltam Róbert által linkelt simple modbus protokollt használni.
Mivel nulla infóm van, ezért a mintákkal próbálkoztam. A kódba szép nagy leírás van angolul. Sajnos már itt elakadtam, mert ezt azt még kihámozok belőle, de mivel azt sem tudom a háttérben minek kéne történni, így a szöveg megértését feladom. Gondoltam tudatlanságomnál fogva elfogadom ami oda van írva, de hiába. Feltöltéskor a master kódban hiba van, aminek szerintem nem kéne megtörténjen, pedig szerintem rendesen fel van telepítve a libary.
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
Arduino: 1.0.6 (Windows 7), Board: "Arduino Mega 2560 or Mega ADK"
In file included from SModbusMaster.ino:103:
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h:131: error: expected ',' or '...' before numeric constant
In file included from C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/HardwareSerial.h:28,
from C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h:215,
from SModbusMaster.ino:103:
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Stream.h:57: error: expected ',' or '...' before numeric constant
In file included from SModbusMaster.ino:103:
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h:222: error: expected ',' or '...' before numeric constant
SModbusMaster:111: error: 'Packet' does not name a type
SModbusMaster:117: error: 'packetPointer' does not name a type
SModbusMaster:118: error: 'packetPointer' does not name a type
SModbusMaster.ino: In function 'void setup()':
SModbusMaster:141: error: 'packet1' was not declared in this scope
SModbusMaster:141: error: 'READ_HOLDING_REGISTERS' was not declared in this scope
SModbusMaster:141: error: 'modbus_construct' was not declared in this scope
SModbusMaster:144: error: 'packet2' was not declared in this scope
SModbusMaster:144: error: 'PRESET_MULTIPLE_REGISTERS' was not declared in this scope
SModbusMaster:171: error: 'packets' was not declared in this scope
SModbusMaster:171: error: 'modbus_configure' was not declared in this scope
SModbusMaster.ino: In function 'void loop()':
SModbusMaster:178: error: 'modbus_update' was not declared in this scope

Úgy gondolom evvel a hiba infóval az tud valamit kezdeni, aki tudja minek kellett volna történni. Mivel tényleg semmi hasznos használható, és működő leírás sincsen a 10 millió magyarnak semelyik protokollról, így kénytelen vagyok a már működő primitív megoldást továbbfejleszteni.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9917
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: Robert » 2014. október 23. csütörtök, 8:48

Arduono-1.0-hoz való, ahogy a hibaüzeneteket nézem....

zsolt_74
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2013. július 1. hétfő, 19:29

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: zsolt_74 » 2015. április 8. szerda, 20:52

Sziasztok!

Lenne egy olyan kérdésem, hogy működhet-e az RS-485 kommunikáció különböző feszültségű arduino eszközök között.
Itt gondolok arra, hogy pl. adott egy Arduino DUE(3,3V) lap és egy arduino mega 2560(5V) lap.
Elegendő volna az Arduino DUE is a feladatra, de sajnos a vezérlő és a vezérelt eszközök nem egy helységben vannak hanem egymástól kb. 10 m és egy utp kábellel van összekötve a két helység ezért gondoltam az RS-485-re mert ehhez elegendő lenne a kábelezés(2 szál a kommunikációnak és 2 szál a tápellátásnak), de javítsatok ki ha nem így van .
Az Arduino DUE látná el a master(LCD+touch) feladatot és az Arduino mega2560 lenne a slave(relék, érzékelők).
Találtam külön-külön 3,3V rendszerhez és 5V rendszerhez való RS-485 modulokat csak azt nem tudom és nem találtam rá utalást, hogy ezek összeköthetőek-e.
Segítségeteket előre is köszönöm.

Üdv: Zsolt

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9917
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: Robert » 2015. április 8. szerda, 21:07

Igen. MAX485, 75176 : 5V-os illesztőIC, míg a MAX3485 3.3V-os feszültségű illesztőchip.
A 485 buszfeszültséget ezek a chipek lekezelik, simán keverhetőek a buszon.

zsolt_74
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2013. július 1. hétfő, 19:29

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: zsolt_74 » 2015. április 8. szerda, 21:18

Nagyon szépen köszönöm a gyors választ. Ezzel kapcsolatban megnyugtattál. :)
Akkor utána olvasok pontosabban, mer nem használtam még az RS-485-t.
Esetleg bővebb magyar nyelvű leírást hol találok, vagy ehhez is van library és minta kód arduino-hoz?


Üdv: Zsolt

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9917
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: Robert » 2015. április 9. csütörtök, 3:34

A 485 az a fizikai réteg. E felett többféle protokoll van:
- DMX
- Modbus
- benbus
- stb....

Wikipedia anyaga 485ben elég jó. A prtokollokhoz van kész függvénykönyvtár...

zsolt_74
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2013. július 1. hétfő, 19:29

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: zsolt_74 » 2015. április 9. csütörtök, 20:21

Szia!
Véleményed szerint melyik protokollt érdemes előnyben részesíteni.
Sajnos a jelenlegi tudásom ezekről a protokollokról kb. egyenlő a nullával(,de már olvasgatok utána). Amit eddig használtam az RS-232 volt, ezzel kapcsolatban nagyjából képbe vagyok.
A felsorolt protokollok kezelés közül melyiket a legkönnyebb elsajátítani, vagy melyik az ami esetleg a későbbi fejlesztéseknél jobb lehet.
Jelen esetben csak 1db slave lenne amivel reléket és érzékelőket szeretnék felügyelni, de a későbbiekben ez lehet, hogy bővülni fog.

Üdv: Zsolt

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9917
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: Robert » 2015. április 9. csütörtök, 20:47

Én a RS-485/ModBus-ra szavazok:
- robosztus,
- ipari,
- busz rendszerű (nem elágazásos!)
- 32 eszközig simán bővíthető.

kukuri
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: kukuri » 2015. július 5. vasárnap, 12:54

Üdv!

Most kellene összeraknom két arduinot hogy egymással kommunikáljon. Mivel egy hosszabb stringet kell átadni és egymás után folyamatosan ezért az A-B küldözgetés nem jó. Mivel a két vezérlő között oda vissza kell adatkommunikáció.
Kellene a MODBUS. Feltöltve a mintakódokat semmi nem történik. Most keresve a neten meg semmi használható libet nem találok. Ami linket Róbert korábban belinkelt meg már nem él.
Tehát keresek egy könnyen beilleszthető MODBUS libet amivel tudok stringet küldeni arduinok között.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9917
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: Robert » 2015. július 5. vasárnap, 14:19

A modbus half duplex. Azaz ami neked kell, hogy egyidejű Oda-Vissza: nem megy.

kukuri
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: kukuri » 2015. július 5. vasárnap, 17:00

Nem kell hogy egyidejű legyen.
A master elküldi a stringet a slavenek. Az feldolgozza és egy stringben válaszol a masternek.
Kivettem az ES485 modulokat és összekötöttem az RX-TX lábakat. Úgy látszik a mintakód működik. Nyilván ebben az esetben az engedélyező nem játszik és nem is lesz nekem jó.

kukuri
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: kukuri » 2015. július 5. vasárnap, 18:51

A mintakód egy int típusú adatot küld el. Nekem pedig szöveget kellene átküldeni.
Lehet szöveget átküldeni? Vagy karakterenként kell megoldani a küldést?
Jelenleg hibákba futok. MODBUS lib felhasználásra meg nem találok leírás. Itt nem az elméletit keresem hanem a SimpleModbus lib használatát.

kukuri
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: Több arduino összekötése RS485-el.

HozzászólásSzerző: kukuri » 2015. július 6. hétfő, 20:41

A Modbus következő sorai adják meg az adatszerkezetet amit írni és olvasni lehet. A mintakódban egy regisztert lehet írni és olvasni.

Kód: Egész kijelölése

  // read 1 register starting at address 0 
  modbus_construct(packet1, 2, READ_HOLDING_REGISTERS, 0, 1, readRegs);
 
  // write 1 register starting at address 1 
  modbus_construct(packet2, 2, PRESET_MULTIPLE_REGISTERS, 1, 1, writeRegs);

Valaki tudja mit kell átállítani hogy karakter sorozatot is át lehessen küldeni egyszerre?
Egymás után tudok karaktereket küldeni és a másik oldalt összerakni, de az nagyon lassú folyamat. talán 10 karakter /s. Ettől jóval több kellene.
A leírás szerint 118 byte ot is át lehet küldeni. Kérdés hogy mit kell átállítani. A writeRegs csak int tipust fogad el. Itt megállt a tudományom. :(


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég