Bidirektionaler Datenaustausch i2c

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich bin leider ein bisschen unsicher was die Planung bzw. Umsetzung meines Projekts betrifft. Vielleicht könnt ihr mir da helfen:

    Folgendes ist geplant:

    Ein Ardunio Nano soll ein Display betreiben, ein Rotary Encoder und der Umschalter für das TapeDeck werden.(Das ganze soll ein RaspRadio werden).

    Das Raspberry PI soll über MPD den entsprechenden Stream ausgegeben und soll für weitere Verwendungen (Honeypot, ReverseProxy) eingesetzt werden.


    Jetzt stellt sich für mich die Frage, wie ich am besten ein volatiles Struct sowohl von Raspberry als auch vom Ardunio lesen / schreiben kann. Hintergrund: Das/Der Ardunio soll die derzeitige Stellung des RotaryEncoder schreiben, das Raspberry soll dieses entsprechend lesen MPD auf diese "Station" einstellen und den Entsprechenden StreamNamen zurück in Struct schreiben, damit Ardunio diesen über das DIsplay anzeigen kann.


    struct Data
    {
    int currentROTENcoder
    int volume
    string CURRENTSTREAM
    ......
    }

    Eigentlich verwenden alle (bisher gefundenen) Project die master Slave i2c Verbindung. Ist dies der richtige Weg um lesen und schreiben zu können. Oder soll ich doch eher auf RS232 bzw. USB Serial zurückgreifen.


    Könnt Ihr mir weiterhelfen?

    Danke

    dotcommandante


    (und ich hab die Suche vorher verwendet)

  • gehen tut vieles, mir scheint persönlich am einfachsten eine serielle rs232 für beide zu sein, der Atmel kann ja auch mit 3,3V laufen da braucht man nicht mal eine Spannungsumsetzung, bedenke beide PI und Atmel sind erst mal I2C Master und wenigstens einer müsste ja slave spielen, sicher kann man das proggen, aber wozu ? dann doch lieber 2 die sich per rs232 austauschen.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Moin,

    grundsätzliche Frage: wie weit stehen die beiden (Pi <-> Arduino) auseinander?
    Haben beide einen LAN bzw. WLAN-Zugang?


    Zitat


    (und ich hab die Suche vorher verwendet)

    :) sehr schön, danke ...

    Es ist faszinierend, welche Auswirkungen so ein allgemeiner Wink mit dem Gartenzaun hat ...

    ciao,
    -ds-

  • i2c mit Multimaster ist möglich, aber hier nicht nötig. Der AVR kann i2c-Slave spielen und der Pi kann die Daten auslesen.
    Das ist aber eigendlich keine Anwendung für die der Pi noch einen zusätzlichen Prozessor brauchen würde. Display ansteuern und Encoder lesen kann der auch alleine.


  • i2c mit Multimaster ist möglich, aber hier nicht nötig. Der AVR kann i2c-Slave spielen und der Pi kann die Daten auslesen.
    Das ist aber eigendlich keine Anwendung für die der Pi noch einen zusätzlichen Prozessor brauchen würde. Display ansteuern und Encoder lesen kann der auch alleine.

    dreamshader: der Abstand ist ca. 10cm. Wird beides im Gehaäuse verbaut.

    orb: stimme ich dir zu (aber du unterschlägst das schreiben von Rasp zum Ardunio) - aber
    1) Dat ist Spielzeug und das muss gespielt werden
    2) Ich hab noch mehrere sachen anzuschliessen (433Mhz und 2.4Ghz Module) und da wirds dann wirklich eng auf den RaspBerry.
    3) ich will noch mehrere Sachen auf dem Rasp laufen lassen (Reverse proxy, nginx, ssh Server) und Pyhthon ist nicht wirklich für seine Performance bekannt, daher die Resourcen schonen
    4) Ich hab ein ITDB2.2Sp und hab mich mehrere Tage mit einem DisplayTreiber rumgeschlagen, leider ist dieser sehr shehr sehr langsam.

    darf ich ein kurzes WrapUp liefern:

    1) i2c ist mit Multimaster möglich, aber nicht der bevorzugte Weg
    2) RS232 wäre die einfachste Möglichkeit und es wird kein LevelShifter benötigt (hier gibt es leider auch andersweitige Aussagen - Da Ardunio 5V spricht und Raspberry auf den GPIO 3.3 V hört (schlagen hier die 1.8k Pullup Widerstände an?)


    Gibt es zu dem Punkt 2 vielleicht Beispielcode vielleicht sogar in C++?

    Danke für eure Hilfe

    dotcommandante

    Einmal editiert, zuletzt von dotcommandante (18. Juni 2013 um 16:38)


  • 2) RS232 wäre die einfachste Möglichkeit und es wird kein LevelShifter benötigt (hier gibt es leider auch andersweitige Aussagen - Da Ardunio 5V spricht und Raspberry auf den GPIO 3.3 V hört (schlagen hier die 1.8k Pullup Widerstände an?)
    Danke für eure Hilfe
    dotcommandante

    muss denn der Adruino auf 5V laufen ? der AVR kann oft je nach Takt ab 2,7V ! 3,3V ist schon genug wenn der nicht high speed laufen muss

    für die levelshiftung (ist ja nur in eine Richtung nötig z.B. für 5V sendet an 3,3V) braucht man ja nicht viel -> Spannungsteiler.

    für die Richtung 3,3V Ausgang sendet an 5V Eingang reicht eine Diode Anode zum PI und ein pulldown R auf der 5V Seite

    Es gibt auch fertige Module mit FET bidirektional, musst hier mal suchen wurde schon gepostet.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hi,

    in diesem Fall würde ich einfach die seriellen Verbindungen nutzen. RS232 halte ich dagegen schon wieder übertrieben.
    Levelshifter imho ja, aber diese kleinen Teile (3V3 <-> TTL) sind für ca. 1,50 zu kriegen.

    Alternative: SPI - aber da wird es mit dem Levelshifter wohl ähnlich aussehen.

    cu,
    -ds-


  • Hi,
    in diesem Fall würde ich einfach die seriellen Verbindungen nutzen. RS232 halte ich dagegen schon wieder übertrieben.
    Levelshifter imho ja, aber diese kleinen Teile (3V3 <-> TTL) sind für ca. 1,50 zu kriegen.

    cu,
    -ds-

    serielle ist und meint hier bei beiden PI und AVR -> RS232 !
    was du scheinbar meinst ist eine V24 Verbindung, wo der serielle Pegel invertiert und von 3,3V oder 5V auf +-12V deswegen V24 angehoben wird, das ist natürlich bei 10cm nicht nötig ;)

    nochmal die Frage, muss der Arduino mit 5V laufen ?

    http://www.watterott.com/de/Arduino-Pro-Mini-328-3V3-8MHz
    http://www.exp-tech.de/Mainboards/Ard…-3-3V-8MHz.html
    http://www.amazon.de/Arduino-Pro-Mini-328-3-3V/dp/B007YQZUGM?tag=psblog-21 [Anzeige]

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (18. Juni 2013 um 17:12)

  • Nö ... ich meinte keine V24 ... ich denke, ich hatte was anderes im Hinterkopf. Ist aber auch egal ... ja, ja, ... die Hitze ;)

    Ich würde trotzdem mit Levelshiftern arbeiten.
    Spannungsteiler ginge zwar auch, aber ich bezweifle dass man so was für die paar Cent (Arbeit jetzt mal mit gerechnet) optisch so perfekt und mechanisch so kompakt hin bekommt. Zudem weil ich denke, dass die wenigsten in der Lage sind Platinen zu belichten und die Schaltung selbst perfekt zu realisieren.

    Bei einer 3V3 Variante des Arduino könnte der Levelshifter eh entfallen, aber bei einer 5V Variante würde ich ihn schon deshalb einsetzen um für den Arduino weit genug vom undefinierten Zustand (3V) weg zu kommen.

    cu,
    -ds-

  • So, nun kommen wir mal zum zweiten Teil der Frage:


    Igitt ... schon wieder so ein buzzword ;)

    Aus dem "kleinen Handbuch für Entwickler":

    Regel 1: Die rechteckigen Flecken in Deinem Gesicht sind nicht die Symptome einer neuen Krankheit sondern der Abdruck Deiner Tastatur.
    Regel 2: Mach nie, wirklich niemals Annahmen darüber, wie Deine Daten im Speicher abgelegt sind.
    ...

    Na jetzt im Ernst. Regel 2 hat einen durchaus ernsten Hintergrund.
    Selbst wenn Du eine Struktur aus einem C-Programm auf die Platte schreibst und auf demselben PC dieses C-Programm mit einem anderen Compiler übersetzt und die Daten wieder einliest, wird das aller Voraussicht nach nicht klappen.
    Allein schon deswegen, weil ein String nicht als ASCII-Zeichenfolge sondern als Pointer gespeichert wird.
    Dazu kommen diverse Compiler-Optionen wie pack und schließlich, maschinenabhängig, noch die Schote mit der Intel-Konvention.
    Selbst im Speicher Deines eigenen PC wirst Du keine Chance haben Dich durch arithmetische Berechnungen innerhalb einer Struktur zu bewegen.
    Vergiss es also.

    Ich denke, Du wirst nicht umhin kommen, Dir ein eigenes Protokoll zu definieren.
    Etwa so in der Art:

    |Ges.Länge|Länge|Inhalt|Daten|Länge|Inhalt|Daten| ...

    Ich würde alles in reinem ASCII-Code darstellen, also z.B.

    |189|4|VOL|9| ...

    So ähnlich wurden zu meiner Zeit auch die Daten in Industrieanlagen ausgetauscht. In diese Protokoll kannst Du dann reinpacken, was Du willst und es funktioniert immer.

    cu,
    -ds-

  • orb: stimme ich dir zu (aber du unterschlägst das schreiben von Rasp zum Ardunio)


    Du schreibst wie auf jeden anderen i2c-Slave auch.
    Schau Dir mal http://neophob.com/2013/04/i2c-co…-and-a-arduino/ an.

    Zitat

    1) Dat ist Spielzeug und das muss gespielt werden


    Das Argument erkenne ich Vorbehaltlos an.

    Zitat

    2) RS232 wäre die einfachste Möglichkeit und es wird kein LevelShifter benötigt (hier gibt es leider auch andersweitige Aussagen - Da Ardunio 5V spricht und Raspberry auf den GPIO 3.3 V hört (schlagen hier die 1.8k Pullup Widerstände an?)

    Wenn dann eine Kombination aus 1,8k/3,3k als Spannungteiler.
    Die üblichen Levelshifter für i2c (1xFet, 2x10k-Widerstand) sind für Open-Collector Verbindungen, das ist die serielle weder beim Pi noch beim Arduino. Du bekommst also keine sauberen Pegel.


  • Wenn dann eine Kombination aus 1,8k/3,3k als Spannungteiler.
    Die üblichen Levelshifter für i2c (1xFet, 2x10k-Widerstand) sind für Open-Collector Verbindungen, das ist die serielle weder beim Pi noch beim Arduino. Du bekommst also keine sauberen Pegel.

    Ja hey orb ... :)

    echt? Also diese 3V3 <-> Teile?
    Wieder was dazu gelernt ...
    Danke für die Info ...

    cu,
    -ds-


  • Du schreibst wie auf jeden anderen i2c-Slave auch.
    Schau Dir mal http://neophob.com/2013/04/i2c-co…-and-a-arduino/ an.


    Wenn dann eine Kombination aus 1,8k/3,3k als Spannungteiler.
    Die üblichen Levelshifter für i2c (1xFet, 2x10k-Widerstand) sind für Open-Collector Verbindungen, das ist die serielle weder beim Pi noch beim Arduino. Du bekommst also keine sauberen Pegel.

    Danke für den Link.

    Leider habe ich mir bereits vor der Threaderöffnung folgenden Level Shifter geholt:
    4-channel I2C-safe Bi-directional Logic Level Converter - BSS138

    Ich verstehe dich jetzt so das dieser nicht geeignet ist für eine Serielle Verbindung?

    Danke

    Dotcommandante


  • Ich verstehe dich jetzt so das dieser nicht geeignet ist für eine Serielle Verbindung?

    Die Verbindung wird vermutlich funktionieren, zumindest auf kurze Strecken und bei kleinen Geschwindigkeiten.
    Die verfügbaren Datenblätter geben leider keine genaue Auskunft über die Ein-/Ausgangsbeschaltung der Pins wenn sie als serielle Schnittstelle programmiert sind und ich hab grad keinen Pi frei um das mal durch zu messen aber ich würde die nicht für serielle oder SPI-Verbindungen benutzen (aber ich hab auch etwas höhere Ansprüche an meine Schaltungen).

    Einmal editiert, zuletzt von orb (21. Juni 2013 um 08:10)

  • ich verstehe immer noch nicht, warum willst du weiterhin bi-direktionale Levelshifter ?

    soweit ich dich bis jetzt verstanden hatte willst du "nur" mit einem PI und einem AVR Daten tauschen, die Verbindung ist kurz !? oder lang ?

    für kurze Verbindungen reicht doch der rs232 Pegel egal ob 3,3V oder 5V, es gibt Arduino die direkt mit 3,3V laufen 8MHz auf jeden Fall, kein Levelshifter nötig, rs232 sind auf beiden vorhanden, fertig. Auch gibt es keine echten bi-direktionalen Leitungen, eine Leitung sendet, eine andere empfängt, das sind 2 Signalrichtungen und diese können direkt angepasst werden bei Bedarf, schlimmer ist ja nur wenn eine Leitung die Richtung wechselt also Sender und Empfänger spielt das wäre bi-direktional, aber das gibt es bei RS232 nicht, dort gibt es RxD empfängt und TxD sendet, die Richtung ist also vorgegeben und so kann man die Pegel sauber anpassen, von der 5V Seite (Sender) zur 3,3V Seite (Empfänger) genügt der Spannungsteiler wie Orb schon vorgeschlagen hatte, von der 3,3V Seite (Sender) zur 5V Seite (Empfänger) genügt eine Entkopplungsdiode und ein pulldown R, aber wozu ? wenn 8MHz an 3,3V am AVR reichen.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (21. Juni 2013 um 09:03)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!