Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Membre du Club Avatar de Caxton
    Homme Profil pro Alexandre
    Infographiste
    Inscrit en
    janvier 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre
    Âge : 36
    Localisation : France, Corrèze (Limousin)

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 479
    Points : 69
    Points
    69

    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.

  2. #2
    Membre chevronné Avatar de Ragmaxone
    Homme Profil pro Maxime Raguenet
    Responsable systèmes de distribution
    Inscrit en
    août 2007
    Messages
    432
    Détails du profil
    Informations personnelles :
    Nom : Homme Maxime Raguenet
    Âge : 29
    Localisation : Pologne

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

    Informations forums :
    Inscription : août 2007
    Messages : 432
    Points : 755
    Points
    755

    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 du Club Avatar de Caxton
    Homme Profil pro Alexandre
    Infographiste
    Inscrit en
    janvier 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre
    Âge : 36
    Localisation : France, Corrèze (Limousin)

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 479
    Points : 69
    Points
    69

    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 Confirmé Sénior
    Homme Profil pro Paul Bacelar
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul Bacelar
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : février 2005
    Messages : 2 861
    Points : 4 074
    Points
    4 074

    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 du Club Avatar de Caxton
    Homme Profil pro Alexandre
    Infographiste
    Inscrit en
    janvier 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre
    Âge : 36
    Localisation : France, Corrèze (Limousin)

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 479
    Points : 69
    Points
    69

    Par défaut

    et en algorithmie ça donne quoi ça ?

  6. #6
    Modérateur
    Avatar de sevyc64
    Homme Profil pro Yves
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    6 789
    Détails du profil
    Informations personnelles :
    Nom : Homme Yves
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 789
    Points : 16 144
    Points
    16 144

    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 Confirmé Sénior
    Homme Profil pro Paul Bacelar
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul Bacelar
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : février 2005
    Messages : 2 861
    Points : 4 074
    Points
    4 074

    Par défaut

    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.

  8. #8
    Membre du Club Avatar de Caxton
    Homme Profil pro Alexandre
    Infographiste
    Inscrit en
    janvier 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre
    Âge : 36
    Localisation : France, Corrèze (Limousin)

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 479
    Points : 69
    Points
    69

    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 chevronné Avatar de Ragmaxone
    Homme Profil pro Maxime Raguenet
    Responsable systèmes de distribution
    Inscrit en
    août 2007
    Messages
    432
    Détails du profil
    Informations personnelles :
    Nom : Homme Maxime Raguenet
    Âge : 29
    Localisation : Pologne

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

    Informations forums :
    Inscription : août 2007
    Messages : 432
    Points : 755
    Points
    755

    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 Confirmé Sénior
    Homme Profil pro Paul Bacelar
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul Bacelar
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : février 2005
    Messages : 2 861
    Points : 4 074
    Points
    4 074

    Par défaut

    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.

  11. #11
    Membre du Club Avatar de Caxton
    Homme Profil pro Alexandre
    Infographiste
    Inscrit en
    janvier 2005
    Messages
    479
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre
    Âge : 36
    Localisation : France, Corrèze (Limousin)

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 479
    Points : 69
    Points
    69

    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •