Pages: 1 2 [3] 4 5 6   Go Down
Author Topic: Problem with transmitting IMU/GPS/Ultrasonic data over Nrf24L01  (Read 5075 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 1
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

so i make a char array for incoming GPS data  stuff the array and refer to it as a byte array?
(byte *)gps_data, [gps_data]that is realy a char array and (byte *) says hey hop in there and pull the value because we are the same size anyhow?
 strlen(gps_data) is something like sizeof() but it's get the string gps_data that is size of gps_data? or is the lack of sleep catching up now? lol


Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 630
Posts: 50009
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
so i make a char array for incoming GPS data  stuff the array and refer to it as a byte array?
Not "refer to it as", but "tell Mirf that it is".

Quote
(byte *)gps_data, [gps_data]that is realy a char array and (byte *) says hey hop in there and pull the value because we are the same size anyhow?
Something like that.

Quote
strlen(gps_data) is something like sizeof() but it's get the string gps_data that is size of gps_data?
It gets the number of characters in the array, up to the terminating NULL. It does not "get the string".
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

great  so step one char array of size to fit a gps.sentance in fill it call it with a (byte *) call, get it's count with strln() "string length?"  transmit refill the array and repeat till all the NEMA is sent.
sound like i missed anything?
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 630
Posts: 50009
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
great  so step one char array of size to fit a gps.sentance in
Yes.

Quote
fill it
Yes.

Quote
call it with a (byte *) call,
No. You don't call an array. You call a function, like Mirf.send().

Quote
get it's count with strln()
Well, strlen() will produce fewer errors...

Quote
sound like i missed anything?
Capital letters, punctuation, sleep, and probably some other stuff.  smiley
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Welp can check "some" sleep of the list smiley. anyhow im feeling a bit dorky more than usual i cant seem to grasp how to stuff gps.sentence into an array or some buffer.
gps.sentence returns a string with \0 terminate as a char * ( char ptr?).
so i keep getting invalid conversions from char* to char errors. so am i to understand i am dealing with output from gps.sentence that is in the form of a char ptr and need to (read) it some how into some string then convert the string into regular char array?. as im typing this i can hear your groan as you ask "does this guy like over complicating things a little?".
because i know your going to go NO you just need to reference some ptr and read the individual chars and put them into your array. or not LOL.
i just know i am gonna love your reply i just know it!

BTW thank you so much for all the help i have been learning so much from your guidance.
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 630
Posts: 50009
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
gps.sentence returns a string with \0 terminate as a char * ( char ptr?).
So:
Code:
char *gps_data = gps.sentence();
Mirf.send((byte *)gps_data, strlen(gps_data));

gps_data IS a string. No need to copy it anywhere else or try to "read it to a string".

Quote
"does this guy like over complicating things a little?".
I wasn't think that at all. I was thinking "a lot".  smiley-cool

Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
gps.sentence returns a string with \0 terminate as a char * ( char ptr?).
So:
Code:
char *gps_data = gps.sentence();
Mirf.send((byte *)gps_data, strlen(gps_data));

gps_data IS a string. No need to copy it anywhere else or try to "read it to a string".

Quote
"does this guy like over complicating things a little?".
I wasn't think that at all. I was thinking "a lot".  smiley-cool
LOL. hard to believe.

anyhow thanks for the help so far. but since i went and mucked around anyhow can you tell my why the output of this is always this
output
Code:
gpsS Array contains: ««««
code
Code:
#include <nmea.h>
NMEA gps(ALL);    // GPS data connection to all sentence types
char* gpsS[76];

void setup() {
  Serial.begin(57600);
  Serial2.begin(57600);
}

void loop() {
  if (Serial2.available() > 0 ) {

    if (gps.decode(Serial2.read())) {
      for (int i = 0; i < 76; i++){
        gpsS[i] = gps.sentence();
        delay(500);
      }
    }
  }
  Serial.print("gpsS Array contains: ");
  Serial.print(gpsS[0]);
  Serial.print(gpsS[1]);
  Serial.print(gpsS[2]);
  Serial.print(gpsS[3]);
  Serial.println();
  // serial monitor spits out....  gpsS Array contains: ««««
}

Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

TX
Code:
void loop() {
  char *gps_data = gps.sentence();
  if (Serial2.available() > 0 ) {
    // read incoming character from GPS and feed it to NMEA type object
    if (gps.decode(Serial2.read())) {
      Mirf.setTADDR((byte *)"base1"); // set name of Reciever
      char *gps_data = gps.sentence();
      Mirf.send((byte *)gps_data);
      while(Mirf.isSending()){
      Serial.println("send GPS DAta");
      Serial.println(gps_data);
      }
      delay(10);
    }

  }
}
Serial.print output on TX side
Code:
$GPGLL,4328.5356,N,07625.7447,W,015842.800,A,D*42
send GPS DAta
$GPGSV,3,2,11,46,38,210,32,06,26,159,,20,25,242,19,13,24,313,*70
send GPS DAta
$GPGSV,3,3,11,32,23,216,,29,17,043,20,03,15,178,*4D
send GPS DAta
$GPGGA,015843.000,4328.5356,N,07625.7447,W,2,5,3.72,124.2,M,-34.2,M,0000,0000*66
send GPS DAta
$GPGLL,4328.5356,N,07625.7447,W,015843.000,A,D*4B
send GPS DAta
$GPGSV,3,2,11,46,38,210,32,06,26,159,,20,25,242,19,13,24,313,*70
send GPS DAta
$GPGSV,3,3,11,32,23,216,,29,17,043,20,03,15,178,*4D
seems to be working fine.

on the RX side however
RX
Code:
void loop(){
   byte inData[Mirf.payload];
    if(Mirf.dataReady()){
    do{
      Mirf.getData(inData);
      byte* gps_data = inData;
     
      Serial.println(*gps_data);
      delay(10);
    }
    while(!Mirf.rxFifoEmpty());
  }
}
Serial output is.
Code:
im assuming that it's coming in fine but my method of extracting chars from data ( is byte at this time)
36
36
36
36
36
im guessing it's this   byte* gps_data = inData; i though sense inData is coming in as bytes that i needed to reference gps_data as pointer to bytes and print it anyhow as a char?
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

if into Mirf like this
Code:
char *gps_data = gps.sentence();
      Mirf.send((byte *)gps_data);

then should not out of Mirf like this
Code:
Mirf.getData(inData);
      char gps_data = *inData;
       Serial.println(gps_data);
it does print the first char a $ to the serial but that's it. or is it some kind of an array in inData like inData[sizeof(payload)] kind of deal and i need to scan the with of inData the size of payload and pull each char?
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

well got the first 6 anyhow

Code:
char inGPS[27];
Code:
byte inData[Mirf.payload];
    if(Mirf.dataReady()){
    do{
      Mirf.getData(inData);
      inGPS[0] =  inData[0];
      inGPS[1] =  inData[1];     
      inGPS[2] =  inData[2];
      inGPS[3] =  inData[3];
      inGPS[4] =  inData[4];
      inGPS[6] =  inData[5];
      inGPS[7] =  inData[6];
      inGPS[8] =  inData[7];
      inGPS[9] =  inData[8];
      inGPS[10] = inData[9];
      inGPS[11] = inData[10];
      inGPS[12] = inData[11];
      inGPS[12] = inData[12];
      inGPS[13] = inData[13];     
      inGPS[14] = inData[14];
      inGPS[15] = inData[15];
      inGPS[16] = inData[16];
      inGPS[17] = inData[17];
      inGPS[18] = inData[18];
      inGPS[19] = inData[19];
      inGPS[10] = inData[20];
      inGPS[21] = inData[21];
      inGPS[22] = inData[22];
      inGPS[23] = inData[23];
      inGPS[24] = inData[24];
      inGPS[25] = inData[25];
      inGPS[26] = inData[26];
      //char gps_data = *inData;
     for (int i = 0; i < 27; i++) {
      Serial.print(inGPS[i]);
spits out $GPVT amd $GPRMC etc and some other junk i cant even copy LOL much lest paste.
so inData is an array of incoming bytes = to playload size?
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

would switching to RF24 lib be better for all the stuff i am trying to do?
http://maniacbug.github.com/RF24/
maniacbug has also documented this quite well it seems.

it's becoming more and more clear to me i need to make some kind of structured data function to pool all my data types in and transmit them and pool them back into some structured function or database.

 i get a lot more RF control with with RF24 so i think ill port over to that now while i wait for your reply.

 so i guess what im asking is with all the IMU GPS Ultrasonic and other sensor data is it best to make some data collection thing on the bot and transmit it and pull it apart on the RX side? this is becoming a lot of data now especially with the GPS stuff that alot of NMEA data lol.

how would YOU oh sage master programer PaulS collect and store all this data for local bot use as well as send for base station use?

im enjoying this challenge tho i cant say a lot but it is rewarding and very helpful in learning programing that is for sure.
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

what am i doing wrong here.

Code:
void loop() {
  char Sr = Serial2.read();
  char GpsStr[100];
    int i;
    for (i = 0; i < sizeof(GpsStr); i = i + 1) {
    GpsStr[i] = Sr;   
    Serial.print(GpsStr[i]);
    }
  Serial.println(); 
}
output is.
Code:
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
...
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

looks like the NMEA data im looking for but vertical and incomplete lol.
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 630
Posts: 50009
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Each time you read a character, you create a new array to store it in. Then, you store the character in all 100 elements in the array. Then, you print each element in the array.

Looks like it is working just fine.
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hmmmm. ok not what i was hoping to do. i would like to do is read in the first 100 chars form serial2 and out that in 1 array and print to to serial so not $$$$$$$ then next line GGGGGG etc i should be $GPRMC*** etc.

can you comment my code and show where elements are being created because i have 1 array named GpsStr[100] already i just want to stuff that one with the first 100 chars print it(for now, hopefully send ti to some struct or union and convert it and send it.)

From what you said it seems like i am making a new array and fulling it with 1 char x 100 printing it and filling it with the next char and printing that x 100 for as long as loop runs.
 i figure if im going to learn arrays and pointers and structs and unions and type casting i need to start at the beginning.

 So making 1 array and stuffing it with serial data i figured would be the simple start lol.
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 131
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
  char GpsStr[100];                                        // Start an array of 100 empty char sized elements

void loop() {                                                  // Start of loop

    char Sr = Serial2.read();                           //Initialize Sr and give it a value = to Serial2.read int i; create  i and make it size of int
    for (i = 0; i < sizeof(GpsStr); i = i + 1) {    // Start a conditional loop count up from 0 to size of GpsStr wich is 100 and preform an action contained in {}.
    GpsStr[i] = Sr;                                         // Take the contence of Sr 'Serial2.Read()' and stuff it in GpsStr at 'i' pos 'i' is equal to the current number the loop has counted form 0 to 100 
    }                                                             // Ok made it form 0 -100 and stuffed Sr into each continue with main loop
   
    int x;                                                     // Init x
    for (x = 0; x < 99; x = x + 1) {                 // Count x from 0 - 100
    Serial.print(GpsStr[x]);                         // Print to serial GpsStr at X pos
    }                                                           // Stop printing
    Serial.println();                                    // Make a new line
   }                                                           // Go back to start of loop
Output i get this.
Code:
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
***************************************************************************************************
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

What i should get is.
Code:
$GPRMC,140053.00,A,4454.1740,N,09325.0143,W,000.0,128.7,300508,001.1,E,A*2E
$GPGGA,140053.00,4454.1740,N,09325.0143,W,1,09,01.1,00289.8,M,-030.7,M,,*5E
$GPGSA,A,3,21,15,18,24,26,29,06,22,,03,,,02.0,01.1,01.7*04
$GPGSV,3,1,12,21,75,306,40,15,59,075,46,18,57,269,49,24,56,115,46*79
$GPGSV,3,2,12,26,48,059,43,29,27,188,48,06,25,308,41,22,18,257,33*7D
$GPGSV,3,3,12,08,14,060,,03,11,320,32,09,06,144,,16,04,311,*7C
$GPRMC,140054.00,A,4454.1740,N,09325.0143,W,000.0,128.7,300508,001.1,E,A*29
$GPGGA,140054.00,4454.1740,N,09325.0143,W,1,09,01.1,00289.8,M,-030.7,M,,*59
$GPGSA,A,3,21,15,18,24,26,29,06,22,,03,,,02.0,01.1,01.7*04
$GPGSV,3,1,12,21,75,306,40,15,59,075,46,18,57,269,49,24,56,115,46*79
$GPGSV,3,2,12,26,48,059,43,29,27,188,48,06,25,308,41,22,18,257,33*7D
$GPGSV,3,3,12,08,14,060,,03,11,320,32,09,06,144,,16,04,311,*7C
So what when wrong?
Logged

Pages: 1 2 [3] 4 5 6   Go Up
Jump to: