Vérification d'un code pour un projet

Fermé
Packaboum Messages postés 5 Date d'inscription dimanche 18 septembre 2011 Statut Membre Dernière intervention 18 février 2013 - 17 févr. 2013 à 19:07
Packaboum Messages postés 5 Date d'inscription dimanche 18 septembre 2011 Statut Membre Dernière intervention 18 février 2013 - 18 févr. 2013 à 21:36
Bonjour,

Je suis actuellement en Terminale S spécialité science de l'ingénieur, et dans le cadre de cette spécialité il nous est demandé de développer un projet pour l'épreuve de SI à la fin de l'année.
Nous avons repris le concept du Gant Tacit, un gant sonar pour malvoyant.
(Je vous renvoie sur le site du projet, si vous voulez en savoir plus : http://grathio.com/2011/08/meet-the-tacit-project-its-sonar-for-the-blind/ )

Nous avons repris le concept du projet et l'avons amélioré à notre façon. Sur le site du projet de base, le créateur donne son code C pour coder sa carte Arduino. Seulement, comme notre projet diffère pas mal du projet original, il nous est impossible d'utiliser ce code et même, cela n'aurait que peu d'intérêt de copier/coller sans chercher à comprendre.

C'est pourquoi je viens à vous : nous avons créé notre propre code C pour notre Arduino, mais comme c'est la première fois que nous faisons ça et que nos connaissances dans le domaine sont limitées, j'aurais aimé savoir si un connaisseur se sentait capable de nous donner un coup de main pour le code. Pas pour le (re)faire, non. Mais nous expliquer nos erreurs et nous indiquer la marche à suivre pour les corriger. Le mieux serait de faire ça en privé.

J'en appelle à vous, maîtres du C ! Contactez-moi par MP si quelqu'un se sent la force de nous aider.

Merci d'avance. ;)
A voir également:

2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
18 févr. 2013 à 06:34
Poste plutôt ton code ici dans tes balises code (à droite du bouton souligné) pour qu'on puisse t'aider.
0
Packaboum Messages postés 5 Date d'inscription dimanche 18 septembre 2011 Statut Membre Dernière intervention 18 février 2013
Modifié par Packaboum le 18/02/2013 à 20:29
Merci de votre réponse. ;)

Le truc c'est qu'il faudra que vous soyez vraiment patients parce que je risque d'avoir du mal à cerner certains points... =/

Je vais avant tout vous expliquer le fonctionnement précis de notre projet, vu qu'il diffère de l'original :

Nous avons trois capteurs à ultrasons (au lieu de deux) placés en avant du gant. A chaque capteur est associé un dispositif qui permet d'alerter de la présence ou non d'un objet et également de sa distance.
* Le capteur gauche est associé à un servomoteur placé sur la gauche du gant et sur lequel est fixé une bande de cuir (flexible) en bout de palonnier. Le but étant que la bande de cuir appuie sur la main plus ou moins fort en fonction de la distance de l'objet détecté. Pour ce faire, nous avons défini 5 paliers de distance et associé à chacun un angle de rotation pour le servo. Par exemple : si l'objet est entre 70 et 55 cm, le palonnier pivote de 15°, etc...
* Même principe pour le capteur de droite.
* Le capteur central est associé à un vibreur placé au centre du gant (sommet du poignet) mais le principe reste le même : différents paliers de distance pour différentes forces de vibration.

D'autres améliorations ont été apportées sur le projet, mais tout est géré électriquement et ça n'intervient pas dans le code.

Au départ, l'ami d'un des membres du groupe s'est proposé pour réaliser le code dans les grandes lignes. Une fois qu'il nous l'a donné, je me suis empressé de le terminer en remplaçant par les vraies valeurs des paliers, etc... De plus, il n'avait fait que le cas des servomoteurs. J'ai alors fait ce que j'ai pu pour le vibreur mais je dois bien avouer que je ne suis pas certain de mon résultat...
Voilà donc le code (un peu long, mais il se répète beaucoup) :

#include <Servo.h> 

/* Déclaration servomoteurs */ 

Servo servo_g; 
Servo servo_d; 

/* Déclaration broches et forces nulles */ 

#define SPEED 3; 
int speed = 0; 

const byte sig_g = 7; 
const byte sig_d = 8; 
byte pression_g = 0; 
byte pression_d = 0; 
int angle = 0; 

/* Initialisation */ 

void setup() 
{ 
   pinMode(sig_g, OUTPUT); 
   pinMode(sig_d, OUTPUT); 
   servo_g.attach(5); 
   servo_g.write(angle); 
   servo_d.attach(6);   
   servo_d.write(angle); 

   pinMode(SPEED, OUTPUT); 
   analog.Write(SPEED, speed) 
} 

/* Boucle du programme */ 

void loop() 
{ 
   long duree_g, cm_g, duree_g, cm_d, duree_c, cm_c; 

   digitalWrite(sig_g, LOW); 
   delayMicroseconds(2); 
   digitalWrite(sig_g, HIGH); 
   delayMicroseconds(5); 
   digitalWrite(sig_g, LOW); 
   pinMode(sig_g, INPUT); 
   duree_g = pulseIn(sig_g, HIGH); 
   cm_g = microsecondsToCentimeters(duree_g); 
   delay(100); 

   digitalWrite(sig_d, LOW); 
   delayMicroseconds(2); 
   digitalWrite(sig_d, HIGH); 
   delayMicroseconds(6); 
   digitalWrite(sig_d, LOW); 
   pinMode(sig_d, INPUT); 
   duree_g = pulseIn(sig_d, HIGH); 
   cm_d = microsecondsToCentimeters(duree_g); 
   delay(100); 

/* Capteur de distance gauche */ 

   if(cm_g > 70) 
   { 
       pression_g = 0; 
   } 

   if(cm_g > 55 && cm_g <= 70) 
   { 
       pression_g = 1; 
   } 

   if(cm_g > 40 && cm_g <= 55) 
   { 
       pression_g = 2; 
   } 

   if(cm_g > 25 && cm_g <= 40) 
   { 
       pression_g = 3; 
   } 

   if(cm_g > 0 && cm_g <= 25) 
   { 
       pression_g = 4 
   } 
   delay(10); 

/* Commande du servomoteur gauche */ 

   if(pression_g = 0) 
   { 
       servo_g.write(angle); 
       delay(200); 
   } 

   if(pression_g = 1) 
   { 
       servo_g.write(15); 
       delay(200); 
   } 

   if(pression_g = 2) 
   { 
       servo_g.write(30); 
       delay(200); 
   } 

   if(pression_g = 3) 
   { 
       servo_g.write(45); 
       delay(200); 
   } 

   if(pression_g = 4) 
   { 
       servo_g.write(60); 
       delay(200); 
   } 

/* Capteur de distance droit */ 

 if(cm_d > 70) 
   { 
       pression_d = 0; 
   } 

   if(cm_d > 55 && cm_d <= 70) 
   { 
       pression_d = 1; 
   } 

   if(cm_d > 40 && cm_d <= 55) 
   { 
       pression_d = 2; 
   } 

   if(cm_d > 25 && cm_d <= 40) 
   { 
       pression_d = 3; 
   } 

   if(cm_d > 0 && cm_d <= 25) 
   { 
       pression_d = 4 
   } 
   delay(10); 

/* Commande du servomoteur droit */ 

   if(pression_d = 0) 
   { 
       servo_d.write(angle); 
       delay(200); 
   } 

   if(pression_d = 1) 
   { 
       servo_d.write(15); 
       delay(200); 
   } 

   if(pression_d = 2) 
   { 
       servo_d.write(30); 
       delay(200); 
   } 

   if(pression_d = 3) 
   { 
       servo_d.write(45); 
       delay(200); 
   } 

   if(pression_d = 4) 
   { 
       servo_d.write(60); 
       delay(200); 
   } 

/* Capteur de distance central */ 

   if(cm_c > 70) 
   { 
       vib = 0; 
   } 

   if(cm_c > 40 && cm_c <= 70) 
   { 
       vib = 1; 
   } 

   if(cm_c > 20 && cm_c <= 40) 
   { 
       vib = 2; 
   } 

   if(cm_c >= 0 && cm_c <= 20) 
   { 
       vib = 3; 
   } 
   delay(10); 

/* Commande du vibreur */ 

   if(vib = 0); 
   { 
       speed = 0; 
       analog.Write(SPEED, speed)     
   } 

   if(vib = 1) 
   { 
       speed = 85; 
       analog.Write(SPEED, speed)    
   } 

   if(vib = 2) 
   { 
       speed = 170; 
       analog.Write(SPEED, speed)      
   } 

   if(vib = 3) 
   { 
       speed = 255; 
       analog.Write(SPEED, speed)    
   } 
   delay(10); 

} 

/* Fin boucle programme */ 

long microsecondToCentimeters(long microseconds) 
{ 
   return microseconds / 29 / 2; 
}


Je pense que c'est assez clair, mais les variables se terminant par _g, _d ou _c sont pour gauche, droite et central.

Certains passages (dont je ne suis pas l'auteur) me semblent obscurs comme :

    
   digitalWrite(sig_g, LOW); 
   delayMicroseconds(2); 
   digitalWrite(sig_g, HIGH); 
   delayMicroseconds(5); 
   digitalWrite(sig_g, LOW); 
   pinMode(sig_g, INPUT); 


Pourquoi mettre la patte en niveau bas, puis haut, puis bas ? Est-ce une manière de tester la broche ou autre ?

Autre passage :

long microsecondToCentimeters(long microseconds) 
{ 
   return microseconds / 29 / 2; 
}


Il s'agit là de convertir le temps en distance ? Je comprends la division par 2, mais pourquoi celle par 29 ? Et pourquoi est-ce à la toute fin du code ?

Bref, j'aurais besoin de beaucoup d'éclaircissements...
Merci d'avance pour votre aide. ;)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
18 févr. 2013 à 20:55
Pour être sincère, j'ai rien lu, je me suis contenté de lire très rapidement le code pour repérer quelques erreurs :
#define SPEED 3;
Pas de ; à mettre après la directive préprocesseur

if(pression_g = 0)
L'opérateur de comparaison est == pas =..

Pourquoi mettre la patte en niveau bas, puis haut, puis bas ? Est-ce une manière de tester la broche ou autre ?
Probablement.

Il s'agit là de convertir le temps en distance ? Je comprends la division par 2, mais pourquoi celle par 29 ? Et pourquoi est-ce à la toute fin du code ?
Le nom de la fonction est microsecondToCentimeters donc le but est de convertir des microsecondes en centimètres. En paramètre de la fonction, tu mets le nombre de pulsation ( duree_g = pulseIn(sig_g, HIGH); cm_g = microsecondsToCentimeters(duree_g);). 29/2 est donc le coefficient pour transformer le nombre de pulsation en centimètres.
0
Packaboum Messages postés 5 Date d'inscription dimanche 18 septembre 2011 Statut Membre Dernière intervention 18 février 2013
18 févr. 2013 à 21:12
Merci de votre réponse.

Je vais m'empresser de corriger ça (surtout le ==, comment j'ai pu ne pas m'en rendre compte... ?!).

Autrement, vous sauriez me dire si le code pour commander le vibreur est correct (en dehors des fautes de syntaxe) ? J'ai trouvé les fonctions de commande pour moteurs sur un site apparemment amateur, et j'ai rien trouvé ailleurs...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
18 févr. 2013 à 21:30
Ben, je sais pas trop, cela dépend du moteur. Ce n'est pas propre au C.
0
Packaboum Messages postés 5 Date d'inscription dimanche 18 septembre 2011 Statut Membre Dernière intervention 18 février 2013
18 févr. 2013 à 21:36
D'accord, merci. Je vais essayer de corriger ce qu'il reste à changer sur mon code (d'autres erreurs que je n'avais pas vues...). Puis lorsqu'on aura la possibilité, on testera des petites portions de code pour moteur sur notre vibreur.

Merci de votre aide.
0