Pages: [1]   Go Down
Author Topic: Aide Arduino et capteur ultrason SRF01(avec ou sans XBee)  (Read 1269 times)
0 Members and 1 Guest are viewing this topic.
Biel-Suisse
Offline Offline
Newbie
*
Karma: 1
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,

Etant nouveau sur le forum j'espère ne pas commettre d'erreur, n'hésitez pas à me corriger.

Mon projet est de récupérer la mesure de distance de mon capteur SRF01 sur le terminal XBee de X-CTU sur mon PC.

Matériel:
Carte Arduino 2560 R3
XBee Shield Arduino
2 modules XBee Pro S2 configurés avec le protocole ZBee
Shield XBee-USB
Capteur SRF01

J'arrive à envoyer un texte (HELLO) toute les seconde depuis la carte Arduino vers le terminal X-CTU donc je pense que la communication est bonne.

Pour le capteur, j ai utilisé un exemple de code qui permet d'afficher les données de distance sur un ecran lcd pris sur ce site:
http://www.robot-electronics.co.uk/htm/arduino_examples.htm#SRF01%20Ultrasonic%20Ranger

J'ai également trouver une documentation bien complète mais que j'ai un peu de mal à comprendre sur ce site:
http://www.robot-electronics.co.uk/htm/srf01tech.htm

Je l'ai modifié afin d'envoyer les données sur le terminal X-CTU via la commande Serial.print(...)

voilà mon code:
Code:
/******************************************************************
* Arduino example for SRF01 and LCD03.                            *
* Takes a range in CM and displayes it on the LCD03 screen        *
* Both the SRF01 and the LCD0 use their own software serial port  *
*                                                                 *
* By James Henderson, 2012                                        *
******************************************************************/

#include <SoftwareSerial.h>


#define SRF_TXRX         0x09                                       // Defines pin to be used as RX and TX for SRF01

#define SRF_ADDRESS      0x01                                       // Address of the SFR01
#define GETSOFT          0x5D                                       // Byte to tell SRF01 we wish to read software version
#define GETRANGE         0x54                                       // Byte used to get range from SRF01
#define GETSTATUS        0x5F                                       // Byte used to get the status of the transducer

SoftwareSerial srf01 = SoftwareSerial(SRF_TXRX, SRF_TXRX);      // Sets up software serial port for the SRF01

void setup(){ 
  srf01.begin(9600);                                     
 Serial.begin(9600);                                   
  srf01.listen();                                         // Make sure that the SRF01 software serial port is listening for data as only one software serial port can listen at a time
 
  delay(200);                                             // Waits some time to make sure everything is powered up
 
 
 Serial.print("SRF01 Example");                           
 
  byte softVer;
  SRF01_Cmd(SRF_ADDRESS, GETSOFT);                        // Request the SRF01 software version
  while (srf01.available() < 1);
    softVer = srf01.read();                               // Read software version from SRF01
 Serial.print("V:");                                     
 Serial.print(softVer,DEC);                               // Prints the software version to LCD03

}

void loop(){
  byte hByte, lByte, statusByte, b1, b2, b3;
 
  SRF01_Cmd(SRF_ADDRESS, GETRANGE);                       // Get the SRF01 to perform a ranging and send the data back to the arduino 
  while (srf01.available() < 2);
  hByte = srf01.read();                                   // Get high byte
  lByte = srf01.read();                                   // Get low byte
  int range = ((hByte<<8)+lByte);                         // Put them together

  Serial.print("Range = ");                               
  Serial.print(range, DEC);                                // Print range result to the screen
  Serial.print("  ");                                      // Print some spaces to the screen to make sure space direcly after the result is clear
 
  SRF01_Cmd(SRF_ADDRESS, GETSTATUS);                      // Request byte that will tell us if the transducer is locked or unlocked
  while (srf01.available() < 1);
    statusByte = srf01.read();                            // Reads the SRF01 status, The least significant bit tells us if it is locked or unlocked
  int newStatus = statusByte & 0x01;                      // Get status of lease significan bit
  if(newStatus == 0){                                     
    Serial.print("Unlocked");                              // Prints the word unlocked followd by a couple of spaces to make sure space after has nothing in
  }
   else {                                     
    Serial.print("Locked   ");                             // Prints the word locked followd by a couple of spaces to make sure that the space after has nothing in
  }

  delay(100);
}

void SRF01_Cmd(byte Address, byte cmd){               // Function to send commands to the SRF01
  pinMode(SRF_TXRX, OUTPUT);
  digitalWrite(SRF_TXRX, LOW);                        // Send a 2ms break to begin communications with the SRF01                         
  delay(2);                                               
  digitalWrite(SRF_TXRX, HIGH);                           
  delay(1);                                               
  srf01.write(Address);                               // Send the address of the SRF01
  srf01.write(cmd);                                   // Send commnd byte to SRF01
  pinMode(SRF_TXRX, INPUT);
  int availbleJunk = srf01.available();               // As RX and TX are the same pin it will have recieved the data we just sent out, as we dont want this we read it back and ignore it as junk before waiting for useful data to arrive
  for(int x = 0;  x < availbleJunk; x++) byte junk = srf01.read();
}


Le problème:
Rien ne s'affiche sur le X-CTU, de plus, les LED bleues sur le module XBee connecté au shield USB-XBee qui s'allument lors d'une réception de données ne s'allument pas.

Je sollicite donc votre aide afin de m'aider à trouver une solution.

Le projet globale est un dirigeable radio télécommandé qui saura changer sa trajectoire si il s'approche trop d'un mur.

Je souhaite envoyer la valeur numérique de la distance détectée sur le terminal X-CTU de mon PC afin de vérifier le bon fonctionnement du code.
Par la suite, je souhaite avoir une variable"x=distance" car je veux que la carte Arduino puisse par exemple stopper les moteurs si le dirigeable s'approche à 1 mètre d'un mur et qu'il puisse également inverser le sens des moteurs et accélérer si le dirigeable s'approche à 20cm d'un mur afin de reculer rapidement.

Si vous avez des questions je suis très disponible à répondre à vos demandes.

Merci d'avance

Salutations

Lionel

Logged

Bretagne
Offline Offline
Full Member
***
Karma: 2
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


SoftwareSerial srf01 = SoftwareSerial(SRF_TXRX, SRF_TXRX);     

même pin pour RX et TX ???

C'est possible???

Si oui, je l'apprends. Toujours bon à savoir!
Logged

...ils embarquèrent la logique, coupèrent les cordons, alors, libérés de leurs chaînes, une immensité s'ouvrait devant eux...

Biel-Suisse
Offline Offline
Newbie
*
Karma: 1
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


SoftwareSerial srf01 = SoftwareSerial(SRF_TXRX, SRF_TXRX);     

même pin pour RX et TX ???

C'est possible???

Si oui, je l'apprends. Toujours bon à savoir!

Si j ai bien compris c'est la même pin car le capteur utilise le protocole BUS I2C qui permet de passer des informations dans les deux sens, c'est justement ce que j'ai du mal à maitriser.
Logged

Bretagne
Offline Offline
Full Member
***
Karma: 2
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ou plutôt du genre bus série 1-wire smiley-wink
Logged

...ils embarquèrent la logique, coupèrent les cordons, alors, libérés de leurs chaînes, une immensité s'ouvrait devant eux...

Bretagne
Offline Offline
Full Member
***
Karma: 2
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Je testerais sans les Xbee et avec affichage sur le serial moniteur de l'IDE Arduino par le cable USB.
Pour évacuer un éventuel problème dû aux timings de la liaison RF, des Xbee,  interférant dans les timings du code pour le SFR01.
Afin de s'assurer que le code d'origine soit bon au moins pour le capteur.
Logged

...ils embarquèrent la logique, coupèrent les cordons, alors, libérés de leurs chaînes, une immensité s'ouvrait devant eux...

Biel-Suisse
Offline Offline
Newbie
*
Karma: 1
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok sa marche, je n'aurais accès au matériel que lundi mais je vais essayer.
Pour l'instant j'avais vu uniquement la communication avec l'hyperterminal de windows mais je vais me renseigner sur l'IDE Arduino et je tiendrais au courant du résultat.
Merci pour vos conseils
Logged

Pages: [1]   Go Up
Jump to: