IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

Mixage de voies


Sujet :

C++/CLI

  1. #1
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre éprouvé Avatar de Ragmaxone
    Homme Profil pro
    Responsable systèmes de distribution
    Inscrit en
    Août 2007
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Pologne

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

    Informations forums :
    Inscription : Août 2007
    Messages : 441
    Points : 1 001
    Points
    1 001
    Par défaut
    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 :-)

  3. #3
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    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.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    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 )

  5. #5
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    et en algorithmie ça donne quoi ça ?

  6. #6
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 073
    Points
    28 073
    Par défaut
    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

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  8. #8
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    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°.

  9. #9
    Membre éprouvé Avatar de Ragmaxone
    Homme Profil pro
    Responsable systèmes de distribution
    Inscrit en
    Août 2007
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Pologne

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

    Informations forums :
    Inscription : Août 2007
    Messages : 441
    Points : 1 001
    Points
    1 001
    Par défaut
    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

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  11. #11
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    C'est bon, la réponse de sevy64 m'a permis de faire ce que je voulais.

    A titre d'infos:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [UML] Je ne vois pas où mettre la vue !
    Par le Daoud dans le forum MVC
    Réponses: 12
    Dernier message: 19/03/2006, 09h31
  2. Clé etrangere erreur 150 mais je vois pas l'erreur
    Par HurtMarley dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 03/05/2005, 16h57
  3. Je vois pas d'où vient mon erreur!! Aidez moi SVP
    Par liliboms dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 04/04/2005, 08h25
  4. Qui ne voi plus les images ou smiley du forum ?
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 30
    Dernier message: 13/09/2004, 13h36
  5. Mixage de Couleurs
    Par exxos dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 29/05/2002, 13h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo