Der i2c Bus ist ja eigentlich für kurze Strecken auf der Platine gedacht – wie kann man die Strecke ausweiten? – zb. um die Temperatursensoren verlässlich anzubinden?
Es gilt 2 Hauptprobleme zu bekämpfen:
- EM – Störungen durch elektromagnetische Signale
- wenn das Relais direkt daneben ein 220V Stromkreis trennt, dann kann es zu Spikes kommen, die das eine oder andere Bit umdrehen. Das führt zu üblen Bugs, die schwer nachzuvollziehen sind.
- Kapazität der Kabels
- 2 Leiter getrennt durch ein Isolator ergibt… ein Kondensator. Deshalb wird aus dem Rechtecksignal ein „Haifisch“ sobald die Kapazität zunimmt (der Kondensator „lädt auf“)
- „Erlaubt“ wären 400 pF bei 100/400Mhz
Nach einem Wochenende ausgiebigen Tests und viel Gecrimpe/Löterei habe ich eine Lösung für mich:
- zu Problem 1: CAT 5/6 Kabel verwenden – und zwar geschirmt!
- Cat 5e hat etwa 52 pF pro Meter bei 800Mhz. Ich verwende nur 100-400 Mhz und dazu noch unbalanced. Cat5 wird also bis ca. 6m sicher noch hinkommen, wenn alles sauber gemacht wird.
- Keinesfalls Data und Clock verdrillen!
- in jedes twisted pair eine Masse reinnehmen!
- die Schirmung nur auf einer Seite (Arduinoseitig) auf Masse legen
- zu Problem 2: Pullups
- Je stärker der Pullup, desto steiler die Flanke (siehe Skizze unten)
- Gleichzeitig je stärker der Pullup, desto höher die Spannung die das i2c Gerät runterziehen muss
- Am besten mit dem Ozilloskop austesten… irgendwo zwischen 1k und 10k haut es hin
- falls eine weitere Strecke überbrückt werden muss: Clock runterbremsen
Als Verbinder verwende ich normale RJ45 Stecker, damit sich die Sensoren scnnell tauschen lassen. Diese Belegung hat sich als robust erwiesen:
- Orange = Power
- Blau = Masse
- Grün = Data
- Braun = Clock
- alle anderen Kabel auch auf Masse
Schreibe einen Kommentar