TTGO T-Beam - Ein LoRa GPS Mapper

Der TTGO T-Beam ist ein anfängerfreundlicher  Einstieg in die Welt von LoRa GPS Tracker und ideal für erste Reichweitentests mit TTN-Mapper. Die Kompakte Bauweise bringt alle erforderlichen Komponeten auf ein Board, es gibt entsprechende Software zum Download und es stellen sich rasch erste Erfolgserlebnisse ein.

Hardware

Der TTGO T-Beam ist ein Entwicklungsboard mit ESP32, LoRa Modul und integriertem NEO-6GPS Empfänger. Auf der Rückseite ist Platz für einen 18650 Akku, am Board ist auch ein entsprechender IP5306 Akku-Controller.

LoRa Modul

ich verwende folgendes PIN-Mapping:

const lmic_pinmap lmic_pins = {
.nss = 18,                        // 18 LoRa chip select (active low)
.rxtx = LMIC_UNUSED_PIN,
.rst = LMIC_UNUSED_PIN,           // was "14," but this should be the BUILTIN_LED
.dio = {26, 33, LMIC_UNUSED_PIN}, // 26 To LoRa DIO0, 33 LoRa DIO1,
};

GPIO33 muss mit DIO1 verbunden werden, GPIO32 habe ich mit DIO2 verbunden, wird aber in den meisten Sketches nicht verwendet.

NEO-6GPS

Das GPS Modul (NEO-6GPS ?) ist am Board fix verdrahtet:

  • GPIO12 GPS_TX
  • GPIO15 GPS_RX

Der ESP kann auf diesen GPIOs mit Hardwareserial1 zugreifen. Am Fensterbrett bekomme ich relativ rasch einen Fix, die Empfangsstärke ist in Ordnung, jedoch sollte man die lose GPS Antenne besser direkt am Modul verkleben.

Der IP5306 Akku-Controller für den 18650 Akku

Eigentlich könnte der IP5306 4 Status-LEDs ansteuern. Auf meinem Board sind nur zwei LEDs bestückt: Akku-ladet (rot) und Akku ist voll (grün). Weiters wird ein Taster unterstützt - der auf meiner Board-Revision aber nicht vorhanden ist:

  1. The key duration is longer than 50ms, but less than 2s, which is a short press action. Short press will turn on the power indicator and boost output.
  2. The duration of the button is longer than 2 seconds, which means long press action. Long press will turn on or off the lighting LED.
  3. The keystrokes less than 50ms will not have any response.
  4. Pressing the button for two consecutive times in 1s will turn off the boost output, battery display, and lighting LED.

Bisher konnte ich noch keine Überladungen feststellen, dennoch werde ich den LiPo nicht unbeaufsichtigt laden. Ein separater Schiebeschalter trennt den Akku vom Board - das Board ist dann weiterhin noch über USB mit Strom versorgt.

Der T-Beam braucht mit WIFI, GPS und LoRa in 24h etwa 2500mAh, mit meiner 18650 komme ich auf ca 6h Betriebszeit.

Die Spannungsmessung mit GPIO35

Weiters gibt es einen Spannungsteiler mit zwei 100K zwischen dem Batterianschluss der 18650 und GPIO35, welchen man für Spannungsmessungen mit dem ESP32 verwenden kann. Wegen dem 100K/100K Spannungsteiler "muss" man fast den ADC_11db verwenden. Dann bekommt man auch einen Messbereichseingang von 2.9V - was für den 3.7/4.2 LiPo mit einem Spannungsteiler 1/1 reichen muss. Ob 10, 11 oder 12 Bit Auflösung nimmt sich dann nicht mehr viel, mir hat die Auflösung von 10Bit für den gewünschten Messbereich gereicht.

Hier ein kurzer Testsketch zur Spannungsmessung der 18650 Batterie mit GPIO35 am TTGO T-Beam

/*
ADC Measurements on ESP32

Import Information:
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/adc.html
and
https://www.esp32.com/viewtopic.php?f=19&t=2881&start=10#p13739

and as always: the truth is on your harddisk:
C:\Users\YOUR_USER\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\cores\esp32\esp32-hal-adc.h and .c

noiasca
2019-04-30

*/

const byte ADCBOARDVOLTAGE_PIN = 35; // Prefer Use of ADC1 (8 channels, attached to GPIOs 32 - 39) . ADC2 (10 channels, attached to GPIOs 0, 2, 4, 12 - 15 and 25 - 27)
const byte ADC_BITS = 10; // 10 - 12 bits

byte read_voltage()
{
// multisample ADC
const byte NO_OF_SAMPLES = 5;
uint32_t adc_reading = 0;
Serial.print(F("D022 ADC Measurement:"));
analogRead(ADCBOARDVOLTAGE_PIN); // First measurement has the biggest difference on my board, this line just skips the first measurement
for (int i = 0; i < NO_OF_SAMPLES; i++) {
uint16_t thisReading = analogRead(ADCBOARDVOLTAGE_PIN);
adc_reading += thisReading;
Serial.print(F(" ")); Serial.print(thisReading);
}
adc_reading /= NO_OF_SAMPLES;
Serial.print(F(" Avg=")); Serial.println(adc_reading);
// Convert ADC reading to voltage in deciVolt, 1024/2048/4096 not hardcoded but calculated depending on the set ADC_BITS
byte voltage = adc_reading * 39 * 2 / (1 << ADC_BITS); // 3.9V because of 11dB, 100K/100K Voltage Divider, maxResolution (1024/2048/4096) 
return voltage; 
}


void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println(F("ADC Measurements on the ESP32"));

analogReadResolution(ADC_BITS); // Default of 12 is not very linear. Recommended to use 10 or 11 depending on needed resolution.
//analogSetAttenuation(ADC_11db); // Default is 11db which is very noisy. Recommended to use 2.5 or 6. Options ADC_0db (1.1V), ADC_2_5db (1.5V), ADC_6db (2.2V), ADC_11db (3.9V but max VDD=3.3V)
pinMode(ADCBOARDVOLTAGE_PIN, INPUT);
}


void loop() {
// put your main code here, to run repeatedly:
Serial.print(F("Voltage: ")); Serial.println(read_voltage());
delay(2000);

}

Wichtige GPIOs am TTGO T-Beam

Ich habe mir folgende GPIOs am TTGO T-Beam herausgesucht:

  • GPIO05 LoRa CLK
  • GPIO12 GPS_TX
  • GPIO14 Blue LED
  • GPIO15 GPS_RX
  • GPIO18 LoRa NSS
  • GPIO21 I2C SDA
  • GPIO22 I2C SCL
  • GPIO23 LoRa reset (?)
  • GPIO26 LoRa DIO0
  • GPIO27 LoRa MOSI
  • GPIO32 LoRa DIO2
  • GPIO31 LoRa DIO1
  • GPIO35 BAT-100K-GPIO35-100K-GND für 18650 Batteriespannung
  • GPIO33 (and optionally GPIO32) needs to be Wired to DIO1 (and DIO2)
  • GPIO39 Button

Software - Der Anfang

Als Software zum Anfangen empfehle ich den Lora-TTNMapper-T-Beam von DeuxVis welche man von Github laden kann. Nach Anlage des (APB) Devices auf TheThingsNetwork und Eintrag der Keys in der config.h werden - bei erfolgreichem GPS-Fix - alle 30 Sekunden die GPS-Daten an TheThingsNetwork übertragen. Die Übertragung der Daten erfolgt kompakt in 10 Byte. Damit diese im Klartext verwendet werden können, braucht es am TTN noch unter "Payload Format" einen Payload-Decoder in JavaScript. Das Muster dazu findet sich in der readme.md und kann einfach kopiert und auf TTN eingefügt werden.

Wenn man für seine TTN Application die Integration "TTN Mapper" aktivert, kann man anschließend auf ttnmpper.org die Wegpunkte auf einer OpenStreetMap einsehen.

Wenn man kein echtes Gateway in Reichweite hat, sondern nur auf Single-Channel-Gateways zurückgreifen kann, dann muss man etwas Geduld mitbringen. Standard-mäßig sendet der Sketch von DeuxVis (spezifikationsgemäß) auf allen 9 Frequenzen mit SF7. Es kann also etwas dauern, bis man mit einem Single-Channel-Gateway die erste Meldung sieht. Für den 24h Dauerbetrieb eignet sich der Sketch nicht. Die 9 Byte Nutzdaten führen bei SF7 zu einer Airtime von gut 40ms. Hochgerechnet wären das an einem Tag etwa 115 Sekunden Airtime, die Fairuse-Policy von TTN gestattet aber nur 30 Sekunden Airtime. Solange man den Tracker jedoch nur einge Stunden am Tag betreibt, sollte dies kein Problem darstellen. Mann muss halt unter 30 Sekunden bleiben. Vorsicht bei höheren Spreading Faktor - beispielsweie dauert bei SF10 schon über 400ms.

Summary

Der TTGO T-Beam ist ein guter Anfang für das Tracking und für Reichweitentests. Wünschenswert wäre noch die Nutzung des WLAN zur leichteren Konfiguration unterwegs oder ein Display. Einen entsprechenden Sketch bereite ich gerade vor, die Veröffentlichung wird jedoch noch etwas dauern.

Links

Die mit Sternchen (*) gekennzeichneten Verweise sind sogenannte Provision-Links. Wenn du auf so einen Verweislink klickst und über diesen Link einkaufst, bekomme ich von deinem Einkauf eine Provision. Für dich verändert sich der Preis nicht.


Protokoll

erstellt: 2019-05-01 | Stand: 2020-12-07