GY-OpenLog

GY-OpenLog Modul

Unter der Bezeichnung "GY-Openlog Cleanflight Naze32 F3 Blackbox Recorder-Modul" wird eine kleine Platine verkauft, die man als Datenlogger verwenden kann, z.B. im Modellbau oder auch in verschienen Projekten mit dem Arduino, ESP32 oder Raspberry Pi.
"OpenLog" ist ein Open-Source-Datenlogger, der über eine einfache, serielle Verbindung arbeitet. Es verwendet einen ATmega328, der mit einer Taktung von 16MHz betrieben wird. Alle aufgezeichneten Daten werden auf einer (nicht enthaltenen) Micro-SD-Karte gespeichert.

Technische Details und Anschlüsse

Verwendeter Microcontroller (onboard): ATmega328P (vorprogrammiert)
Betriebsspannung: 3,3V bis 5V
Datenspeicherung: Micro-SD-Karte (64MB bis 32GB; FAT16/32)
Unterstützte Datenformate: ASCII-Text, CSV, binär
Schnittstelle: UART (seriell)
Baud-Raten: 300bps bis 115200bps (default: 9600bps)
Stromaufnahme: Leerlauf: 2-3mA
Betrieb: 10-20mA
Abmessungen: 23,1mm × 27,6mm
Gewicht: 2,5g
Pinout des GY-Openlog Modul

Primäre Schnittstelle (zum Logger von Daten) ist eine serielle UART-Schnittstelle mit 6 Anschlüssen. Dazu kommt noch eine SPI-Schnittstelle mit 4 Anschlüssen, die verwendet werden können, um den Bootloader des OpenLog neu zuprogrammieren.

Es gibt zwei Status-LEDs auf dem OpenLog: Orange: Zeigt an, ob Daten empfangen werden oder bei der seriellen Kommunikation Fehler auftreten.
Grün: Diese LED blinkt, wenn die SPI-Schnittstelle aktiv ist. Sie blinkt, wenn OpenLog 512 Bytes auf der microSD-Karte aufzeichnet.

Verwendete Bauteile

Konfiguration

OpenLog kann direkt über die SD-Karte konfiguriert werden. Dazu wird auf der Hauptebene der Dateistruktur der SD-Karte eine Datei mit dem Namen config.txt benötigt. Diese kann entweder manuell erstellt werden, oder liegt bereits vor, wenn OpenLog auf die SD-Karte zuvor geschrieben hat. Über diese Datei können die folgenden Einstellungen gemacht werden (es gibt keine nicht sichtbaren oder binären Werte und jeder Wert ist durch ein Komma getrennt):

Bei der Auslieferung werden folgende Werte in die config.txt geschrieben:

9600,26,3,0,1,1,0
baud,escape,esc#,mode,verb,echo,ignoreRX

Dateien

Wie im folgenden Bild zu sehen, schreibt OpenLog -nebst der config.txt- seine Log-Dateien in die Hauptebene der SD-Karte. Dabei entstehen standardmäßig Dateien mit den Namen LOGxxxxx.txt.

Anschluss an PC

Um Daten direkt vom PC zu protokollieren, kann mit einem USB-TTL-Konverter eine Verbindung hergestellt werden.

CP2104 USB-TTL-Konverter
Abb.: Verwendeter USB-TTL-Konverter (CP2104) zur Verbindung mit OpenLog und einem PC.

Anschlüsse

Openlog CP2104-Konverter
BLK GND
VCC 3V3
TXO RXD
RXI TXD
GRN DTR

Sobald der USB-TTL-Konverter per USB-Kabel angeschlossen wird, sollte der PC (Windows) automatisch ein neues serielles Gerät erkennen. Dies kann im Geräte-Manager überprüft werden:

Nun kann man entweder über ein Terminal-Programm (hier: PuTTY) eine Verbindung zum entsprechenden seriellen Port gemacht werden. Alle geschriebenen Zeichen werden dann protokolliert und auf der SD-Karte des OpenLog gespeichert:

Alternativ kann auch über die PowerShell von Windows der serielle Port angesprochen werden:

Anschluss am Arduino

Will man Daten über den Arduino an OpenLog senden, so ist dies einfach über die serielle Schnittstelle des Arduino möglich. Für das folgende Experiment wird ein Arduino Nano dazu verwenden, die Daten von dem Luftdruck-Sensor HX710B und dem Temperatur- und Luftfeuchtigkeitsensor DHT22 an OpenLog zu senden.

Anschlüsse

Wie HX710B und DHT22 mit dem Arduino verbunden werden, kann aus den entsprechenden Artikeln entnommen werden. Die Anschlüsse zwischen Arduino und OpenLog sind wiefolgt:

Openlog Arduino Nano
BLK GND
VCC 3V3
TXO RXD
RXI TXD
GRN DTR

Sketch

#include <Wire.h>
#include "DHT.h"

#define DHTTYPE DHT22

#define PIN_DHT22 7
#define PIN_OUT 2
#define PIN_SCK 3

DHT dht(PIN_DHT22, DHTTYPE);

void setup()
{
  dht.begin();
  pinMode(PIN_OUT, INPUT);
  pinMode(PIN_SCK, OUTPUT);

  Serial.begin(9600);
  Serial.println("Pressure;Humidity;Temperature");
}

void loop()
{
  static float humidity, temperature;

  // wait for the current reading to finish
  while (digitalRead(PIN_OUT)) {}

  // read 24 bits
  long result = 0;
  for (int i = 0; i < 24; i++) {
    digitalWrite(PIN_SCK, HIGH);
    digitalWrite(PIN_SCK, LOW);
    result = result << 1;
    if (digitalRead(PIN_OUT)) {
      result++;
    }
  }
  result = result ^ 0x800000; // get the 2s compliment

  // pulse the clock line 3 times to start the next pressure reading
  for (byte i = 0; i < 3; i++) {
    digitalWrite(PIN_SCK, HIGH);
    digitalWrite(PIN_SCK, LOW);
  }

  humidity = dht.readHumidity();
  temperature = dht.readTemperature();

  Serial.println(String(result) + ";" + String(humidity) + ";" + String(temperature));
  delay(1000);
}

Ergebnis

Pressure;Humidity;Temperature
7762590;59.30;23.20
7763721;59.30;23.20
7764297;59.40;23.20
7765583;59.40;23.20
7763130;59.40;23.20
7760916;59.40;23.20
7762534;68.60;23.30
7762964;68.60;23.30
7765287;99.70;23.90
7764167;99.70;23.90
7765315;99.90;23.90
7766009;99.90;23.90
7765996;99.90;23.80
7766569;99.90;23.80
7766955;99.90;23.70
7766084;99.90;23.70
7765939;99.90;23.60

Links

zurück