Vraag over een Leonardo bord [OPGELOST]

Hallo iedereen

Ik zit weeral met een vraag namelijk :
Ik ben bezig met een gps logger en ik gebruik een sketch van adafruit wat ik heb gevonden op internet
maar ik gebruik niet hun shield maar ik heb zelf iets gemaakt met een gps module (mtk3329) en een sd kaart breakout board .
en natuurlijk werkte het niet :~
na enige tijd zoeken ben ik er achter gekomen dat het wel werkt als ik een arduino uno gebruik en niet met de arduino leonardo
ik gebruik dezelfde IDE namelijk 1.0.4 en dezelfde hardware
Waaraan zou dit kunnen liggen ?
Ik heb al zitten zoeken op de produckt pagina van arduino maar ik heb niets kunnen vinden hierover.

Groeten Gert

Ik zou zeggen begin i's met de source van de sketch hier te laten zien. Dan kunnen we verder. Nu hebben we geen idee.

Tuurlijk oeps 8)

// Ladyada's logger modified by Bill Greiman to use the SdFat library

// this is a generic logger that does checksum testing so the data written should be always good
// Assumes a sirf III chipset logger attached to pin 2 and 3

#include <SD.h>
#include <avr/sleep.h>
#include "GPSconfig.h"

// If using Arduino IDE prior to 1.0,
// make sure to install newsoftserial from Mikal Hart
// http://arduiniana.org/libraries/NewSoftSerial/
#if ARDUINO >= 100
 #include <SoftwareSerial.h>
#else
 #include <NewSoftSerial.h>
#endif

// power saving modes
#define SLEEPDELAY 0    /* power-down time in seconds. Max 65535. Ignored if TURNOFFGPS == 0 */
#define TURNOFFGPS 0    /* set to 1 to enable powerdown of arduino and GPS. Ignored if SLEEPDELAY == 0 */
#define LOG_RMC_FIXONLY 0  /* set to 1 to only log to SD when GPD has a fix */

// what to log
#define LOG_RMC 1 // RMC-Recommended Minimum Specific GNSS Data, message 103,04
#define LOG_GGA 0 // GGA-Global Positioning System Fixed Data, message 103,00
#define LOG_GLL 0 // GLL-Geographic Position-Latitude/Longitude, message 103,01
#define LOG_GSA 0 // GSA-GNSS DOP and Active Satellites, message 103,02
#define LOG_GSV 0 // GSV-GNSS Satellites in View, message 103,03
#define LOG_VTG 0 // VTG-Course Over Ground and Ground Speed, message 103,05



// Use pins 2 and 3 to talk to the GPS. 2 is the TX pin, 3 is the RX pin
#if ARDUINO >= 100
 SoftwareSerial gpsSerial =  SoftwareSerial(2, 3);
#else
 NewSoftSerial gpsSerial =  NewSoftSerial(2, 3);
#endif
// If using software serial (sketch example default):
//   Connect the GPS TX (transmit) pin to Digital 2
//   Connect the GPS RX (receive) pin to Digital 3
// Set the GPSRATE to the baud rate of the GPS module. Most are 4800
// but some are 38400 or other. Check the datasheet!
#define GPSRATE 9600

// Set the pins used 
#define powerPin 12
#define led1Pin 5
#define led2Pin 6
#define chipSelect 4


#define BUFFSIZE 90
char buffer[BUFFSIZE];
uint8_t bufferidx = 0;
bool fix = false; // current fix data
bool gotGPRMC;    //true if current data is a GPRMC strinng
uint8_t i;
File logfile;

// read a Hex value and return the decimal equivalent
uint8_t parseHex(char c) {
  if (c < '0')
    return 0;
  if (c <= '9')
    return c - '0';
  if (c < 'A')
    return 0;
  if (c <= 'F')
    return (c - 'A')+10;
}

// blink out an error code
void error(uint8_t errno) {
/*
  if (SD.errorCode()) {
    putstring("SD error: ");
    Serial.print(card.errorCode(), HEX);
    Serial.print(',');
    Serial.println(card.errorData(), HEX);
  }
  */
  while(1) {
    for (i=0; i<errno; i++) {
      digitalWrite(led1Pin, HIGH);
      digitalWrite(led2Pin, HIGH);
      delay(100);
      digitalWrite(led1Pin, LOW);
      digitalWrite(led2Pin, LOW);
      delay(100);
    }
    for (; i<10; i++) {
      delay(200);
    }
  }
}

void setup() {
  WDTCSR |= (1 << WDCE) | (1 << WDE);
  WDTCSR = 0;
  Serial.begin(9600);
  Serial.println("\r\nGPSlogger");
  pinMode(led1Pin, OUTPUT);
  pinMode(led2Pin, OUTPUT);
  pinMode(powerPin, OUTPUT);
  digitalWrite(powerPin, LOW);

  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card init. failed!");
    error(1);
  }

  strcpy(buffer, "GPSLOG00.TXT");
  for (i = 0; i < 100; i++) {
    buffer[6] = '0' + i/10;
    buffer[7] = '0' + i%10;
    // create if does not exist, do not open existing, write, sync after write
    if (! SD.exists(buffer)) {
      break;
    }
  }

  logfile = SD.open(buffer, FILE_WRITE);
  if( ! logfile ) {
    Serial.print("Couldnt create "); Serial.println(buffer);
    error(3);
  }
  Serial.print("Writing to "); Serial.println(buffer);
  
  // connect to the GPS at the desired rate
  gpsSerial.begin(GPSRATE);
  
  Serial.println("Ready!");
  
  gpsSerial.print(SERIAL_SET);
  delay(250);

#if (LOG_DDM == 1)
     gpsSerial.print(DDM_ON);
#else
     gpsSerial.print(DDM_OFF);
#endif
  delay(250);
#if (LOG_GGA == 1)
    gpsSerial.print(GGA_ON);
#else
    gpsSerial.print(GGA_OFF);
#endif
  delay(250);
#if (LOG_GLL == 1)
    gpsSerial.print(GLL_ON);
#else
    gpsSerial.print(GLL_OFF);
#endif
  delay(250);
#if (LOG_GSA == 1)
    gpsSerial.print(GSA_ON);
#else
    gpsSerial.print(GSA_OFF);
#endif
  delay(250);
#if (LOG_GSV == 1)
    gpsSerial.print(GSV_ON);
#else
    gpsSerial.print(GSV_OFF);
#endif
  delay(250);
#if (LOG_RMC == 1)
    gpsSerial.print(RMC_ON);
#else
    gpsSerial.print(RMC_OFF);
#endif
  delay(250);

#if (LOG_VTG == 1)
    gpsSerial.print(VTG_ON);
#else
    gpsSerial.print(VTG_OFF);
#endif
  delay(250);

#if (USE_WAAS == 1)
    gpsSerial.print(WAAS_ON);
#else
    gpsSerial.print(WAAS_OFF);
#endif
}

void loop() {
  //Serial.println(Serial.available(), DEC);
  char c;
  uint8_t sum;

  // read one 'line'
  if (gpsSerial.available()) {
    c = gpsSerial.read();
#if ARDUINO >= 100
    //Serial.write(c);
#else
    //Serial.print(c, BYTE);
#endif
    if (bufferidx == 0) {
      while (c != '

)
        c = gpsSerial.read(); // wait till we get a $
    }
    buffer[bufferidx] = c;

#if ARDUINO >= 100
    //Serial.write(c);
#else
    //Serial.print(c, BYTE);
#endif
    if (c == '\n') {
      //putstring_nl("EOL");
      //Serial.print(buffer);
      buffer[bufferidx+1] = 0; // terminate it

if (buffer[bufferidx-4] != '') {
        // no checksum?
        Serial.print('
');
        bufferidx = 0;
        return;
      }
      // get checksum
      sum = parseHex(buffer[bufferidx-3]) * 16;
      sum += parseHex(buffer[bufferidx-2]);

// check checksum
      for (i=1; i < (bufferidx-4); i++) {
        sum ^= buffer[i];
      }
      if (sum != 0) {
        //putstring_nl("Cxsum mismatch");
        Serial.print('~');
        bufferidx = 0;
        return;
      }
      // got good data!

gotGPRMC = strstr(buffer, "GPRMC");
      if (gotGPRMC) {
        // find out if we got a fix
        char *p = buffer;
        p = strchr(p, ',')+1;
        p = strchr(p, ',')+1;      // skip to 3rd item
       
        if (p[0] == 'V') {
          digitalWrite(led1Pin, LOW);
          fix = false;
        } else {
          digitalWrite(led1Pin, HIGH);
          fix = true;
        }
      }
      if (LOG_RMC_FIXONLY) {
        if (!fix) {
          Serial.print('_');
          bufferidx = 0;
          return;
        }
      }
      // rad. lets log it!
     
      Serial.print(buffer);    //first, write it to the serial monitor
      Serial.print('#');
     
      if (gotGPRMC)      //If we have a GPRMC string
      {
        // Bill Greiman - need to write bufferidx + 1 bytes to getCR/LF
        bufferidx++;

digitalWrite(led2Pin, HIGH);      // Turn on LED 2 (indicates write to SD)

logfile.write((uint8_t ) buffer, bufferidx);    //write the string to the SD file
        logfile.flush();
        /

        if( != bufferidx) {
          putstring_nl("can't write!");
          error(4);
        }
        */

digitalWrite(led2Pin, LOW);    //turn off LED2 (write to SD is finished)

bufferidx = 0;    //reset buffer pointer

if (fix) {  //(don't sleep if there's no fix)
         
          if ((TURNOFFGPS) && (SLEEPDELAY)) {      // turn off GPS module?
         
            digitalWrite(powerPin, HIGH);  //turn off GPS

delay(100);  //wait for serial monitor write to finish
            sleep_sec(SLEEPDELAY);  //turn off CPU
 
            digitalWrite(powerPin, LOW);  //turn on GPS
          } //if (TURNOFFGPS)
       
        } //if (fix)
       
        return;
      }//if (gotGPRMC)
     
    }
    bufferidx++;
    if (bufferidx == BUFFSIZE-1) {
      Serial.print('!');
      bufferidx = 0;
    }
  } else {

}

}

void sleep_sec(uint16_t x) {
  while (x--) {
    // set the WDT to wake us up!
    WDTCSR |= (1 << WDCE) | (1 << WDE); // enable watchdog & enable changing it
    WDTCSR = (1<< WDE) | (1 <<WDP2) | (1 << WDP1);
    WDTCSR |= (1<< WDIE);
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
//  sleep_enable();
    sleep_mode();
//    sleep_disable();
  }
}

SIGNAL(WDT_vect) {
  WDTCSR |= (1 << WDCE) | (1 << WDE);
  WDTCSR = 0;
}

/* End code */

en dit is de config file wat er bij zat vr de gps

/* EXAMPLE

$PSRF103,<msg>,<mode>,<rate>,<cksumEnable>*CKSUM<CR><LF>

<msg> 00=GGA,01=GLL,02=GSA,03=GSV,04=RMC,05=VTG
<mode> 00=SetRate,01=Query
<rate> Output every <rate>seconds, off=00,max=255
<cksumEnable> 00=disable Checksum,01=Enable checksum for specified message
Note: checksum is required

Example 1: Query the GGA message with checksum enabled
$PSRF103,00,01,00,01*25

Example 2: Enable VTG message for a 1Hz constant output with checksum enabled
$PSRF103,05,00,01,01*20

Example 3: Disable VTG message
$PSRF103,05,00,00,01*21

*/

#define SERIAL_SET   "$PSRF100,01,4800,08,01,00*0E\r\n"

// GGA-Global Positioning System Fixed Data, message 103,00

#define GGA_ON   "$PSRF103,00,00,01,01*25\r\n"
#define GGA_OFF  "$PSRF103,00,00,00,01*24\r\n"

// GLL-Geographic Position-Latitude/Longitude, message 103,01

#define GLL_ON   "$PSRF103,01,00,01,01*26\r\n"
#define GLL_OFF  "$PSRF103,01,00,00,01*27\r\n"

// GSA-GNSS DOP and Active Satellites, message 103,02

#define GSA_ON   "$PSRF103,02,00,01,01*27\r\n"
#define GSA_OFF  "$PSRF103,02,00,00,01*26\r\n"

// GSV-GNSS Satellites in View, message 103,03

#define GSV_ON   "$PSRF103,03,00,01,01*26\r\n"
#define GSV_OFF  "$PSRF103,03,00,00,01*27\r\n"

// RMC-Recommended Minimum Specific GNSS Data, message 103,04

#define RMC_ON   "$PSRF103,04,00,01,01*21\r\n"
#define RMC_OFF  "$PSRF103,04,00,00,01*20\r\n"

// VTG-Course Over Ground and Ground Speed, message 103,05

#define VTG_ON   "$PSRF103,05,00,01,01*20\r\n"
#define VTG_OFF  "$PSRF103,05,00,00,01*21\r\n"

// Switch Development Data Messages On/Off, message 105
#define LOG_DDM 1
#define DDM_ON   "$PSRF105,01*3E\r\n"
#define DDM_OFF  "$PSRF105,00*3F\r\n"

#define USE_WAAS   0     // useful in US, but slower fix
#define WAAS_ON    "$PSRF151,01*3F\r\n"       // the command for turning on WAAS
#define WAAS_OFF   "$PSRF151,00*3E\r\n"       // the command for turning off WAAS

er staan verschillende serial prins in de code.
Kan je ons de serial output geven op de leonardo?
Met vriendelijke groet
Jan

Ik krijg niets te zien als ik de serial monitor open ,ook geen foutmeldingen
ook niet als ik andere baudrates gebruik
bij de uno krijg ik wel alles te zien

Ook niet Serial.println("\r\nGPSlogger");?
Indien niet kan je andere sketches uploaden naar de leonardo?
Met vriendelijke groet
Jantje

Ik krijg helemaal niets te zien op de seriele monitor van de leonardo
andere sketches gaan wel goed voor zover ik de leonardo gebruik
het val mij wel op dat ik regelmatig problemen heb met de com poorten als ik de leonardo gebruik
bijvoorbeeld als ik die inplug zit die bijvoorbeeld op com 19 als ik die afkoppel en daarna opnieuw inplug
dan kan ik niet meer aan com 19 dan moet ik via apparaatbeheer de installatie van de leonardodrivers ongedaan maken en opnieuw inpluggen
dan gaat het soms goed vr een tijdje

ik heb echt geen idee wat er aan de hand is.
Wat ik zu proberen is om stukken code weg te laten tot je weer seriele feedback krijgt.
Dan de code stuk voor stuk terug zodat je kan zien waar het fout gaat.
Met vriendelijke groet
Jan

Ik zou eerst eens beginnen met een simpele Serial.println test om te bevestigen dat uploaden en seriele communicatie wel goed verloopt. Let wel op dat pin adressering op de leonardo iets anders is met bijv. pin 14 (A0). Dit zorgt vaak voor problemen met sketches van de UNO op de Leonardo.

Ik ga dit weekend eens het één en het ander uitproberen
ik laat iets weten volgende week

Groeten Gert

zo
Ik heb enkele dingen geprobeerd
niet dat ik veel wijzer ben geworden maar enfin.
ik heb een paar andere sketches geprobeerd met de leonardo en alles werkt goed ook de seriele monitor,
ik heb nog een ethernet shield liggen en als ik daar de sd kaart van gebruik werkt mn sketch wel goed inlcusief de seriele monitor
doe ik hetzelfde met het breakout bordje v adafruit dan werkt het alleen met de uno en niet met de leonardo :frowning:

ik weet het niet meer maar ik denk dat ik mn leonardo bord ga reserveren voor een ander projekt
en gewoon verder gaan met de uno

Groeten Gert

Op welke pinnen heb je het breakout bordje van adafruit aangesloten?

clk op pin 13
data out op pin 12
data in op pin 11
chip select op pin 4
en dan natuurlijk nog 5v en gnd

// If using software serial (sketch example default):
// Connect the GPS TX (transmit) pin to Digital 2
// Connect the GPS RX (receive) pin to Digital 3

gert:
clk op pin 13
data out op pin 12
data in op pin 11
chip select op pin 4
en dan natuurlijk nog 5v en gnd

Dat kan toch nooit werken? Werkt het zo op een UNO? :astonished:
ls je problemen hebt kan je best beginnen met pinnen 1,2,13 niet te gebruiken.
Jantje

Ja met de uno werkt het wel goed
ik heb die pin aansluitingen ergens opgepikt op het net
maar als ik nu de aansluitingen verander hoe moet ik dat dan aanpassen in de sketch ?
want ik vind dat niet terug welke pin de clk of data in of data uit is

Groeten Gert

Een zoektocht naar "Leonardo pinout", levert deze thread (klik!) op.

Ik denk dat het plaatje je voldoende moet kunnen helpen, ondanks dat de thread in het Italiaans is.

bedankt
nu zie ik waarom het niet werkt bij een leonardo
de clk ,mosi en miso gaan alleen naar de icsp header bij een leonardo en bij de uno gaan die ook naar pin 11,12 en 13

heel erg bedankt voor de info
ik ga morgen eens een fototje plaatsen van mn (min of meer)afgewerkt projekt
en dan mag dit topic voor mij afgesloten worden :slight_smile:

Groeten Gert

Tja, die Leonardo blijft een buitenbeentje.
Ik zag een andere link in die thread staan en heb die maar eens gevolgd.
Daar staan een heleboel boards op een rijtje uitgetekend door dezelfde persoon.
Ik heb wel een foutje gerapporteerd zojuist, maar dan nog is het een interessante thread.

Heb je het inmiddels ook al getest (het aanpassen is geen enorme onderneming denk ik)?

MAS3:
Tja, die Leonardo blijft een buitenbeentje.
Ik zag een andere link in die thread staan en heb die maar eens gevolgd.
Daar staan een heleboel boards op een rijtje uitgetekend door dezelfde persoon.
Ik heb wel een foutje gerapporteerd zojuist, maar dan nog is het een interessante thread.

Heb je het inmiddels ook al getest (het aanpassen is geen enorme onderneming denk ik)?

Das een interessante link :slight_smile:
Ik ben blij dat het probleem is gevonden.
Met vriendelijke groet
Jantje