Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > Visual C++ > C++/CLI
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/10/2012, 15h56   #1
Caxton
Membre du Club
 
Avatar de Caxton
 
Homme Alexandre
Infographiste
Inscription : janvier 2005
Messages : 390
Détails du profil
Informations personnelles :
Nom : Homme Alexandre
Âge : 35
Localisation : France, Corrèze (Limousin)

Informations professionnelles :
Activité : Infographiste
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2005
Messages : 390
Points : 67
Points : 67
Par défaut Mixage de voies

Bonjour,

Je sèche un peu sur la trigonométrie. Enfin bref, je ne suis pas là pour raconter "my life" !

Il se trouve que j'aimerais piloter un char avec un seul manche de radio. J'ai construit la radio, elle fonctionne.

Je viens d'essayer un peu de trigonométrie avec un peu d'aide mais les résultats ne sont pas correct. Je ne peux prendre que des valeurs de 0 à 180 avec un neutre à 90. Ceci étant des degrés. Il en va de soi que les valeurs négatives que me retourne mon code ne sont pas compatible avec les valeurs requise pour le fonctionnement.

Mettons un manche, axe X pour la vitesse et y pour la direction.
-Sa position au neutre renvera sur Voie1 = VoieX = 90 et Voie2 = VoieY = 90.

-Si je pousse en avant, donc, sur la voie des X, j'aurais VoieX = 0 et VoieY = 90.
-Si je pousse en arrière, donc, sur la voie des x, j'aurais VoieX = 180 et voieY = 90.

-Si je pousse sur la droite, donc, sur la voie des y, j'aurais VoieY = 0 et VoieX = 90.
-Si je pousse sur la gauche, donc, sur la voie des y, j'aurais VoieY = 180 et VoieY = 0.

En sortie, chaque voies, donc, Voie1 et Voie2 sont l'équivalent de ce que feront les deux moteurs. Moteur Gauche = Voie1 et Moteur Droit = Voie2.

A ce moment là, j'aimerais obtenir ceci en valeurs proportionnelles.
Si je pousse le manche en avant : Voie1 = 0 et Voie2 = 0.
Si je met au neutre : Voie1 = 90 et voie2 = 90.
Si je pousse en arrière : Voie1 = 180 et Voie2 = 180.
Si je pousse sur la droite : Voie1 = 0 et Voie2 = 180.
Si je pousse sur la gauche : Voie1 = 180 et Voie2 = 0.

Pour le moment, mon code d'essai ressemble à ceci:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
/* LOOP */
void loop() {
 
  //Lire la position des manches
  tensionVoie1 = analogRead(potarVoie1);
  tensionVoie2 = analogRead(potarVoie2);
  tensionVoie3 = analogRead(potarVoie3);
  tensionVoie4 = analogRead(potarVoie4);
 
  //Transformation de la tension en valeur digitale
  voie1 = map(tensionVoie1, 0, 1023, 0, 180);
  voie2 = map(tensionVoie2, 0, 1023, 0, 180);
  voie3 = map(tensionVoie3, 0, 1023, 0, 180);
  voie4 = map(tensionVoie4, 0, 1023, 0, 180);
 
  //Mixage voie 1 et voie 2
  //x=cos(voie1)sin(voie2) et y=sin(voie2)
 
  int cosVoie1 = cos(voie1) * 100;
  int sinVoie2 = sin(voie2) * 100;
  voie1 = (cosVoie1 * sinVoie2) / 100;
  voie2 = sinVoie2;
 
  //Lire la position des boutons
 
  //Si le bouton de la voie 5 est en haut
  if(digitalRead(btnVoie5Up) == HIGH) {
    //La valeur digitale sera de 0  
    voie5 = 0;
  }
 
  //Si le bouton de la voie 5 est en bas
  if(digitalRead(btnVoie5Do) == HIGH) {
    //La valeur digitale sera de 180  
    voie5 = 180;
  }
 
  //Si le bouton 5 est au centre
  if(digitalRead(btnVoie5Up) == LOW && digitalRead(btnVoie5Do) == LOW) {
    //La valeur digitale sera de 90  
    voie5 = 90;
  }
 
  //Si le bouton de la voie 6 est en haut
  if(digitalRead(btnVoie6Up) == HIGH) {
    //La valeur digitale sera de 0  
    voie6 = 0;
  }
 
  //Si le bouton de la voie 6 est en bas
  if(digitalRead(btnVoie6Do) == HIGH) {
    //La valeur digitale sera de 180  
    voie6 = 180;
  }
 
  //Si le bouton 6 est au centre
  if(digitalRead(btnVoie6Up) == LOW && digitalRead(btnVoie6Do) == LOW) {
    //La valeur digitale sera de 90  
    voie6 = 90;
  }
 
  //Initialiser la trame
  trame = "";
 
  //Crée la trame
  trame += voie1;  //Voie 1
  trame += ",";  //Séparateur
  trame += voie2;  //Voie 2
  trame += ",";  //Séparateur
  trame += voie3;  //Voie 3
  trame += ",";  //Séparateur
  trame += voie4;  //Voie 4
  trame += ",";  //Séparateur
  trame += voie5;  //Voie 5
  trame += ",";  //Séparateur
  trame += voie6;  //Voie 6
 
  //Transmission de la trame sur le récepteur
  Serial1.print(trame);
 
  //Ecrire à l'écran des infos
  ecrireLcd(trame, 01);  //Ecrire
 
  //Pause 90ms
  delay(90);
 
  //Effacer l'écran
  clearLcd();  //Effacer l'écran
}
Voila, je m'en remet à vous car je sèche un peu.

Pour vous aider à la compréhension théorique du problème, je peux vous demander de jeter un oeil sur ce plan :
http://i.stack.imgur.com/6SDXJ.jpg

Merci pour votre aide.
__________________
Mon site
Caxton est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 16h11   #2
Ragmaxone
Membre émérite
 
Avatar de Ragmaxone
 
Homme Maxime Raguenet
Responsable systèmes de distribution
Inscription : août 2007
Messages : 423
Détails du profil
Informations personnelles :
Nom : Homme Maxime Raguenet
Âge : 27
Localisation : Pologne

Informations professionnelles :
Activité : Responsable systèmes de distribution

Informations forums :
Inscription : août 2007
Messages : 423
Points : 867
Points : 867
J'avais pas compris que c'était pour un char
Là t'as déjà les coordonnées cartésiennes du vecteur direction à prendre, reste à traduire ça en chenilles :-)
Ragmaxone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 16h26   #3
Caxton
Membre du Club
 
Avatar de Caxton
 
Homme Alexandre
Infographiste
Inscription : janvier 2005
Messages : 390
Détails du profil
Informations personnelles :
Nom : Homme Alexandre
Âge : 35
Localisation : France, Corrèze (Limousin)

Informations professionnelles :
Activité : Infographiste
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2005
Messages : 390
Points : 67
Points : 67
Ah ! Zut !

Bon, j'ai bien fait d'en parler ici alors

Par auto-dérision, déjà, j'ai avancé puisque je sait que ce n'est pas les bonnes valeurs à retourné

Mais ce n'est pas pour autant que mon char avance

Une idée pour contourné le problème ?

Merci.
__________________
Mon site
Caxton est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 16h39   #4
bacelar
Expert Confirmé Sénior
 
Homme Paul Bacelar
Développeur informatique
Inscription : février 2005
Messages : 2 651
Détails du profil
Informations personnelles :
Nom : Homme Paul Bacelar
Âge : 41
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Conseil

Informations forums :
Inscription : février 2005
Messages : 2 651
Points : 4 044
Points : 4 044
Le vocabulaire chenille c'est :
- je vais devant à fond
- je vais devant à un peu moins à fond
...
- je vais devant doucement
- je stop
- je vais en arrière doucement
...
- je vais en arrière à fond

C'est tout.

Pour tourner, il faut dire des choses différentes à chaque chenille.

(un peu comme les hommes politiques )
bacelar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 16h51   #5
Caxton
Membre du Club
 
Avatar de Caxton
 
Homme Alexandre
Infographiste
Inscription : janvier 2005
Messages : 390
Détails du profil
Informations personnelles :
Nom : Homme Alexandre
Âge : 35
Localisation : France, Corrèze (Limousin)

Informations professionnelles :
Activité : Infographiste
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2005
Messages : 390
Points : 67
Points : 67
et en algorithmie ça donne quoi ça ?
__________________
Mon site
Caxton est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 17h02   #6
sevyc64
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 5 280
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 40
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 5 280
Points : 11 956
Points : 11 956
Si je m'en tiens à ton énoncé (ou il y a d’ailleurs une erreur lorsque tu pousse à gauche), je peux en déduire que la valeur de tes voies est déduite à partir d'une valeur de base directement proportionnelle à X et corrigée par Y

Voir les équations suivantes :

Voie 1 = X + (y-90)
Voie 2 = X - (y-90)


Après pourquoi introduire des sin et cos, j'ai pas compris (pas trop approfondi non plus)
__________________
--- Sevyc64 ---

Parce que le partage est notre force, la connaissance sera notre victoire
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 17h05   #7
bacelar
Expert Confirmé Sénior
 
Homme Paul Bacelar
Développeur informatique
Inscription : février 2005
Messages : 2 651
Détails du profil
Informations personnelles :
Nom : Homme Paul Bacelar
Âge : 41
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Conseil

Informations forums :
Inscription : février 2005
Messages : 2 651
Points : 4 044
Points : 4 044
Code :
et en algorithmie ça donne quoi ça ?
Une table table de transcodage
Direction => puissance à mettre sur chaque chenille.
La table est donc fonction du nombre et de la position de chaque chenille sur le châssis.

Vous ne devez pas mapper directement un composant de la direction avec la puissance.

Pour tourner sur place avec un char à 2 chenilles symétriques, c'est à fond avant pour une chenille et à fond arrière pour l'autre.
bacelar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 17h15   #8
Caxton
Membre du Club
 
Avatar de Caxton
 
Homme Alexandre
Infographiste
Inscription : janvier 2005
Messages : 390
Détails du profil
Informations personnelles :
Nom : Homme Alexandre
Âge : 35
Localisation : France, Corrèze (Limousin)

Informations professionnelles :
Activité : Infographiste
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2005
Messages : 390
Points : 67
Points : 67
Oui mais je tiens à ce que ça reste proportionnel. Il n'y aura pas que le char qui sera piloter ainsi.

Un sous-marin, deux moteurs, un de chaque côté ! On a la même mais ça demande plus de souplesse. C'est ce que m'apporte la radio avec ses angles de 0 à 180°.
__________________
Mon site
Caxton est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 17h53   #9
Ragmaxone
Membre émérite
 
Avatar de Ragmaxone
 
Homme Maxime Raguenet
Responsable systèmes de distribution
Inscription : août 2007
Messages : 423
Détails du profil
Informations personnelles :
Nom : Homme Maxime Raguenet
Âge : 27
Localisation : Pologne

Informations professionnelles :
Activité : Responsable systèmes de distribution

Informations forums :
Inscription : août 2007
Messages : 423
Points : 867
Points : 867
donc après avoir TOUTES les données du problème, t'as pas besoin de passer par des angles, ni des coordonnées sphériques et tout le tintouin
Ragmaxone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 19h19   #10
bacelar
Expert Confirmé Sénior
 
Homme Paul Bacelar
Développeur informatique
Inscription : février 2005
Messages : 2 651
Détails du profil
Informations personnelles :
Nom : Homme Paul Bacelar
Âge : 41
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Conseil

Informations forums :
Inscription : février 2005
Messages : 2 651
Points : 4 044
Points : 4 044
Code :
Oui mais je tiens à ce que ça reste proportionnel
Proportionnel à quoi ?
Pour allez 2 fois plus vite, il faut pas juste faire X2 sur la puissance moteur ( la puissance moteur est couplé à l'accélération) il faut faire une intégrale de l'accélération pour avoir la vitesse.

Moralité, on ne conduit pas un char comme un sous-marin.
bacelar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 20h08   #11
Caxton
Membre du Club
 
Avatar de Caxton
 
Homme Alexandre
Infographiste
Inscription : janvier 2005
Messages : 390
Détails du profil
Informations personnelles :
Nom : Homme Alexandre
Âge : 35
Localisation : France, Corrèze (Limousin)

Informations professionnelles :
Activité : Infographiste
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2005
Messages : 390
Points : 67
Points : 67
C'est bon, la réponse de sevy64 m'a permis de faire ce que je voulais.

A titre d'infos:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
/* LOOP */
void loop() {
 
  //Lire la position des manches
  tensionVoie1 = analogRead(potarVoie1);
  tensionVoie2 = analogRead(potarVoie2);
  tensionVoie3 = analogRead(potarVoie3);
  tensionVoie4 = analogRead(potarVoie4);
 
  //Transformation de la tension en valeur digitale
  voie1 = map(tensionVoie1, 0, 1023, 0, 180);
  voie2 = map(tensionVoie2, 0, 1023, 0, 180);
  voie3 = map(tensionVoie3, 0, 1023, 0, 180);
  voie4 = map(tensionVoie4, 0, 1023, 0, 180);
 
  if(Mix_V1V2) {
    //Mixage voie 1 et voie 2
    mixVoie1 = abs(voie1 - (voie2-90)); 
    mixVoie2 = abs(voie1 + (voie2-90));
 
    //Réécrire les voies avec le mixage
    voie1 = mixVoie1;
    voie2 = mixVoie2;
  }
....
}
Le Mix_V1V2 est un booleaun permettant de switcher le mixage ou non. A terme, dans la programmation on pourra changer en fonction du modèle. Ceci m'obligera à écrire sur une carte mémoire.
__________________
Mon site
Caxton est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h05.


 
 
 
 
Partenaires

Hébergement Web