ESP8266 mit dem ADXL345 Beschleunigungssensor verbinden

Für ein Projekt habe ich versucht einen ADXL345 3-Achsen Beschleunigungssensor mit einem ESP8266 Mikrocontroller zu koppeln. Das ist ziemlich „straight forward“. Es gibt aber ein paar kleinere Stoplersteine und da ich keine konkreten Erfahrungen, Code oder Beschaltung im Netz finden konnte, poste ich hier meinen Ansatz.

Der ADXL345 hat eine I2C Schnittstelle und es gibt viele Beispiele für die Kopplung mit einem Arduino. Der Anspruch hier ist, den ESP8266-01 zu verwenden, der nur zwei GPIOs hat. Da der ADXL wie der ESP mit 3.3V läuft, hat man schon mal keine Probleme mit Spannungspegeln. Der Schaltplan ist dann eigentlich trivial. Der SCA Anschluss des ADXL I2C-Busses geht an GPIO0, SCL an GPIO2. Die Pullups im ESP scheinen zu langen; es sind keine weiteren Widerstände nötg. Der CS (Chip Select) Anschluss geht dauerhaft auf 3.3V. Die Schaltung funktioniert problemlos, weil der I2C Bus des ADXL hochohmig ist und den ESP beim Start nicht ungewollt in den Programmiermodus bringt (siehe hier). Die gesamte Schaltung ist somit:
esp8266_adxl345_schema
Ich habe das ganze zum Testen als fliegende Schaltung mit einem adaptierten Programmierboard aufgebaut. Auf diesem adaptierten Programmierboard sind die GPIOs des ESP herausgeführt. Dem ADXL macht es nicht aus, wenn man GPIO2 des ESP und damit den SCL-Pin des ADXL kurzzeitig auf Masse zieht, um in den Programmiermodus des ESP zu kommen.

Fallstricke im Code:
Die gute Nachricht vorneweg. Die notwendige Wire-Bibliothek ist in der ESP/Arduino IDE in der aktuellen Version enthalten. Damit ist das größte Problem schon für uns gelöst worden.
Wenn man Beispielcodes für den ADXL mit dem Arduino ansieht, so nutzen diese häufig den CS Pin um den ADXL ein- und auszuschalten. Diese Möglichkeit haben wir mit dem ESP8266-01 nicht (mit dem ESP8266-12 wäre es möglich). Somit habe ich einen Beispielcode um die CS Schalterei bereinigt.
Die zweite potentielle Falle liegt in der Initialisierung des I2C Busses. In den meisten Codebeispielen werden die I2C Pins nicht explizit festgelegt; beim Arduino werden standardmäßig D4&5 benutzt. Wir wollen GPIO0 & 2 und deshalb muss der Konstruktor angepasst werden.
Die dritte Falle liegt im Auslesen / Konvertieren des Messdaten. Dazu werden in den Arduino Codebeispielen Bitshift Operationen auf dem int-Datentyp ausgeführt. Der Datentyp int ist auf dem Arduino 16-Bit breit und auf dem ESP 32-Bit breit. Deshalb muss man int an den relevanten Stellen durch short ersetzten. Der Datentyp short ist auf Arduino und ESP 16-Bit breit und man hat einen Code, der auf beiden Plattformen läuft.

Damit bekommt man folgenden Code, der sich ganz stark an einem Beispiel von sparkfun.com anlehnt:
esp_adxl345

Wenn man das so auf den ESP flasht, bekommt man folgende Ausgabe auf dem seriellen Port:
Init - S. Thesen ESP8266 & ADXL345 Demo
x: -0.05 y: -0.93 z: 0.24 Total: 0.96
x: -0.04 y: -0.93 z: 0.24 Total: 0.96
x: -0.05 y: -0.93 z: 0.25 Total: 0.96
x: -0.04 y: -0.93 z: 0.24 Total: 0.96
x: -0.05 y: -0.92 z: 0.25 Total: 0.96
x: -0.04 y: -0.92 z: 0.24 Total: 0.95
x: -0.04 y: -0.93 z: 0.24 Total: 0.96
x: -0.05 y: -0.93 z: 0.24 Total: 0.96
x: -0.04 y: -0.93 z: 0.24 Total: 0.96
x: -0.04 y: -0.93 z: 0.24 Total: 0.96
x: -0.04 y: -0.92 z: 0.25 Total: 0.96
x: -0.04 y: -0.93 z: 0.24 Total: 0.96
x: -0.04 y: -0.93 z: 0.24 Total: 0.96
x: -0.05 y: -0.93 z: 0.24 Total: 0.96
x: -0.04 y: -0.93 z: 0.25 Total: 0.96
x: -0.05 y: -0.93 z: 0.24 Total: 0.96

–> Funktioniert.
Wir haben jetzt die Basis für einen Beschleunigungs- und Lagesensor im WiFi. Gesamtkosten ca. 5€.

3 Gedanken zu „ESP8266 mit dem ADXL345 Beschleunigungssensor verbinden

  1. popy

    Schöner Beitrag, dank.
    Habe vor mit dem ESP und dem ADXL345 einen Schlafsensor am Lattenrost zu realisieren.
    Wie oft/schnell in der Sekunde kann der Sensor über I2C mit dem ESP ausgewertet werden?

    Antworten
    1. ST Artikelautor

      Man kann die Datenrate des ADXL einstellen; dazu steht was im Datenblatt. Im langsamsten Mode sind das immer noch 12.5Hz. Das dürfte für alle Usecases eines Bettes reichen.

      Gruss Stefan

      Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.