I2C-Temperatursensor und ein Arduino-WLAN-Schild arbeiten nicht zusammen

Ich verwende ein Arduino-WLAN-Schild und einen TMP102 mit einem Arduino Uno Rev2.

Bei Boards älter als rev3 müssen Sie einen Jumper von 3,3 V zum IOREF-Pin für das WLAN-Shield hinzufügen, siehe hier: http://arduino.cc/en/Guide/ArduinoWiFiShield

Aber wenn ich das tue, würde der Temperatursensor nur -0,06 Celsius anzeigen, als ob seine Adresse anders wäre. (Es verwendet i2c, sein ADD0 ist geerdet, genau wie hier: http://bildr.org/2011/01/tmp102-arduino/ )

Ohne den Jumper funktioniert der Sensor einwandfrei, aber das WLAN benötigt den Jumper zum Starten.

Was muss ich tun, damit sie zusammenarbeiten?

Antworten (3)

Springen Sie unten zu TLDR, um eine kürzere Antwort zu erhalten:

Die 3,3-V-Leitung des Arduino Uno Rev2 wird vom FT232R-USB zum internen 3v3-Regler des seriellen Chips gespeist. Der maximale Verbrauch liegt unter 50 mA. Eigentlich ziemlich erbärmlich, weshalb im Rev3 auf einen dedizierten Regler umgestellt wurde.

Das WLAN-Board verbindet sich nicht mit dem 3v3-Pin. Normalerweise wird es mit 5 V betrieben, hat einen eigenen 3v3-Regler und verwendet einen TI TXB0108 Level Translation-Chip. Es nimmt zwei willkürliche Spannungen (mit einem bestimmten Bereich) und ermöglicht die Pegelumsetzung, um zwischen den beiden zu kommunizieren. Der Hauptchip auf dem Wifi-Board ist ein 3v3-Gerät. So sind SD-Karten.

Hier ist also das Problem. Schlampige, idiotische, inkonsistente Notation von Arduino.

Der Arduino Rev3 fügt den im offiziellen Schaltplan aufgeführten IORef-Pin nicht hinzu. Wie online angemerkt, sagten sie beim Hinzufügen des IORef, dass es für eine zukünftige Erweiterung ist. Bei 5-V-Boards, wie den Standard-Arduino UNO- oder AVR-basierten Boards, ist ioref an 5 V gebunden. Für die neueren 32-Bit-Due läuft bei 3,3 V. Sein IORef ist an 3,3 V gebunden.

Revision 3 des Boards hat die folgenden neuen Funktionen: 1.0 Pinbelegung: SDA- und SCL-Pins hinzugefügt, die sich in der Nähe des AREF-Pins befinden, und zwei weitere neue Pins in der Nähe des RESET-Pins, des IOREF, die es den Abschirmungen ermöglichen, sich an die bereitgestellte Spannung anzupassen vom Vorstand. In Zukunft werden Shields sowohl mit dem Board kompatibel sein, das den AVR verwendet, der mit 5 V arbeitet, als auch mit dem Arduino Due, der mit 3,3 V arbeitet.

Das Schema des Wifi-Boards zeigt, dass der IORef-Pin an den Pin 19, VccB des TXB0108 geht (Die Seite, die mit dem Arduino kommuniziert. VccA ist für den WLAN-Chip). Es zeigt auch ... dass der Jumper an 5 V gebunden ist.

Geben Sie hier die Bildbeschreibung ein

Nun, warum sollten sie Ihnen sagen, dass Sie ioref auf 3,3 V springen oder den Jumper verwenden sollen, wenn die UNO rev2 und rev1 5-V-IO-Geräte sind? Oder wenn der Jumper ioref an 5 V bindet und sie wissen, dass dies Probleme verursachen wird? Geh Abb. Eigentlich sollte es keinen Grund geben. Alles auf dieser Platine soll mit 5 V betrieben und extern kommuniziert werden. Wenn Sie also keine modifizierte 3,3-V-Platine oder Due oder so etwas haben, sollten Sie dies nicht tun. Ein REV2-Board mit ioref, das an 3,3 V gebunden ist, versorgt die Hälfte des TXB0108 und eine Kappe zusammen mit Ihrem TMP102 und seinen Pull-up-Widerständen

Aber es gibt noch ein Problem. Der Arduino, der TXB0108 und der TMP102 sollten selbst bei voller Stromaufnahme immer noch weniger als 50 mA vom FTD232R entfernt sein. Der TXB0108 und der TMP102 liegen beide unter 1 mA, wenn sie voll aktiv sind. Irgendetwas lässt die 3v3-Linie sinken. Es könnte sein, dass der Schaltplan der Wifi-Platine auch nicht korrekt ist, die ioref könnte auch an etwas anderes gebunden sein. Vielleicht ein schlechtes Brett. Oder Sie haben einen Kurzschluss, der dazu führt, dass es ausfällt. Vielleicht hat der Kondensator auf der Rev2-Platine in der Nähe des Power-Headers, wo ioref wäre, einen Kurzschluss gegen den ioref-Pin der WLAN-Platine. Da Sie 3,3 V überbrückt haben, wird die 3,3-V-Leitung im Wesentlichen kurzgeschlossen oder verschmutzt.

Geben Sie hier die Bildbeschreibung ein


TLDR; Überprüfen Sie zuerst die 3v3-Linie, wenn Sie gesprungen sind. Es sollte nicht weniger als 3,3 V betragen, während alles eingeschaltet ist. Stellen Sie sicher, dass Sie keine Shorts und nichts anderes (außer dem WLAN-Board und dem tmp102-Board) angeschlossen haben. (Alles andere würde einen Logikanalysator oder ein Oszilloskop erfordern, um zu sehen, ob die i2c-Datenleitungen beschädigt sind.) Stellen Sie außerdem sicher, dass der ioref-Pin nicht auf dem darunter liegenden Kondensator sortiert wird.

Dann, aufgrund der obigen Informationen, wenn (und an diesem Punkt ist das ein großes IF, ich vertraue der Arduino-Dokumentation nicht) die Ioref gemäß dem Schaltplan auf der Platine ist, schließen Sie sie einfach an 5 V an, entweder über den Jumper unten , oder mit einem Draht vom 5v zum ioref-Header. Angesichts des Level-Translation-Chips soll das so funktionieren, und es sollte funktionieren.

@Passersby: Dies ist eine großartige, sehr gut recherchierte Antwort, aber das Bit "Einfach an 5 V anschließen" macht mir Sorgen ... Nicht "wenn alles andere fehlschlägt, können Sie es an 5 V anschließen, wenn die Schaltpläne korrekt sind und es keine gab Grund, es überhaupt mit 3v3v zu verbinden"? Ich denke, ich hätte mehr "AUF EIGENE GEFAHR" Anmeldungen für die OP ...
@angelatlarge Ich sage das, weil der ioref-Pin so funktionieren soll, und so funktioniert er für die Uno rev3, bei der ioref an 5 V gebunden ist.

Es ist möglich, dass der WiFi-Schild zu viel Strom aus dem 3,3-V-Regler zieht. Sobald Sie den IOREF-Pin überspringen, schaltet sich die WiFi-Abschirmung ein, die Spannung auf der 3,3-V-Schiene fällt ab und der Temperatursensor geht in einen Brown-Out- oder Power-Down-Zustand. Versuchen Sie, die Spannung auf der 3,3-V-Schiene mit übersprungenem IOREF-Pin zu messen. Wenn es weit unter 3,3 V liegt, könnte dies Ihr Problem sein. Eine andere Möglichkeit besteht darin, den Temperatursensor mit einer separaten Stromquelle zu versorgen und zu sehen, ob das Problem dadurch gelöst wird

Das habe ich mir gedacht, aber laut ihren Dokumenten werden die 3,3 V als Referenzspannung verwendet. Dies würde bedeuten, dass die Eingangsimpedanz der WiFi-Abschirmung auf dieser 3,3-V-Leitung hoch sein sollte und keinen Spannungsabfall verursacht, oder?
@angelatlarge Es gibt Probleme mit der Dokumentation der Arduino-Schaltpläne. Und wahrscheinlich ein Kurzschluss. Schau dir meine Antwort an.

Ich hatte das gleiche Problem mit dem WLAN-Schild und einem ML8511-UV-Sensor (inkonsistente Messwerte) und ich bemerkte, dass dort, wo 3,3 VI sein sollten, 4,85 V ankamen, nachdem der IoRef mit dem 3,3-V-Pin übersprungen wurde.

Nachdem ich diesen Beitrag gelesen hatte, wurde mir klar, dass die Lösung darin bestand, die 5 V mit dem IoREF zu überbrücken und nicht die 3,3 V.

Ich habe es getan und jetzt funktioniert das System einwandfrei, die Messwerte, die ich erhalte, entsprechen denen, die andere Geräte messen, und das Problem ist gelöst.

Ich vermute also, dass die Arduino-Dokumentation falsch war, als sie sagte, Draht 3.3 zu IoREF zu springen.