Dans la continuité d'un de mes sujets précédents (utilisation du gyro/accéléro LSM9DS1 d'un Sense HAT en I2C), j'ai désormais un autre petit souci.
Les faits : sur un RPi 3, j'ai un programme en C/C++ qui, lorsque je le démarre, enregistre dans un fichier CSV 3 valeurs d'accélération (1 valeur par axe) et 3 valeurs de rotation (1 valeur par axe), pour un nombre spécifié de lecture (si je demande 100 lectures, ce sont 100 * (3 + 3) = 600 valeurs qui seront enregistrées). J'utilise cette bibliothèque, spécialement écrite pour le LSM9DS1, qui utilise WiringPi. Le programme fonctionne comme je le souhaite, pas de problème de ce côté-là.
Sur le même RPi 3, j'ai un autre programme en C/C++ composé d'un bouton-poussoir et de deux DEL (une rouge et une verte), équipés des résistances appropriées, qui fonctionne comme suit :
- Je démarre mon programme -> la DEL verte s'allume, la rouge reste éteinte
- J'appuie sur le bouton-poussoir -> la DEL verte s'éteint, la DEL rouge s'allume
- Au bout d'un temps spécifié (5 secondes dans mon cas), la DEL rouge s'éteint, la DEL verte clignote 1,5 seconde, puis reste allumée
- Le processus peut être relancé depuis l'étape 2
En revanche, lorsque j'essaie de faire fusionner mes programmes de sorte que l'étape "DEL rouge qui s'allume" soit remplacée par mon premier programme (pour en fait lancer mon programme grâce à une pression sur le bouton-poussoir, avec les DEL qui indiquent l'état du travail), j'obtiens une erreur au lancement : wiringPiSetup*: You must only call this once per program run. This is a fatal error. Please fix your code., mais aucune erreur lors de la compilation.
Le code abrégé du premier programme :
Code : Tout sélectionner
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "LSM9DS1.h" // La fameuse bibliothèque du LSM9DS1.
// Nombre de lectures.
#define nbrOfRec 10000
int main(int argc, char *argv[])
{
LSM9DS1 imu(IMU_MODE_I2C, 0x6a, 0x1c);
imu.begin();
imu.calibrate();
printf("Starting.\n");
[lecture des valeurs, enregistrement dans des tableaux]
printf("Ending.\n");
[écriture dans un CSV]
return 1;
}
Code : Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#define SWITCH 0
#define LED_R 2
#define LED_V 3
void blinkLed(int led)
{
for (int i = 0; i < 15; i++)
{
digitalWrite(led, !digitalRead(led));
delay(100);
}
}
void switchLed()
{
wiringPiSetup();
pinMode(SWITCH, INPUT);
pinMode(LED_R, OUTPUT);
pinMode(LED_V, OUTPUT);
digitalWrite(LED_R, HIGH);
digitalWrite(LED_V, LOW);
while (1)
{
if (digitalRead(SWITCH) == HIGH)
{
digitalWrite(LED_R, LOW);
digitalWrite(LED_V, HIGH);
delay(5000);
digitalWrite(LED_R, HIGH);
blinkLed(LED_V);
digitalWrite(LED_V, LOW);
}
delay(1);
}
}
int main(void)
{
switchLed();
return 0;
}
En ajoutant quelques printf() dans mon premier programme, je me rends compte que c'est la création de mon objet LSM9DS1 imu(IMU_MODE_I2C, 0x6a, 0x1c); qui est à l'origine du message d'erreur, donc je suppose que la fonction wiringPiSetup() est appelée implicitement par la bibliothèque.
J'ai essayé de supprimer la ligne wiringPiSetup(); du second programme, mais dans ce cas les DEL ne s'allument pas et rien ne se passe lorsque j'appuie sur le bouton ; et je ne peux évidemment pas supprimer la création de mon objet LSM9DS1.
Auriez-vous une suggestion à me faire pour résoudre ce problème tout en conservant les fonctionnalités que je souhaite ? Si possible en conservant la bibliothèque LSM9DS1 et WiringPi, mais dans le pire des cas, je me passerai de WiringPi pour gérer le bouton et les DEL en C pur comme dans cet exemple qui me paraît lourd pour le peu que je souhaite faire.
Merci à vous !