[RÉSOLU] Erreur d'initialisation de WiringPi
Posté : mer. 22 mars 2017 09:38
Bonjour,
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 :
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 :
Le code du second programme (ce ne serait pas plutôt INPUT à mettre dans les pinMode() de mes DEL..?) :
Pour obtenir le programme fusionné, j'ai inséré tout le contenu du main du premier programme à la place du delay(5000) du second, tout en ajoutant les bons include et les variables.
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 !
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 !