Bonjour bonjour!
Alors voila, je viens vous exposer un problème qui me fait m'arracher les cheveux depuis quelques temps.
Je cherche à faire un traceur GPS a base d'Arduino mini.
En gros le principe est simple, le GPS envoie une trame, celle-ci est enregistrée sur un fichier TXT de la carte SD et les donnée de cette même trame sont décortiquées pour étres affichées sur un ecran LCD.
Voila ce que ca donne (Oui alors désolé, je suis encore novice en codage, c'est peut-ètre pas super clair ce que je fait):
#include <SoftwareSerial.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <TinyGPS.h>
#include <SD.h>
SoftwareSerial ss(8, 9); //ss(TX, RX)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
File sdfile;
TinyGPS gps;
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 10;
static char filename[13];
static bool fileOpened = false;
bool openSDFile()
{
// open log file
for (unsigned int index = 0; index < 65535; index++)
{
char filename[16];
sprintf(filename, "GPS%05d.TXT", index);
display.clearDisplay();
display.println("Nouvelle trace");
display.println(filename);
display.display();
if (!SD.exists(filename))
{
sdfile = SD.open(filename, FILE_WRITE);
if (sdfile)
{
display.print("ajoutee!");
display.display();
delay(2000);
return true;
}
display.print("Impossible de creer un fichier");
display.display();
break;
}
}
return false;
}
void setup()
{
Serial.begin(115200);
ss.begin(9600);
pinMode(10, OUTPUT);
display.begin(); //initialisation ecran
display.setContrast(50);
display.display(); // shw splashscreen
delay(1000);
display.clearDisplay(); // clears the screen and buffer
if (!card.init(SPI_HALF_SPEED, chipSelect))
{
display.clearDisplay();
display.println("Carte SD introuvable");
display.display();
delay(3000);
return;
}
else
{
display.clearDisplay();
display.println(" ");
display.println("Carte SD OK.");
display.display();
delay(2000);
if (SD.begin(10))
{
fileOpened = openSDFile();
}
// Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
if (!volume.init(card))
{
display.println("Partition FAT introuvable");
display.display(); // shw splashscreen
delay(3000);
return;
}
}
}
void loop()
{
bool newData = false;
unsigned long chars;
unsigned short sentences, failed;
static int byteCount = 0;
static unsigned long lastTime = 0;
static unsigned int recDataKB = 0;
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (ss.available())
{
char c = ss.read();
if (fileOpened)
{
sdfile.write(c);
if (++byteCount >= 1024)
{
// flush to file every 1KB
sdfile.flush();
byteCount = 0;
recDataKB++;
}
}
if (gps.encode(c)) // Did a new valid sentence come in?
newData = true;
}
}
if (newData)
{
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.print("Lat:");
display.println(flat);
display.print("Lon: ");
display.println(flon);
display.display();
}
}
le code marche très bien avec une Arduino Mega. Seulement voila impossible de le faire fonctionner correctement sur une Mini Pro 3.3v 8MHz.
Soit le code se fige au moment de créer un nouveau fichier sur la carte SD (dans la fonction OpenSDfile) soit il m'affiche "Impossible de creer un fichier"
Donc la je me dit, c'est la carte SD qui déconne ou même la fonction OpenSDfile... (chose étonnante car elle marche très bien sur la Mega)
J'ai donc essayer d'enlever tout ce qui gérait l'ecran LCD pour ne laisser que la carte SD qui enregistre la trame du GPS, ce qui donne a peu près ceci:
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <SD.h>
SoftwareSerial ss(8, 9); //ss(TX, RX)
TinyGPS gps;
File sdfile;
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 10;
static char filename[13];
static bool fileOpened = false;
bool openSDFile()
{
// open log file
for (unsigned int index = 0; index < 65535; index++)
{
char filename[16];
sprintf(filename, "GPS%05d.TXT", index);
Serial.print("Nouvelle trace");
Serial.println(filename);
if (!SD.exists(filename))
{
sdfile = SD.open(filename, FILE_WRITE);
if (sdfile)
{
Serial.print("ajoutee!");
delay(2000);
return true;
}
Serial.print("Impossible de creer un fichier");
break;
}
}
return false;
}
void setup()
{
Serial.begin(115200);
ss.begin(9600);
pinMode(10, OUTPUT);
if (!card.init(SPI_HALF_SPEED, chipSelect))
{
Serial.print("Carte SD introuvable");
delay(3000);
return;
}
else
{
Serial.print("Carte SD OK.");
delay(2000);
if (SD.begin(10))
{
fileOpened = openSDFile();
}
// Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
if (!volume.init(card))
{
Serial.print("Partition FAT introuvable");
delay(3000);
return;
}
}
}
void loop()
{
bool newData = false;
unsigned long chars;
unsigned short sentences, failed;
static int byteCount = 0;
static unsigned long lastTime = 0;
static unsigned int recDataKB = 0;
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (ss.available())
{
char c = ss.read();
if (fileOpened)
{
sdfile.write(c);
if (++byteCount >= 1024)
{
// flush to file every 1KB
sdfile.flush();
byteCount = 0;
recDataKB++;
}
}
if (gps.encode(c)) // Did a new valid sentence come in?
newData = true;
}
}
}
Et la, ca marche. J'ai bien ma trame qui s'enregistre sur la carte et je peux voir dans la console qu'il arrive bien a passer la fonction OpenSDfile.
Donc la je me dit, c'est l'affichage sur l'ecran LCD qui déconne
Donc j'essaye cette fois ci le code sans enregistrement sur carte SD mais avec l'affichage:
#include <SoftwareSerial.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <TinyGPS.h>
SoftwareSerial ss(8, 9); //ss(TX, RX)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
TinyGPS gps;
void setup()
{
Serial.begin(115200);
ss.begin(9600);
display.begin(); //initialisation ecran
display.setContrast(50);
display.display(); // shw splashscreen
delay(1000);
display.clearDisplay(); // clears the screen and buffer
}
void loop()
{
bool newData = false;
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (ss.available())
{
char c = ss.read();
if (gps.encode(c)) // Did a new valid sentence come in?
newData = true;
}
}
if (newData)
{
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.print("Lat:");
display.println(flat);
display.print("Lon: ");
display.println(flon);
display.display();
}
}
Et la, bha bien sur ca marche....
Du coup, je sais plus trop quoi me dire...
D'autant plus que ca marche avec la Mega. Vous pensez que ce puisse être la Mini que est trop lente (8MHz contre 16 pour la Mega il me semble)
J'arrive vraiment a rien, je vois pas ou j'ai faux =(
Pour info, le GPS est configuré en 9600bauds et envoie une trame par seconde (1Hz).
En esperant que vous pourrez m'aider.
Merci!!