Go Down

Topic: Problème de programmes .. (Read 5466 times) previous topic - next topic

BonCourage

Bonjour, je vient sollicité votre aide suite à de longue recherche sans résultat ..
Tout d'abord je suis au Lycée et le travail que je vais vous présentez et mon projet en STI2D.
Voilà, notre projet consiste à utilisé un capteur volumétrique avec comme support une carte Arduino Uno, détecter un individu puis ensuite renvoyer l'information à une autre carte Arduino Uno.
Mon travail consiste à crée un programme pour mon capteur volumétrique celui ci et fonctionnel.

Voici le programme :


int calibrationTime = 10;       // 10 secondes de calibrage


int inputPin = 2;               // Définir l'ensemble des variables utilisé
int pirState = LOW;             
int val = 0;                   

void setup() {

  pinMode(inputPin, INPUT);     // Déclaration du capteur en entrer
  Serial.begin(9600);

  Serial.print("Calibrage du Capteur Volumetrique ");     // Initialisation en cours
  for(int i = 0; i < calibrationTime; i++){
    Serial.print(".");
    delay(1000);
  }
}

void loop(){
  val = digitalRead(inputPin);     // Lire la valeur d'entrer : 0 Rien à signaler
  Serial.println(val);
  if (val == HIGH) {
    delay(100);            //  Vitesse de rafraichissement des informations

    if (pirState == LOW) {

      Serial.println(" !! MOUVEMENT SUSPECT ");    // Message de prévention (allumage d'une led possible)
      pirState = HIGH;
    }
  } else {
    delay(100);
    if (pirState == HIGH){
      // we have just turned of
      Serial.println("!! PLUS DE MOUVEMENT !!");      // Message de prévention, plus de signal
      pirState = LOW;
    }
  }
}

La suite de mon travail consiste désormais a envoyer l'information binaire (1-0) à une autre carte Arduino Uno, celle ci s'occupera de traiter l'information et à juger si oui ou non la menace est réel et alerter l'utilisateur de la présence d'un intrus dans la zone protéger par le capteur.

Voici désormais le programme qui enverra l'information (sous Xbee)

#include <SoftwareSerial.h>
// RX, TX : Définition ports séries du module XBee
SoftwareSerial XbeeSerial(10, 11);


//config d'Arduino initiale

void setup() {         
  Serial.begin(9600);
  XbeeSerial.begin(9600);
 
  //Lance le réglage par défaut du module XBee pour la partie émettrice
  Configuration();
}


//Programme en boucle ... (attente d'un message de l'arduino + recon. vocale)

void loop() {
  delay(15000);
  Serial.println("Ready !"); //UNIQUEMENT POUR LE DEBOGAGE PC
  char reception[20];
  String decryption;
  int i;
  //Reste en attente de réception dans cette boucle
  while(1){
    i = 0 ;
    while ( Serial.available()>0 )      {
      //Si reçoit quelque chose, commence à inscrire caractère par caractère dans la chaîne 'decryption'
      //'reception' sert d'intermède pour mettre l'entièreté de la valeur reçue dans 'decryption'
      reception = Serial.read();
      decryption += reception;
      i++;
      delay(100);
    }
    if (i>0) {
      //Serial.println(decryption); //UNIQUEMENT POUR LE DEBOGAGE PC
      XbeeSerial.print(decryption); //Envoi l'information reçue au récepteur XBee
      delay(1000);
      decryption = ""; //Remet à zéro la variable decryption
    }
  }
}


//Configuration du XBEE (automatique)

void Configuration() {
  Serial.println("START CONFIG"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("+++");
  delay(3000);
  Serial.println("BAUD RATE : 9600"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATBD3\r");
  delay(90);
  Serial.println("CHANNEL : 12"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATCH12\r");
  delay(90);
  Serial.println("ID CHANNEL : 2014"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATID2014\r");
  delay(90);
  Serial.println("MODULE ADRESS : 1"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATMY1\r");
  delay(90);
  Serial.println("DESTINATION ADRESS : 2"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATDL2\r");
  delay(90);
  Serial.println("AES KEY : ATKY26CF2FD6DE74D631A7ED434125997B3D"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATKY26CF2FD6DE74D631A7ED434125997B3D\r");
  delay(90);
  Serial.println("AES ENABLED"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATEE1\r");
  delay(90);
  Serial.println("NO PARITY"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATNB0\r");
  delay(90);
  Serial.println("MODULE NAME"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATNI MODULE1\r");
  delay(90);
  Serial.println("WRITE CONFIGURATION"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATWR\r");
  delay(90);
  Serial.println("CLOSE NODE"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATCN\r");
  delay(90);
  Serial.println("BACK TO LOOP"); //UNIQUEMENT POUR LE DEBOGAGE PC
 
  //Retour à la boucle principale du programme
  loop();

Voici maintenant mon problème

Je cherche à combiner les deux programme si dessus .. seulement je ne trouve rien, aucune information sur la combinaison de deux programmes simultané. j'ai entendu parler de la librairy write mais je ne sais pas comment m'y prendre, si vous avez des informations pour avance un peut, la revu de projet approche et j'ai peur de montrer quelque chose de peu concluant  :smiley-confuse:

Merci encore  :smiley-lol:  :smiley-lol:

vohu

#1
Mar 19, 2015, 05:37 pm Last Edit: Mar 19, 2015, 05:39 pm by vohu
haha, t'as pris le temps de fouiller pour voir comment on met un avatar, mais pas comment on met les balises code :D  Modifie ton post et n'oublie pas pour la suite de les utiliser.


Qu'appelles tu "combinaison de deux programmes simultané" ??? Tu veux dire lancer tes 2 programmes en même temps ?
Si c'est ça, ce n'est pas possible car un arduino n'est pas un PC multitaches. Il faut que tu fusionnes tes 2 programmes à la main :)

BonCourage

Salut merci de ta réponse si rapide, en effet je recherche à combiner les deux programmes en un seul, est-ce possible ? Si oui comment s'y prendre ? Merci encore

infobarquee

bonjour,
balise code svp.
envoyer comment l'info?
fil, radio, pigeon voyageur? :)
vu le code je présume xbee.
déjà si tu essayais de faire les codes démo du xbee pour voir comment ca fonctionne pour envoyer les trames avec info.
a partir de la, ton boulot est presque terminé ;)
AUCUNE AIDE PAR MP

BonCourage

Merci pour votre réponse, en effet je travail sur un module xbee, j'utilise des files ainsi qu'un module xbee comme celui ci : http://www.google.fr/imgres?imgurl=http://djynet.net/wp/wp-content/uploads/2012/04/10414-01-500x500.jpg&imgrefurl=http://djynet.net/?p%3D96&h=500&w=500&tbnid=8Oai3GVMG08tOM:&zoom=1&q=module+xbee&tbnh=91&tbnw=91&usg=__pHFvpBcwhGZIfkeAv-jn2-G_cEw=&docid=JQuqR9Cx34qBdM&sa=X&ei=p8oPVYLYLpL7aLfZgKAG&ved=0CCQQ9QEwAA

Des informations supplémentaire sur les codes de démo ?? merci pour tout

pierrotm777

J'ai compilé tes deux codes et ça pourrait donner cela:
Code: [Select]
#include <SoftwareSerial.h>
// RX, TX : Définition ports séries du module XBee
SoftwareSerial XbeeSerial(10, 11);

int calibrationTime = 10;       // 10 secondes de calibrage
int inputPin = 2;               // Définir l'ensemble des variables utilisé
int pirState = LOW;             
int val = 0;                   

void setup()
{

  pinMode(inputPin, INPUT);     // Déclaration du capteur en entrer
  Serial.begin(9600);

  Serial.print("Calibrage du Capteur Volumetrique ");     // Initialisation en cours
  for(int i = 0; i < calibrationTime; i++){
    Serial.print(".");
    delay(1000);
  }
 
  setupXbee();
}

void loop()
{
  val = digitalRead(inputPin);     // Lire la valeur d'entrer : 0 Rien à signaler
  Serial.println(val);
  if (val == HIGH) {
    delay(100);            //  Vitesse de rafraichissement des informations

    if (pirState == LOW) {

      Serial.println(" !! MOUVEMENT SUSPECT ");    // Message de prévention (allumage d'une led possible)
      pirState = HIGH;
    }
  } else {
    delay(100);
    if (pirState == HIGH){
      // we have just turned of
      Serial.println("!! PLUS DE MOUVEMENT !!");      // Message de prévention, plus de signal
      pirState = LOW;
    }
  }
 
  loopXbee();
}


//config d'Arduino initiale

void setupXbee()
{         
//  Serial.begin(9600);
  XbeeSerial.begin(9600);
 
  //Lance le réglage par défaut du module XBee pour la partie émettrice
  Configuration();
}


//Programme en boucle ... (attente d'un message de l'arduino + recon. vocale)

void loopXbee() {
  delay(15000);
  Serial.println("Ready !"); //UNIQUEMENT POUR LE DEBOGAGE PC
  char reception[20];
  String decryption;
  int i;
  //Reste en attente de réception dans cette boucle
  while(1){
    i = 0 ;
    while ( Serial.available()>0 )      {
      //Si reçoit quelque chose, commence à inscrire caractère par caractère dans la chaîne 'decryption'
      //'reception' sert d'intermède pour mettre l'entièreté de la valeur reçue dans 'decryption'
      reception = Serial.read();
      decryption += reception;
      i++;
      delay(100);
    }
    if (i>0) {
      //Serial.println(decryption); //UNIQUEMENT POUR LE DEBOGAGE PC
      XbeeSerial.print(decryption); //Envoi l'information reçue au récepteur XBee
      delay(1000);
      decryption = ""; //Remet à zéro la variable decryption
    }
  }
}


//Configuration du XBEE (automatique)

void Configuration() {
  Serial.println("START CONFIG"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("+++");
  delay(3000);
  Serial.println("BAUD RATE : 9600"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATBD3\r");
  delay(90);
  Serial.println("CHANNEL : 12"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATCH12\r");
  delay(90);
  Serial.println("ID CHANNEL : 2014"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATID2014\r");
  delay(90);
  Serial.println("MODULE ADRESS : 1"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATMY1\r");
  delay(90);
  Serial.println("DESTINATION ADRESS : 2"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATDL2\r");
  delay(90);
  Serial.println("AES KEY : ATKY26CF2FD6DE74D631A7ED434125997B3D"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATKY26CF2FD6DE74D631A7ED434125997B3D\r");
  delay(90);
  Serial.println("AES ENABLED"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATEE1\r");
  delay(90);
  Serial.println("NO PARITY"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATNB0\r");
  delay(90);
  Serial.println("MODULE NAME"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATNI MODULE1\r");
  delay(90);
  Serial.println("WRITE CONFIGURATION"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATWR\r");
  delay(90);
  Serial.println("CLOSE NODE"); //UNIQUEMENT POUR LE DEBOGAGE PC
  XbeeSerial.print("ATCN\r");
  delay(90);
  Serial.println("BACK TO LOOP"); //UNIQUEMENT POUR LE DEBOGAGE PC
 

BonCourage

Salut pierrotm777 ! Merci pour ton aide ! C'est déjà moins le bazar sur mon moniteur ^^ le programme que tu ma donner marche en effet, cependant un problème persiste : /
J'ai l'impression que le capteur s'arrête de marcher certainement un problème de boucle je pense ?

Voici l'écran du moniteur si sa peut aider à y voir plus clair :

Calibrage du Capteur Volumetrique .....START CONFIG
BAUD RATE : 9600
CHANNEL : 12
ID CHANNEL : 2014
MODULE ADRESS : 1
DESTINATION ADRESS : 2
AES KEY : ATKY26CF2FD6DE74D631A7ED434125997B3D
AES ENABLED
NO PARITY
MODULE NAME
WRITE CONFIGURATION
CLOSE NODE
BACK TO LOOP
0
Ready !


Merci encore :) !

pierrotm777

Probablement à cause du while(1) de la fonction loopXbee() !
Tu reste dans cette boucle while

essai ça pour voir ?

Code: [Select]
void loopXbee() {
  delay(15000);
  Serial.println("Ready !"); //UNIQUEMENT POUR LE DEBOGAGE PC
  char reception[20];
  String decryption;
  int i;
  //Reste en attente de réception dans cette boucle
//  while(1){
    i = 0 ;
    while ( Serial.available()>0 )      {
      //Si reçoit quelque chose, commence à inscrire caractère par caractère dans la chaîne 'decryption'
      //'reception' sert d'intermède pour mettre l'entièreté de la valeur reçue dans 'decryption'
      reception = Serial.read();
      decryption += reception;
      i++;
      delay(100);
    }
    if (i>0) {
      //Serial.println(decryption); //UNIQUEMENT POUR LE DEBOGAGE PC
      XbeeSerial.print(decryption); //Envoi l'information reçue au récepteur XBee
      delay(1000);
      decryption = ""; //Remet à zéro la variable decryption
    }
//  }
}

BonCourage

Re, après avoir changer la fonction loopXbee() voici le résultat :


Calibrage du Capteur Volumetrique ..........START CONFIG
BAUD RATE : 9600
CHANNEL : 12
ID CHANNEL : 2014
MODULE ADRESS : 1
DESTINATION ADRESS : 2
AES KEY : ATKY26CF2FD6DE74D631A7ED434125997B3D
AES ENABLED
NO PARITY
MODULE NAME
WRITE CONFIGURATION
CLOSE NODE
BACK TO LOOP
1
 !! MOUVEMENT SUSPECT
Ready !
0
!! PLUS DE MOUVEMENT !!
Ready !
0
Ready !
1
 !! MOUVEMENT SUSPECT
Ready !
1
Ready !
1
Ready !
1
Ready !
1
Ready !
1
Ready !
0
!! PLUS DE MOUVEMENT !!


Le capteur à l'air de fonctionner mais un peut trop long à mon gout je vais changer de delay, mais un autre problème persiste encore, la deuxième carte ne reçoit toujours rien : /

Merci encore :)


pierrotm777


pierrotm777

A oui , je suppose que tu as une deuxième carte uno  avec un xbee en réception ?

BonCourage

Oui en effet j'ai retoucher le programme afin d'éviter les spam inutile de "Ready" tout marche à merveille désormais, seul problème c'est la réception de la deuxième carte sous xBee en effet :)

Merci encore :)

pierrotm777

As tu configuré les deux xbee pour qu'ils communiquent ensemble !
Ils remplacent une liaison série je suppose. Tu pourrais tester entre les deux arduinos sans les xbee.
Puis configurer les xbee (différents soft existent pour cela) et les ajouter à ton montage !


BonCourage

J'ai un shield mp3 implanté sur la deuxième depuis qu'il est installer je n'arrive plus à communiquer avec elle, c'est peut être la cause du problème non ?
Autrement oui les cartes ont était tester et la communication entre elle était fonctionnel jusqu'à l'arriver du shield mp3

Merci encore :)

Go Up