Go Down

Topic: Programme qui fonctionne mais qui plante pendant l'utilisation (Read 589 times) previous topic - next topic

louchebem06

Bonjours,

Je suis en train de faire un tour de magie Electronique, qui fonctionne mais plante pendant  l'utilisation, si je ne redemare pas tout  les module rien ne fonction puis  sa marche 3 min et plus rien .

J'utilise :

- Arduino Elegoo  Nano v3 (Arduino)
- GY-521 (MPU-6050) (Gyroscope)
- nRF24L01+ (Comunication sans fils)

Le principe avoir 5 Boite et un Vibreur .

Quand on ouvre une boite le vibreur Vibre 1 fois tout les secondes jusqu'à la fermeture de la boite, si ces la boite 2 le vibreur vibre 2 fois ....

Code boite 1
Code: [Select]
/**
 * Exemple de code pour la bibliothèque Mirf - Client Ping Pong
 */
#include <SPI.h>      // Pour la communication via le port SPI
#include <Mirf.h>     // Pour la gestion de la communication
#include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // Pour la communication SPI
#include<Wire.h>

const int MPU_addr=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;

void setup() {
  Serial.begin(9600);

  Wire.begin();
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
   
  Mirf.cePin = 9; // Broche CE sur D9
  Mirf.csnPin = 10; // Broche CSN sur D10
  Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
  Mirf.init(); // Initialise la bibliothèque

  Mirf.channel = 1; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
  Mirf.payload = 8; // Taille d'un message (maximum 32 octets)
  Mirf.config(); // Sauvegarde la configuration dans le module radio

  Mirf.setTADDR((byte *) "nrf02"); // Adresse de transmission
  Mirf.setRADDR((byte *) "nrf01"); // Adresse de réception
   
  Serial.println("Module");
}
 
void loop() {
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) ;

    if(AcX < -13000)
    {
      byte message[8] = "vibres1";
    Mirf.send(message); // On envoie le message
    delay(1150);
      }
}


Code Virbeur
Code: [Select]
/**
 * Exemple de code pour la bibliothèque Mirf – Serveur Ping Pong
 */
#include <SPI.h>      // Pour la communication via le port SPI
#include <Mirf.h>     // Pour la gestion de la communication
#include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
#include <RF24.h>
#include <MirfHardwareSpiDriver.h> // Pour la communication SPI

void setup() {
  Serial.begin(9600);

  Mirf.cePin = 9; // Broche CE sur D9
  Mirf.csnPin = 10; // Broche CSN sur D10
  Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
  Mirf.init(); // Initialise la bibliothèque

  Mirf.channel = 1; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
  Mirf.payload = 8; // Taille d'un message (maximum 32 octets)
  Mirf.config(); // Sauvegarde la configuration dans le module radio

  Mirf.setTADDR((byte *) "nrf01"); // Adresse de transmission
  Mirf.setRADDR((byte *) "nrf02"); // Adresse de réception

  Serial.println("Vibreur");

    pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
}

void loop() {
 byte message[8];

  if(Mirf.dataReady())
  {
    Mirf.getData(message); // Réception du paquet
if (strcmp((char*) message, "vibres1") == 0) {
     digitalWrite(2, HIGH);
     delay(150);
      digitalWrite(2, LOW);
     delay(1000);
    }

    if (strcmp((char*) message, "vibres2") == 0) {
     digitalWrite(2, HIGH);
     delay(150);
     digitalWrite(2, LOW);
      delay(100);
      digitalWrite(2, HIGH);
     delay(150);
      digitalWrite(2, LOW);
     delay(1000);
    }

    if (strcmp((char*) message, "vibres3") == 0) {
     digitalWrite(2, HIGH);
     delay(150);
     digitalWrite(2, LOW);
      delay(100);
      digitalWrite(2, HIGH);
     delay(150);
     digitalWrite(2, LOW);
      delay(100);
      digitalWrite(2, HIGH);
     delay(150);
      digitalWrite(2, LOW);
     delay(1000);
    }

    if (strcmp((char*) message, "vibres4") == 0) {
     digitalWrite(2, HIGH);
     delay(150);
     digitalWrite(2, LOW);
      delay(100);
      digitalWrite(2, HIGH);
     delay(150);
     digitalWrite(2, LOW);
      delay(100);
      digitalWrite(2, HIGH);
     delay(150);
     digitalWrite(2, LOW);
      delay(100);
      digitalWrite(2, HIGH);
     delay(150);
      digitalWrite(2, LOW);
     delay(1000);
    }

    if (strcmp((char*) message, "vibres5") == 0) {
      digitalWrite(2, HIGH);
     delay(150);
     digitalWrite(2, LOW);
      delay(100);
      digitalWrite(2, HIGH);
     delay(150);
     digitalWrite(2, LOW);
      delay(100);
      digitalWrite(2, HIGH);
     delay(150);
     digitalWrite(2, LOW);
      delay(100);
      digitalWrite(2, HIGH);
     delay(150);
     digitalWrite(2, LOW);
      delay(100);
      digitalWrite(2, HIGH);
     delay(150);
      digitalWrite(2, LOW);
     delay(1000);
    }

 }
  }



Merci par avance

lesept

"Je suis en train de faire un tour de magie Electronique, qui fonctionne mais plante pendant  l'utilisation, si je ne redemare pas tout  les module rien ne fonctionne puis  ça marche 3 min et plus rien ."

Ça fonctionne mais ça plante... Peux tu décrire plus précisément ce que tu veux dire par" plante"? Est ce que le code principal s'arrête ? Est ce celui des boîtes ? Les 3 minutes, c'est exactement 3 minutes ou ça varie ?

Donne le maximum de précisions, quelles cartes sont utilisées, quels modules RF, comment est ce alimenté, etc.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

louchebem06

Merci de ta réponse, désolé pour ma mise en forme .

Quote
Ça fonctionne mais ça plante... Peux tu décrire plus précisément ce que tu veux dire par" plante"? Est ce que le code principal s'arrête ? Est ce celui des boîtes ? Les 3 minutes, c'est exactement 3 minutes ou ça varie ?
Sa varie sa peut aller de 10 seconde a 15 minute, je n'arrive pas a déterminer sur cela vien de la partie vibreur ou boite car j'ai fabriquer 3 vibreur et environs 15 boite et toujours la même chose . La led RX TX ne clignote plus des deux coter donc aucun envoie ou réception .

Quote
Donne le maximum de précisions, quelles cartes sont utilisées, quels modules RF, comment est ce alimenté, etc.
Pour alimentation:
Batterie de téléphone 3.7v 1000mAh de marque Sagem
Couplet a un Chargeur / Booster de batterie  qui me monte la tension réglée sur 9v .

Matériel :
- Arduino Elegoo  Nano v3 (Arduino)
- GY-521 (MPU-6050) (Gyroscope)
- nRF24L01+ (Comunication sans fils)
- Vibreur 3v vendu par 10 sur ebay pour réparation de smartphone

Voila les schéma et les branchement .

Schema du Arduino


Schema du  Gyroscope



Gyro => Arduino

VCC => 5v
GND => GND
SCL => A5
SDA => A4
XDA => NC
XCL => NC
AD0 => NC
INT => D5


Schema  du Module Sans fil



Module sans fil => Arduino

1 => GND
2 => 3V3
3 => D9
4 => D10
5 => D13
6 => D11
7 => D12
8 => NC



Coter Vibreur le vibreur es connecter sur D2 et le Gyro n'es pas connecter pour la partie RF ces la même chose que les boite .

Merci de prendre le temps pour moi :)

lesept

Tu as écrit le code d'une traite ou tu l'as testé par morceaux ?

J'ai du mal à comprendre comment marche ton système, donc désolé pour toutes ces questions :
  • Tu as 5 boites et un vibreur : il y a un nano par boite plus un nano pour piloter le vibreur ?
  • Chaque boite est équipée d'un émetteur RF en plus du nano ?
  • Comment détectes-tu l'ouverture d'une boite ? Est-ce le rôle du gyroscope ? Dans ce cas tu en as 5 aussi ?
  • Sinon à quoi sert le gyroscope ?
  • As-tu testé avec tous les émetteurs / récepteurs ou seulement avec un couple pour l'instant ?

Au passage, je pense que tu devrais simplifier tes communications et t'inspirer de ceci et ceci pour le protocole de communication.

"Louchebem", c'est de l'argot : tu es boucher ?  ;)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

louchebem06

Quote
"Louchebem", c'est de l'argot : tu es boucher ?  ;)
Oui, tu larpem largomes des louchebem ?
Je te donne la traduction dans le prochain message si tu ne comprend pas :)

Quote
Tu as écrit le code d'une traite ou tu l'as testé par morceaux ?
J'ai  fait des petit test d'abord sur le fonctionnement du Gyro en prenant  des exemple puis j'ai raccourci  le code pour garder ce qui me fallait .
Et j'ai fait la  même pour le RF le code test était Ping Pong et en faisant des recherche je les adapter a mais besoins .

Quote
Tu as 5 boites et un vibreur : il y a un nano par boite plus un nano pour piloter le vibreur ?
Oui

Quote
Chaque boite est équipée d'un émetteur RF en plus du nano ?
Oui

Quote
Comment détectes-tu l'ouverture d'une boite ? Est-ce le rôle du gyroscope ? Dans ce cas tu en as 5 aussi ?
Oui

Quote
Sinon à quoi sert le gyroscope ?
Tu  as repondu  a la  question d'avant :)

Quote
As-tu testé avec tous les émetteurs / récepteurs ou seulement avec un couple pour l'instant ?
Si on prend 1 Vibreur et une boite sans  aucune autre boite sa fonction plus longtemps mais sa plante quand même si je m'éloigne et je reviens, comme si sa avait perdu le signal et n'arriver pas a le retrouver sans reboot le tout .

Mon  tour ces le meme principe sauf que au lieu des stylo ces des boite .

https://youtu.be/x1Odx-KTW4U?t=282

lesept

Je larpem pas mais je lomprenkem un peu l'argomuche :) Des heures de lecture de San Antonio dans ma jeunesse ...

Donc le problème semble lié à la distance entre l'émetteur et le récepteur ? As-tu fait des essais pour voir à partir de quelle distance tu perds la comm et si c'est reproductible ?

Je ne peux guère t'aider sur le plan de la comm RF, car je n'ai jamais testé ces modules, mais beaucoup de membres du forum ont cette expérience et pourront t'aider. Le problème peut être lié à la distance, mais je n'y crois pas trop, peut-être à des interférences entre les modules ou à leur alimentation...

A part ça, tu pourrais simplifier ton code : au lieu d'envoyer un message complexe comme "vibres5", tu peux n'envoyer que "5". A la réception, tu transformes ce "5" en un chiffre 5 que tu mets dans une variable par exemple NumBoite et tu fais une boucle
Code: [Select]
for (i=0; i<NumBoite;i++) {
     digitalWrite(2, HIGH);
     delay(150);
     digitalWrite(2, LOW);
     delay(100);
}
delay(900);


Lonnebès Lancechèm ! ;)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

louchebem06


J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up