HTCC-AB02A problem with reading UBLOX NEO 6M GPS values on battery

Hello dear Community!

I’ve implemented a node that is reading the GPS data from the UBLOX NEO-6M module and sends this as a LoRa package. This works well when I’m powering the HTCC-ABA02A (1/2 AA Node) trough USB, but when I try to use this setup with the battery the module is not powering.

Here is my setup:
GPS -> HTCC-ABA02A
GND -> GND
VIN -> Vext
RX -> TX2
TX -> RX2

Of course I do set the Vext pin to LOW to ensure this pin is able to power external devices.
Is there something I’m missing to run this setup on the battery (1/2 AA in the battery slot)?

Cheers, bockwurstpaule

Okay, I did some troubleshooting and didn’t found the solution yet, but:

  • I can confirm the Vext pin is LOW all the time when on battery
  • The UART_RX2 pin of the board is HIGH when running on battery

Basically after I plug in the usb cable I become the valid output…
Here is my code:

#include "LoRaWan_APP.h"
#include "Arduino.h"
#include <TinyGPS++.h>

static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;


#define RF_FREQUENCY                                868E6 // Hz

#define TX_OUTPUT_POWER                             20        // dBm

#define LORA_BANDWIDTH                              1         // [0: 125 kHz,
//  1: 250 kHz,
//  2: 500 kHz,
//  3: Reserved]
#define LORA_SPREADING_FACTOR                       11         // [SF7..SF12]
#define LORA_CODINGRATE                             1         // [1: 4/5,
//  2: 4/6,
//  3: 4/7,
//  4: 4/8]
#define LORA_PREAMBLE_LENGTH                        8         // Same for Tx and Rx
#define LORA_SYMBOL_TIMEOUT                         0         // Symbols
#define LORA_FIX_LENGTH_PAYLOAD_ON                  false
#define LORA_IQ_INVERSION_ON                        false


#define RX_TIMEOUT_VALUE                            1000
#define BUFFER_SIZE                                 50 // Define the payload size here

char txpacket[BUFFER_SIZE];
char rxpacket[BUFFER_SIZE];
int counter = 0;

static RadioEvents_t RadioEvents;

int16_t rssi, rxSize;
void  DoubleToString( char *str, double double_num, unsigned int len);

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (Serial1.available())
      gps.encode(Serial1.read());
  } while (millis() - start < ms);
}

void setup() {
  boardInitMcu();
  pinMode(Vext, OUTPUT);
//  pinMode(UART_TX2, OUTPUT);
//  pinMode(UART_RX2, OUTPUT);
  digitalWrite(Vext, LOW);
//  pinMode(UART_RX,OUTPUT);
//  digitalWrite(UART_RX,1);
//  digitalWrite(UART_TX2, LOW);
//  digitalWrite(UART_RX2, LOW);
  delay(500);

  Serial.begin(115200);

  Serial1.begin(GPSBaud);

  rssi = 0;

  Radio.Init( &RadioEvents );
  Radio.SetChannel( RF_FREQUENCY );
  Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
                     LORA_SPREADING_FACTOR, LORA_CODINGRATE,
                     LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
                     true, 0, 0, LORA_IQ_INVERSION_ON, 3000 );
}



void loop()
{

  sendShortMsg();
  Serial.println(digitalRead(UART_RX2));
  delay(1000);
  while (Serial1.available() > 0) {
    if (gps.encode(Serial1.read())) {
      sendMsg();
      return;
    }
  }
}

void sendMsg() {
  if (gps.location.isValid()) {
    sprintf(txpacket, "");
    Serial.println("\r\nsending packet");
    sprintf(txpacket, "lat: %d.%d lng: %d.%d", (int)gps.location.lat(), abs(fracPart(gps.location.lat(), 6)), (int)gps.location.lng(), abs(fracPart(gps.location.lng(), 5)));
    //sprintf(txpacket,"lng: %d.%d",(int)gps.location.lng(),abs(fracPart(gps.location.lng(),6)));
    Radio.Send( (uint8_t *)txpacket, strlen(txpacket) ); //send the package out
  }
}

void sendShortMsg() {
  sprintf(txpacket, "");
  Serial.println("\r\nsending day: "+ String(gps.date.day()) + " year " + String(gps.date.year()));
  sprintf(txpacket, "ssa: %d/%d/%d/%d/%d", digitalRead(Vext),gps.date.day(), gps.date.month(), gps.date.year(), digitalRead(UART_RX2));
  //sprintf(txpacket,"lng: %d.%d",(int)gps.location.lng(),abs(fracPart(gps.location.lng(),6)));
  Radio.Send( (uint8_t *)txpacket, strlen(txpacket) ); //send the package out
}

/**
    @brief  Double To String
    @param  str: Array or pointer for storing strings
    @param  double_num: Number to be converted
    @param  len: Fractional length to keep
    @retval None
*/
void  DoubleToString( char *str, double double_num, unsigned int len) {
  double fractpart, intpart;
  fractpart = modf(double_num, &intpart);
  fractpart = fractpart * (pow(10, len));
  sprintf(str + strlen(str), "%d", (int)(intpart)); //Integer part
  sprintf(str + strlen(str), ".%d", (int)(fractpart)); //Decimal part
}
int fracPart(double val, int n)
{
  return (int)((val - (int)(val)) * pow(10, n));
}

Would very much appriciate any help on this one! (Reading GPS value on battery)

Cheers, bockwurstpaule

The power source is wrong fist take a 3.3V Pin!

I’ve tried with VIN, VDD and VEXT. Nothing worked so far…

Ok when possible take a FDDI USB-serial adapter, then connect GPS-Module to the Serial-Adapter. Take a programm like putty to read the incomming message!

USB-TTL Serial Modul FT232RL FTDI 3,3V und 5V ISP USB Arduino Pro Mini Adapter : Amazon.de: Computer & Zubehör

Okay, but when I connect the GPS Module to the Serial-Adapter (have to order though) then the module is going to be USB-Powered from the PC and is going probably to work fine like for now using the USB powering. The output is correct. What I do now is to send the Serial reading from the GPS module through LoRa to another device.
After my work I’ll check all the GPSBaud serial readings (UART_RX2 is high on battery)

Can you use the GPS-Module with 3.3 V (datasheet)?

The ftdi-module can work with 3.3V and 5V (jumper)!

Yes, it should work with 3.3V, here the datasheet.
I have a busy time right now and don’t have the time to try the FTDI module.
I’m just wondering why it does not work out of the box.