Go Down

Topic: Tekst verzenden van master naar slave display (Read 198 times) previous topic - next topic

Superheide

Hallo,

Is er iemand die ervaring heeft met master/slave configuraties?
Ik heb 8 arduino megas met elk 8 oled displays, in totaal 60 stuks. Nu wil ik teksten kunnen aanpassen vanuit de master. Iemand ervaring hiermee hoe dit te kunnen realiseren?

Alvast bedankt

Paul

MAS3

Hoi Superheide.

De informatie in je vraag is wel heel beperkt.
Maar ik lees dat je 1 master hebt, en die master kan de inhoud van 60 displays beïnvloeden.
Ik lees nergens dat de master de inhoud van die displays leest of moet lezen, dus ik ga er van uit dat de master dat niet doet.

Het feit dat je een master en slaves hebt, is dat je in ieder geval kunt voorkomen dat meerdere masters, of überhaupt meerdere bronnen door mekaar gaan lopen roepen.

Master / slave impliceert ook een bus systeem.
Wat je dan dus gaat doen is dat de master een slave aanspreekt, waarna de slave een bepaalde tijd heeft om te reageren.
Verloopt deze tijd, dan volgt een time out en zijn gegevens die daarna nog volgen niet meer te accepteren.
Dat aanspreken kan door je bericht te laten beginnen met een adres.
Iedere slave heeft dan dus een eigen adres.
De master overigens ook, vaak is dan een laag adres geldig zoals nul of 1.
Als je nog wat verder wilt gaan kun je ook nog een broadcast doen, bijvoorbeeld door het adres FF (256) te gebruiken.
Dat zou dan betekenen dat alle slaves aangesproken worden, bijvoorbeeld ter initialisatie.
Dit kan handig zijn, de master kan dan dus een init doen, waarna elke slave zich moet melden.
De master kan dan dus gaan kijken "wie" er allemaal aanwezig zijn, en alleen de aanwezigen aanspreken.
Slave 1 heeft 1 seconde (ik noem maar wat) om te reageren, slave 2 heeft er 2, slave 3 heeft er 4 , slave 4 heeft er dan 8.
Ik zou dan dus na iedere slave de volgende iets meer tijd geven, maar als je dan 16 slaves zou hebben die telkens de dubbele tijd krijgen, duurt de initialisatie wel een beetje lang (meer dan 4 minuten denk ik).

Wanneer je een slave aanspreekt, dan roep je dus diens adres, gevolgd door een commando, en dat weer gevolgd door een eventuele waarde die bij dat commando zou horen.
De slave kan dan bijvoorbeeld antwoorden door diens adres te roepen (alsof ie een bericht aan zichzelf zendt), en dan nog iets om te laten weten dat het commando werd ontvangen (een Hayes modem roept dan alleen maar "OK"), of met het antwoord op de vraag bijvoorbeeld.

Jij bepaalt hoeveel adressen er gereserveerd worden (nul tot FF bijvoorbeeld, of nul tot F, vul maar in).
Net zoals hoeveel commando's er zijn, en hoeveel de waardes kunnen hebben.

Je moet even kijken hoe je de verbinding wil opbouwen.
Als de Arduino´s vlak bij elkaar staan. dan kun je de SPI of I2C bus gebruiken.
Als ze ver uit elkaar staan dan is dat niet te doen, en kun je beter kiezen voor RS485 maar daar heb je dus wel extra hardware voor nodig.
RS485 kan een afstand tot 1200 meter overbruggen, als alles goed werkt en de datasnelheid niet al te hoog is.

Om te voorkomen dat er foute data overgedragen worden, is het gebruikelijk dat er nog een checksum word toegevoegd aan elke transmissie.

Toch nog een heleboel informatie, zonder dat ik weet waar je naar op zoek bent en of dit wel is wat je zocht.
Laat even weten of je er wat aan hebt, en laat anders wat meer weten over wat je precies wilt.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Superheide

Hallo Mas3,

Bedankt voor je reactie.

Op dit moment werkt elke slave op zich zelf
Op elke slave zijn 8 oled displays aangesloten via de SPI.
ook zijn er 8 schakelaars aangesloten die elk 1 display besturen.
Het enige dat gebeurd is dat als de input is high, er een kader om de tekst geschreven wordt en visa versa.

in elke slave is de instelling voor de tekst als volgt.


  HCuOLED1.Cursor(10,4);
  HCuOLED1.SetFont(MedProp_11pt); 
  HCuOLED1.Print("Tekst A");

  HCuOLED1.Cursor(35,25);
  HCuOLED1.SetFont(MedProp_11pt);
  HCuOLED1.Print("Tekst B");

  HCuOLED1.Cursor(10,45);
  HCuOLED1.SetFont(MedProp_11pt);
  HCuOLED1.Print("  Tekst C");

De communicatie tussen de master en de slave gebeurd via I2C

Nu is het idee om alle teksten in de master in te geven waardoor het programmeren in  1 master gebeurd i.p.v. in alle 8 slaves.


De bedoeling is, dat op de master 15 schakelaars komen. bij het activeren van 1 schakelaar moeten de teksten van alle displays veranderen.

ik hoop dat het nu iets duidelijker is geworden.

MAS3

Dat maakt het een beetje duidelijker, maar nog niet alles is nu bekend.

Dat je met I2C werkt als verbinding, wil al zeggen dat je met adressen werkt, want dat hoort bij I2C.
Aangezien de slaves straks niet veel meer zullen zijn (volgens de informatie waar ik nu over kan beschikken)  dan een display op afstand, hoef je niet veel meer te doen dan de betreffende data te verzenden,
Die data bestaat dan dus uit de af te beelden content, of uit stuursignalen.
Als je bijvoorbeeld een gewone 1602 display hebt, dan is er een pinnetje dat aangeeft dat er besuringsdata volgt, of dat er af te beelden informatie volgt.
Dat kun je dus ook doen bij jouw protocol.
Stuur na het adres, een bitje dat aangeeft besturing of data.
Besturing is bijvoorbeeld waar je zet dat je "MedProp_11pt" als font wil zetten.
En data is dan dus "Tekst A".

Het kan ook anders, het is maar net wat je wil.
Bijvoorbeeld iets dat lijkt op NMEA, waar 1 verzonden regel (sentence) bestaat uit meerdere velden die door komma's gescheiden zijn.
Dan krijg je dus bijvoorbeeld eerst het adres, dan een commando veld, dan een waarde die bij het vorige commando behoorde-veld, dan een veld met af te beelden data en afgesloten met een checksum.
Bij NMEA kunnen velden leeg zijn wat dan dus leidt tot een aantal komma's na elkaar.
Je kan geen velden overslaan dus het aantal komma's moet altijd kloppen.
Het is vrij eenvoudig om data die op die wijze verzonden word, te verwerken.

Wellicht heb je helemaal geen behoefte om een ander font te gebruiken of andere stuursignalen te verwerken.
In dat geval hoef je dat ook niet te verzenden.

Nu riep jij in je post hierboven, dat er alleen maar een kader rond een reeds aanwezige tekst moet komen.
Wanneer dat alles is, dan kan de communicatie beperkt worden.
Want dan hoef je alleen maar het adres en een 1 of een nul te sturen, waarmee dan bepaald kan worden of er een kader getekend moet worden, of dat dat kader gewist moet worden.
Wanneer alle displays op alle slaves op het zelfde moment wel of geen kader moeten hebben, dan kun je het adres ook weglaten.
Dan hoef je dus alleen maar "aan" of "uit" te roepen.

Zoals je wellicht aan dit antwoord ziet, ben ik er nog steeds niet uit wat de bedoeling is.
Want je vorige in je post zie ik een aantal tegenstrijdigheden staan.
Zoals "alleen maar een kader" en even verderop "de master moet de af te beelden tekst verzorgen"

Wanneer je er nog niet uit bent wat het precies moet worden (ook verderop in de toekomst), dan is het dus slim om voor een uitgebreidere variant te gaan zodat je later kunt uitbreiden.
En dan raad ik je ook aan om eens op papier te zetten wat er nou allemaal gecommuniceerd moet worden en hoe dat er dan uit moet zien.
Zorg ervoor dat je vooral niet teveel communiceert want het is zonde om allerlei overbodige zaken te versturen.
Je slaves bezitten zelf namelijk ook enige intelligentie dus die hoef je niet meer te sturen dan het strikt noodzakelijke.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Superheide

Hallo Mas3,

bedankt voor je reactie,
ik heb er een foto van maar kan deze helaas niet meesturen of er moet een andere manier zijn?

Superheide

MAS3

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Go Up