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
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
A voir également:
- Vérification d'un code pour un projet
- Code asci - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Comment créer un qr code - Guide
- Code activation windows 10 - Guide
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
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.
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
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) :
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 :
Pourquoi mettre la patte en niveau bas, puis haut, puis bas ? Est-ce une manière de tester la broche ou autre ?
Autre passage :
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. ;)
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. ;)
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
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.
#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.
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
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...
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...
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
18 févr. 2013 à 21:30
Ben, je sais pas trop, cela dépend du moteur. Ce n'est pas propre au C.
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
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.
Merci de votre aide.