Is er een simpele manier om twee Arduino te koppelen

blackdog

Golden Member

Hi,

ik wil van een arduino data naar een andere overzetten zonder galvanische koppeling.

Het gaat om twee Arduino nano modellen waar ik mee werk 328 modellen.
Wat status signalen is makkelijk via opto.
Maar ik wil eventueel ook een temperatuur over zetten.

Kan dat b.v. via twee maal een opto via de seriele poort?

Dank en groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
Arco

Special Member

Dat kan, maar standaard opto's als de PC817 zijn vreselijk traag en halen hooguit betrouwbaar 19k2 baudrate.
Er zijn dedicated opto scheiders voor serieel/i2c/spi, die zijn veel sneller.

TI heeft (te) veel keus... ;)
https://www.ti.com/isolation/digital-isolators/overview.html

[Bericht gewijzigd door Arco op zaterdag 4 mei 2024 00:47:26 (20%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
McAwesome

Golden Member

Zoiets als een ADUM1250 bijvoorbeeld: https://www.analog.com/en/products/adum1250.html

Deze is voor I2C bedoeld, maar kan je ook voor andere signalen gebruiken. Nu heb je voor het overzetten van een temperatuur niet echt hoge snelheid nodig want veel informatie is dat niet. 19k2 baudrate is meer dan genoeg voor zoiets. Ik heb ooit nog aan die snelheid op het internet gezeten begin de jaren '90 :+

Je zegt zonder galvanische koppeling, dan knoop je toch de uarts direct aan elkaar? Hoeft niks tussen.
TX 1--->RX 2
RX 1<---TX 2
GND1----GND2

[Bericht gewijzigd door henri62 op zaterdag 4 mei 2024 01:33:27 (16%)

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
McAwesome

Golden Member

"Zonder galvanische koppeling" lijkt mij hetzelfde als "met galvanische scheiding", dus elektrisch van elkaar geïsoleerd. Kan wel wat verwarrend zijn :?

Er zijn snelle optocouplers, zoals de 6N137 om een oude bekende te noemen.
Ook goede ervaringen met de iso1540 voor I2C. I2C kan allicht handig zijn als de hardware nog vrij is, en de UART's niet.

blackdog

Golden Member

Hi,

Dank weer voor alle input!

Waarom?
Dit is voor iets waar ik als een "zij projectje" af en toe aan bezig ben.
Het doel is een dual oventje waarbij ik verschillende technieken gebruik.

Het leerproject gaf aan dat b.v. een 3524 PWM geregeld oventje heel aardig werkte.
Maar ook dat het stoorniveau hoog was en dit samen met gevoeligheid van het massa punt door de in verhouding grote stromen.
Dit samen met de kleine signalen die van de sensor afkomt maakt het moeilijk goed op te bouwen.

Ook heb ik testen gedaan met een Arduino en een 18D20 sensor met een PID met een frequentie van rond de 1Hz.
Daarbij de MOSFet die de verwarmings weerstanden schakeld traag gemaakt dus de MOSFet krijgt veel minder stijle flanken op zijn Gate.
Die stijle flanken kunnen de andere electronica storen in het systeem, dus door het goed afstemmen van de flank stijlheid en
de lage frequentie van de PID regelaar, kan ik het hopelijk stoorvrij krijgen.
De hele ovencontroler van de binnen oven komt dus zwevend van de rest van de electronica.

Wat betreft de microcontroler, daar heb ik net de beslissing over genomen, wou het eerst met een USB versie van de ATTiny doen,
deze heeft ook de comparator die nodig is voor mijn gekozen temperatuur sensor welke de TI LMT01 is, zeg maar een "soort" 18DS20 alleen wat sneller (0,1-Sec) voor 12 bit resolutie.
Deze sensor heb ik gekozen omdat ik er een paar van heb en ik een digitale sensor wou hebben voor deze toepassing, dus geen analoge onzekerheden van onder meer de referenties van de microcontroler enz.
Maar deze ATTiny kan niet makkelijk met de Serial functie van de IDE omgaan, dus het wordt dan toch een Pro Mini omdat deze wat kleiner is dan de Nano.
Uit deze PID controler voor de binnen oven komt uit de software van de sensor een aantal pulsen, die met de volgende code wordt omgezet naar een temperatuur en de setpoint voor de PID software.

temperatureC = 256.000 * pulseCount / 4096.000 - 50;

Voor de buitenoven ga ik ook een Arduino Nano of Pro Mini gebruiken, dus ik wil b.v. het getal van de conversie van de temp sensor die bij 50C rond de 1602 ligt overzetten naar de controler die de buiten oven en het display aanstuurd dat ik ga gebruiken.

Dus als ik eenvoudig deze waarde kan overzetten b.v. met opto en niet te veel code dan zou ik daar blij mee zijn.
Het is geen moetje, ik kan er altijd een analoge of digitale sensor bij hangen in de binnen oven, en daarmee kan ik ook de temperatuur status mee aflezen.

De binnen oven heeft maar weinig energie nodig, deze zal ongeveer 5C hoger liggen dan de temperatuur van de buiten oven, maar ik wil wel dat hij redelijk snel op temperatuur komt.
Dus de voeding van 10V uit een LM317 zal met een transistor omlaag worden gebracht naar b.v. 5V voeding voor de verwarmings weerstanden.
Dit maakt het regelbereik mooier voor de PID, dan ga ik b.v. van 10-Watt Max. opstart vermogen, naar 2,5 watt Max. als alles stabiel is geworden.

Dus is er een simpele manier om de waarde van vier digits(veranderd met de temperatuur tussen 1100 en 1700) die de temperatuur van de binnen oven aangeeft over te zetten naar de controler van de buiten oven voor verdere bewerking.

Dank en groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
buckfast_beekeeper

Golden Member

Van Lambiek wordt goede geuze gemaakt.

Je wilt de temperatuur doorgeven om af te lezen, dus veel sneller dat 1x per seconde heeft geen zin.

Dus UART is op iedere snelheid snel genoeg.

Ook is je dataverkeer een richting, en kun je niets me terugkoppeling (als de data verkeerd doorkomt kun je hoogstens de data nogmaals sturen. Maar dat ga je toch al doen op de data bij te werken. Hooguit kun je een controle-cijfer toevoegen).

Dus met een optocoupler, aan de binnenkant aan de Tx en aan de buitenkant aan de Rx ben je klaar. De andere kant op, van buiten-Tx naar Binnen-Rx laat je gewoon weg.

1200 baud is snel zat, dus je kunt de flanken van de Tx helemaal sloom dempen.

1200 baud is bovendien traag genoeg op betrouwbaar met softwareSerial te werken, waardoor het op iedere Arduino pin kan, niet alleen op de HW-UART pinnen.

Ik zou UART gebruiken, niet I2C of SPI omdat het slechts 1 ader/optocoupler (per richting) nodig heeft.

Ik gebruik de HCPL0630. Familie van de 6N137 volgens mij (die staat in hetzelfde datasheet? Yep: https://www.broadcom.com/products/optocouplers/industrial-plastic/digi…) De 0600 als je maar 1 kanaal nodig hebt.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

De PC900 is ook redelijk snel. (ik gebruik 'm voor Midi, 31.25kBaud. de PC817 laat 't dan al lang afweten)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op zaterdag 4 mei 2024 02:21:20 schreef McAwesome:
"Zonder galvanische koppeling" lijkt mij hetzelfde als "met galvanische scheiding", dus elektrisch van elkaar geïsoleerd. Kan wel wat verwarrend zijn :?

8)7
Paar opto's er tussen (met torretjes voor de drive current). Zie de suggesties van anderen.

[Bericht gewijzigd door henri62 op zaterdag 4 mei 2024 17:16:58 (15%)

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

De HCPL06x0 stuur ik gewoon vanuit een microcontrollerpootje met een 470 Ohm weerstand in serie. Dus met 2V over de weerstand wordt dat ongeveer 4mA. Moet kunnen, geen tor nodig. Met een 4k7 als pullup op de ontvangende kant: dit werkt prima op 250000 bps.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Paulinha_B

Honourable Member

Kan dat b.v. via twee maal een opto via de seriele poort?

Waarom twee maal? De tweede zou enkel nodig zijn als er terugmelding nodig is, bv. handshake. Om met lage frekwentie (1x per seconde?) weinig data (handvol bytes toch maar, voor een temperatuur) door te sturen lijkt me dat niet nodig.

benleentje

Golden Member

Dus als ik eenvoudig deze waarde kan overzetten b.v. met opto en niet te veel code dan zou ik daar blij mee zijn.

Voor de arduino die moet zenden is er voor seriële oversturen maar een paar regels code extra nodig.

Voor de te ontvangen kant is er ook nog niet eens zoveel code extra nodig.

In de Arduino ide zitten er een voorbeeld sketch voor hoe je serieel moet ontvangen.

Ik weet niet op de arduino in de binnen oven persee klein moeit zijn want er zijn er die een stuk kleiner zijn dan de nano.

In de testfase zou ik eerst eens 2 arduino's proberen te koppelen zonder opto's en dan later als dat naar tevredenheid werkt de opto's toevoegen

[Bericht gewijzigd door benleentje op zaterdag 4 mei 2024 18:47:04 (13%)

blackdog

Golden Member

Hi,

Dank weer voor de antwoorden.

Vanmiddag net voor ik de deur uit ging voor een wandeling, dacht ik er aan om nog even te zoeken naar i2c koppeling tussen Arduino ‘s op YouTube.
Dit aan de hand van wat opmerkingen van jullie, om dat in overweging te nemen.

Ik heb nog nooit twee Microcontrolers gekoppeld om wat data uit te wisselen, dus dit lijkt mij een goede manier om dit te leren.
De i2c opto's van TI heb ik hier nog een paar van op voorraad, dat is dus geen probleem.
Die waren aangeschaft voor een ander project en ik had er nog en paar over.
De onderstaande link is van DroneBot Workshop en zijn code kan ik denk ik kaal te slopen om alleen de data over te zenden die ik nodig heb.

https://www.youtube.com/watch?v=PnG4fO5_vU4

Waar ik dan wel weer rekening mee moet houden is dit, het zijn wel weer vier draden, maar als ik goed oplet, kan het via twee door de binnen oven heen.
De 5V voeding kan van een ander punt komen voor de i2c isolator, dit bedoel ik in verband met de "warmte lek" via de bedrading.
Ik weet nog niet precies hoeveel ruimte ik in het binnen oventje over houd, over een aantal zaken moet ik nog beslissingen nemen.
Dit weer i.v.m. b.v. een Pro Mini en de power MOSFet op de bodem van de binnen oven, de elektronica die op temperatuur moet worden gehouden, kan er dan boven gemonteerd worden.

Ik ga aan de slag met de i2c isolatoren van TI en twee Nano's voor het testen van de code van DroneBot.
Ik laat weten als dit lukt.

Groet,
Bram

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Op zaterdag 4 mei 2024 18:44:33 schreef Paulinha_B:
[...]
Waarom twee maal? De tweede zou enkel nodig zijn als er terugmelding nodig is, bv. handshake. Om met lage frekwentie (1x per seconde?) weinig data (handvol bytes toch maar, voor een temperatuur) door te sturen lijkt me dat niet nodig.

Voor een "ontwikkelproject", is het als je eenmaal bezig bent niet zo veel extra werk om het terug-kanaal ook op te tuigen. En als je dan met de software bezig bent, kan dat enorm handig zijn als je zoals blackdog VEEL ervaring hebt met heel andere dingen maar niet in het programmeren van microcontrollers.

Als "test" of je het werkend hebt kan je dan een ping-pong maken. De ene stuurt ping en als die dat ongvangt stuurt ie "pong".

En best-case powercycle je het "remote" ding en kan je hem via de bootloader van nieuwe firmware voorzien over de tweeweg datalink.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Is het essentieel dat je geen galvanische koppeling hebt, of is condensator om DC te blokkeren ook genoeg? In dat geval is er nog wel wat te bedenken, maar het zal complexer zijn (in software) dan een enkele optocoupler aan een UART.

In plaats van die optocoupler, zou een klein signaal transformatortje ook kunnen, maar ook dan moet je iets slims doen in software om het DC niveau gemiddeld op 0 te houden.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

Op zaterdag 4 mei 2024 00:32:53 schreef blackdog:
Het gaat om twee Arduino nano modellen waar ik mee werk 328 modellen.
Wat status signalen is makkelijk via opto.
Maar ik wil eventueel ook een temperatuur over zetten.

Kan dat b.v. via twee maal een opto via de seriele poort?

Hé Bram,

Ik gebruik al een hele tijd optocouplers tussen de PC en de controller. Het zijn geen snelle signalen, bij mij tussen de 100 en 500Hz. Ik verzend dus max 500 X per seconde en dat werkt prima. Ik kan het af met de PC817, maar er zijn ook veel snellere te krijgen.

Dus op je vraag kan het, ja.

Als je haar maar goed zit, GROETEN LAMBIEK.

Op zaterdag 4 mei 2024 20:53:38 schreef SparkyGSX:
Is het essentieel dat je geen galvanische koppeling hebt, of is condensator om DC te blokkeren ook genoeg? In dat geval is er nog wel wat te bedenken, maar het zal complexer zijn (in software) dan een enkele optocoupler aan een UART.

In plaats van die optocoupler, zou een klein signaal transformatortje ook kunnen, maar ook dan moet je iets slims doen in software om het DC niveau gemiddeld op 0 te houden.

RS232/422/485 werkt met een hoog rustniveau, dat je prima met bias-weerstanden in kunt stellen (op vervoorbeeld 0.8*Vcc)

Als dan een laag gebruik (werkelijk data/s) op je link hebt, en je korte pulsen (hoge baudrate) gebruikt, dan zou het me niet verbazen als je met alleen een C'tje (en misschien een extra vrijloopdiode om de ESD-diode te ontlasten) weg komt.

RC tijd moet dan (veel) langer zijn dan 1 symbool op je link, en de rusttijd tussen twee symbolen veel langer dan je RC tijd.

Trafotje kan dan ook, werkt hetzelfde als een C'tje.

McAwesome

Golden Member

Ik zou gewoon optocouplers nemen, dat is het eenvoudigste. Echt snel hoeft het niet te zijn.

Ik gebruik regelmatig de TLP2745/TLP2748 van Toshiba. Dat is wel een behoorlijk snelle maar die heeft als voordeel dat die een digitale uitgang heeft en aan de kant van de led aan 1,6mA genoeg heeft om de uitgang te activeren.

benleentje

Golden Member

dacht ik er aan om nog even te zoeken naar i2c koppeling tussen Arduino ‘s op YouTube.

In een nano zit geen hardware protocol ondersteuning voor het ontvangen van I2C. Het kan wel het moet dan allemaal via extra software, dan is serieel een stuk eenvoudiger daarvoor zit alles wel in de nano.

Begin alsjeblief niet met I2C te rommelen, is niet bedoeld voor lange afstanden en is een stuk lastiger te programmeren.

Zoals al gezegd is de seriele poort een stuk simpeler zowel in hardware als software.

Gewoon heen en terug implementeren anders heb je nooit feedback of/wat er aangekomen is aan de andere kant. Je zult later dankbaar zijn dat je beide richtingen hebt, voor debuggen verrekte handig.

Kost 2 opto's + 2 weerstandjes als je inderdaad moderne opto's gebruikt met een high efficiency led er in. Direct aan de CPU hangen is dan prima.
Een andere oplossing is zo'n digitale opto chip (HCPL dingen), heb je niks extras voor nodig.

Enne, je hebt echt wel een wat snellere opto nodig als 500 Hz (wat lambiek zegt) je moet je baudrate * 10 vermenigvuldigen (start + 8 data + stop bit) + marge (niquist weet je wel) voor de benodigde bandbreedte.
Dus bij 9600 baud mininmaal 250 kHz of zo. Maar dat doen die digitale dingen allemaal (zijn dacht ik 500 Kbaud of 1 Mbaud standaard?)

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
McAwesome

Golden Member

Op zondag 5 mei 2024 00:58:34 schreef henri62:
Begin alsjeblief niet met I2C te rommelen, is niet bedoeld voor lange afstanden en is een stuk lastiger te programmeren.

Die digitale isolator-IC's voor I2C hoef je niet absoluut met het I2C-protocol te gebruiken. Je kan daar evengoed serieel of een eigen protocol over sturen. Je kan die dingen zelfs "misbruiken" voor level-conversie. Desnoods kan je zelfs een DS18B20 sensor op zich via een datakanaal van zo'n IC laten gaan. Dan is de sensor galvanisch gescheiden van de controller die deze uitleest.

Op zondag 5 mei 2024 00:58:34 schreef henri62:
Enne, je hebt echt wel een wat snellere opto nodig als 500 Hz (wat lambiek zegt) je moet je baudrate * 10 vermenigvuldigen (start + 8 data + stop bit) + marge (niquist weet je wel) voor de benodigde bandbreedte.
Dus bij 9600 baud mininmaal 250 kHz of zo. Maar dat doen die digitale dingen allemaal (zijn dacht ik 500 Kbaud of 1 Mbaud standaard?)

9600 baud, dat is bij een RS-232 serieel protocol eigenlijk hetzelfde als de bitrate. Als je uitgaat van 1 startbit, 8 databits en 1 stopbit, geen pariteitsbit dan zijn dat dus 960 karakters of 8-bit getallen per seconde. De optocoupler hoeft dus helemaal niet 250 kHz aan te kunnen. In principe is 9600 baud zelfs met meer ouderwetsche optocouplers nog haalbaar. De optocouplers die ik eerder vernoemde (TLP2745 en TLP2748) doen 10 Mbps en zijn niet duur.

[Bericht gewijzigd door McAwesome op zondag 5 mei 2024 01:23:34 (26%)

Op zondag 5 mei 2024 01:16:08 schreef McAwesome:
[...]

9600 baud, dat is bij een RS-232 serieel protocol eigenlijk hetzelfde als de bitrate. Als je uitgaat van 1 startbit, 8 databits en 1 stopbit, geen pariteitsbit dan zijn dat dus 960 karakters of 8-bit getallen per seconde. De optocoupler hoeft dus helemaal niet 250 kHz aan te kunnen.

8)7 Oops, je hebt gelijk (moet 20 kHz zijn), het is al laat, wordt tijd dat ik ga slapen.......

-edit- Net even die TLP2745 en TLP2748 bekeken die zijn identiek op het inverteren van het uitgangs-signaal na.

[Bericht gewijzigd door henri62 op zondag 5 mei 2024 01:27:08 (10%)

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.