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

Arduino Discussion :

Appairage de 2 moteurs Brushless sur radio commande modélisme


Sujet :

Arduino

  1. #121
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 460
    Par défaut
    Comme je n'ai pas accès à mon atelier, je vais quand même pouvoir faire quelques tests avec une uno REV3 et 2 fils de connexion.
    Je vais mesurer les signaux au sortir des pins pilotés par leur servo et afficher sur le moniteur ce que ça donne !
    Avec quelques commandes via le clavier...

    En partant des éléments de code suivants :
    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
     
    #include <Servo.h>
     
    Servo MoteurG;
    Servo MoteurD;
     
    void setup() 
    	{
    	Serial.begin(57600);
     
    	MoteurG.attach(5, 500, 2500);
      	MoteurG.write(0);
     
    	MoteurD.attach(6, 500, 2500);
    	MoteurD.write(0);
    	//...
    	}
     
    volatile byte b;
     
    void loop() 
    	{
    	if(Serial.available())
        		{
    		b = Serial.read();
    		switch(b)
    			{
    			// bla bla ...
    			}
    		}
    	}
    En rajoutant l'interruption (INTO et INT1) sur les pins A0 et A1 pour mesurer ce qui sort sur 5 et 6 (d'où mes deux fils)
    Je testerai en même temps la méthode writeMicroseconds de la classe Servo...
    C'est juste pour évaluer si on sera bien dans les clous !
    Par contre ... j'ai un tas de trucs à faire ... donc un peu de patience !

    Voila !

  2. #122
    Membre habitué
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2022
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 86
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2022
    Messages : 62
    Par défaut
    Salut,
    Par contre ... j'ai un tas de trucs à faire ... donc un peu de patience !
    Je suis un peu dans ce cas, je suis très pris par ce PWM !! mais aussi les choses s'entassent et en plus j'ai un collègue qui a tombé son poste de soudure Gys et il ne fonctionne plus, Là aussi il y a du PWM !!!!! c'est la commande d'intensité je vais tenter de le dépanner mais !!!???
    Merci et à plus

  3. #123
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 735
    Par défaut
    Salut,

    Essayons avec une plage de vitesse plus réduite [150,1500] rpm par exemple. (lignes 8 et 9), et une option de configuration à la ligne 6 (faire un test avec FAILLING et un autre en remplaçant FAILLING par RISING).

    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
     
    //scaled analog tachometer, for illustrative purposes only.
     
    //config
    const unsigned interrupt_pin= 2; // <=> optical sensor, set the detection mode below
    const unsigned interrupt_mode= FALLING; // FALLING (high to low) or RISING (low to high)
    const unsigned analog_pin= 9; // <=> V_out
    const unsigned rpm_min= 150;
    const unsigned rpm_max= 1500;
    const unsigned long ticks_per_revolution= 2;
    const unsigned onboard_DAC_bits_resolution= 8; // i.e. n-bits onboard digital to analog converter
     
    //computed constants
    const unsigned analog_write_bits_resolution= onboard_DAC_bits_resolution;
    const unsigned analog_write_max= (1<<analog_write_bits_resolution)-1;
    const unsigned long micros_per_minute= 60000000;
    const unsigned long micros_per_minute_per_tick= micros_per_minute / ticks_per_revolution;
     
    inline unsigned clamp(unsigned n, unsigned min, unsigned max)
    {
        n= n<min ? min : n;
        n= n>max ? max : n;
        return n;
    }
     
    void on_tick_event()
    {
        static unsigned long current_time;
        static unsigned long previous_time;
        static unsigned long elapsed_time;
     
        current_time= micros();
        elapsed_time= current_time - previous_time;
        unsigned rpm_real= micros_per_minute_per_tick/elapsed_time;
        unsigned rpm_clamped= clamp(rpm_real, rpm_min, rpm_max);
        unsigned integral_analog= ((rpm_clamped - rpm_min) * analog_write_max) / (rpm_max - rpm_min);
        analogWrite(analog_pin, integral_analog); // -> V_out
        previous_time= current_time;
    }
     
    void setup() {
        pinMode(interrupt_pin, INPUT_PULLUP);
        pinMode(analog_pin, OUTPUT);
        //analogWriteResolution(analog_write_bits_resolution);
        attachInterrupt(digitalPinToInterrupt(interrupt_pin), on_tick_event, interrupt_mode);
    }
     
    void loop() {
    }
    EDIT:

    @guesset, ta mécompréhension vient peut-être du fait que tu crois que le signal servo est un signal pwm, mais il n'en est rien, c'est juste que c'est commode d'encoder un signal servo dans un signal pwm. Il semble que l'origine vienne du format ppm (pulse position modulation), où, dans une trame de 20ms étaient encodés jusqu'à 8 canaux de 2ms max, plus les entête et fin, quelque chose comme ça.

  4. #124
    Membre habitué
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2022
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 86
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2022
    Messages : 62
    Par défaut
    Salut,
    Voilà le résultat, quelques dixièmes de volt, quand ça veut pas ! ça veut pas !!!
    Nom : Photo ecran scope 20251111_113253.jpg
Affichages : 121
Taille : 19,8 Ko
    Merci

  5. #125
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 711
    Par défaut
    Bonjour kaitlyn,

    Citation Envoyé par kaitlyn Voir le message
    ...@guesset, ta mécompréhension vient peut-être du fait que tu crois que le signal servo est un signal pwm, mais il n'en est rien, c'est juste que c'est commode d'encoder un signal servo dans un signal pwm. Il semble que l'origine vienne du format ppm (pulse position modulation), où, dans une trame de 20ms étaient encodés jusqu'à 8 canaux de 2ms max, plus les entête et fin, quelque chose comme ça.
    Ma "mécompréhension" (incompréhension en français ?) est que le signal constaté par Positron est du PWM (voir le message #1). Greffer dessus du Servo qui ne serait pas basé sur du PWM serait du hors sujet. À titre indicatif, le PWM ne peut servir de support direct à la PPM qui nécessite un post traitement.

    Salut
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  6. #126
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 711
    Par défaut
    Bonjour Positron,

    Citation Envoyé par Positron 2 Voir le message
    Voilà le résultat, quelques dixièmes de volt, quand ça veut pas ! ça veut pas !!!...
    Sauf erreur, tu as doublé la vitesse par rapport au précédent oscillogramme, 250 Hz vs 125 Hz. J'ai l'impression que les pics sortants sont plus larges sans être sûr qu'ils atteignent les 0.2ms/2ms double des 0.1ms/2ms.

    Si tu pouvais encore doubler...

    Salut
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  7. #127
    Membre habitué
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2022
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 86
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2022
    Messages : 62
    Par défaut
    Re,
    Si tu pouvais encore doubler...
    Il suffit de demander ! et ça m'a permis de voir plusieurs bizarreries
    1 Le signal du bas le moteur à l'arrêt
    2 le signal change
    Nom : Bizarrerie_20251111_151134.jpg
Affichages : 113
Taille : 918,8 Ko
    Nom : Signal a 1 ms_20251111_110405.jpg
Affichages : 114
Taille : 903,7 Ko
    Nom : Signal moteur arreté_20251111_151248.jpg
Affichages : 113
Taille : 859,0 Ko
    Purée ! comment virer ces photos de travers ! ?
    Images attachées Images attachées    

  8. #128
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 735
    Par défaut
    Salut,

    Sur uno, la fréquence par défaut du signal pwm en sortie du port 9 est de 490.2 Hz
    Avec un bon voltmètre, ce sera plus simple.

    Citation Envoyé par Guesset Voir le message
    À titre indicatif, le PWM ne peut servir de support direct à la PPM qui nécessite un post traitement.
    Personne n'a dit ça.

  9. #129
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 711
    Par défaut
    Bonjour Positron,

    Citation Envoyé par Positron 2 Voir le message
    Il suffit de demander ! et ça m'a permis de voir plusieurs bizarreries
    1 Le signal du bas le moteur à l'arrêt
    2 le signal change
    ... Purée ! comment virer ces photos de travers ! ?
    Apparemment ça marche, même s'il y a un effet retard :
    • la période n'est connue qu'après qu'elle soit terminée.
    • la sortie doit être recalculée.
    • le délais d'actualisation de la sortie n'est pas nul.
    • si l'oscilloscope est en mode alterné (mais le créneau ondulé en haut peut aussi s'interpréter comme mode découpé - chopped), les traces ne sont comparables que si elles ne varient pas ou lentement


    Les autres images semblent répondre à la question sur le risque d'absence d'impulsion. Au minimum comme au maximum, il y a toujours une impulsion, certainement pour éviter que le régulateur se croit hors liaison.

    Je ne maîtrise pas très bien l'insertion de photos (j'essaie d'avoir une résolution correcte et une taille raisonnable, mais c'est assez raté). Cependant, pour charger une image, il suffit de cliquer sur l'icône, choisir le fichier puis l'inclure sans passer par le gestionnaire de pièces jointes. Au préalable, il faut placer le curseur au lieu d'insertion. Si tu supprimes le lien à l'image sans la supprimer du gestionnaire de pièces jointes, bizarrement, elle reste visible en fin d'écran (un peu comme les tiennes).

    Salut
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  10. #130
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 460
    Par défaut
    Dans un premier temps, il y a quelque chose qui serait intéressant à connaître, en sortie du récepteur :
    - la période du signal pour GAZ et DIR
    - les min, neutre et max pour GAZ et surtout pour DIR.

    On peut faire ces mesures avec un arduino en obtenant des résultats affichés en µs sur le serial monitor à condition de fixer la vitesse sur 57600 baud avec le petit programme dont je fourni le code.
    L'idée est de laisser l'arduino engranger les valeurs au fur et a mesure que l'on manipule les commandes sur l'émetteur pour un canal.
    La broche pour la capture sur l'arduino UNO est PD2 donc sur INT0 en s'assurant que la tension de sortie du récepteur est en adéquation avec l'entrée de l'arduino !!!

    Si on envoie 'r' le programme efface tout et commence la saisie tant que ...
    Si on envoie 's' le programme s'arrête de saisir et affiche les dernières valeurs qui auront été enregistrées.
    Si on envoie '?' quelque soit l'état , affiche "Ready !", et ne fait rien de plus !
    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
     
    #define InputPin PD2 // aka INT0
     
    class jSignal
    {
      public :
      unsigned long period_start;
      unsigned long period_time;
      unsigned long pulse_start;
      unsigned long pulse_time;
    };
     
    volatile jSignal Signal;
    volatile unsigned int time;
    volatile char b;
    volatile unsigned long period;
    volatile unsigned long min_value;
    volatile unsigned long value;
    volatile unsigned long max_value;
    volatile bool run = false;
     
    char buff[16];
    char cPer[16];
    char cMin[16];
    char cVal[16];
    char cMax[16];
    //-------------------- INT0
    void ReadSignal()
    {
      time = micros();
      if(digitalRead(InputPin) == 1)
        {
          Signal.period_time = time - Signal.period_start;
          Signal.period_start = time;
          Signal.pulse_start = time;
        }
      else
        {
          Signal.pulse_time = time - Signal.pulse_start;
        }
      if(run)
        {
          period = Signal.period_time;
          if(Signal.pulse_time < min_value) min_value = Signal.pulse_time;
          if(Signal.pulse_time > max_value) max_value = Signal.pulse_time;
          value = Signal.pulse_time;
        }
    }
    //---------------------------------
    void ToStringAndPrint(char *str, int *val)
    {
    str[6] = 0;
    sprintf(buff, "%d", val);
    strcat(str, buff);
    Serial.print(str);
    Serial.print("\n");
    }
    //---------------------------------
    void setup() 
      {
     
      pinMode(InputPin, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(InputPin),ReadSignal, CHANGE);
     
      strcpy(cPer, "PER = ");
      strcpy(cMin, "MIN = ");
      strcpy(cVal, "VAL = ");
      strcpy(cMax, "MAX = ");
     
      Serial.begin(57600);
      delay(200);
     
    }
     
    void loop() 
    {
     
    if(Serial.available())
        {
        b = Serial.read();
        switch(b)
          {
          case '?' :
          Serial.print("Ready !\n");
          break;
     
          case 'r' :
          // CLEAR AND RUN
          period = 0;
          min_value = 20000;
          value = 0;
          max_value = 0;
          ToStringAndPrint(cPer, period); 
          ToStringAndPrint(cMin,min_value);
          ToStringAndPrint(cVal,value); 
          ToStringAndPrint(cMax,max_value); 
          Serial.print("Is running...\n");
          run = true; 
          break;
     
          case 's' :
          // STOP
          run = false;
          Serial.print("Last values :\n");
          ToStringAndPrint(cPer, period); 
          ToStringAndPrint(cMin,min_value); 
          ToStringAndPrint(cVal,value); 
          ToStringAndPrint(cMax,max_value);
          break;
          }
        }
    }

  11. #131
    Membre habitué
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2022
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 86
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2022
    Messages : 62
    Par défaut
    Salut,
    la période du signal pour GAZ et DIR
    - les min, neutre et max pour GAZ et surtout pour DIR.
    Voilà en haut c'est le neutre de DIR et en bas le mini de GAZ, les maxi sont à 4 cm, mini 2, neutre 3. J'espère répondre à ta question
    Nom : 20251112_163306.jpg
Affichages : 97
Taille : 64,4 Ko
    J'ai aussi avancé en analogique, dont voici les explications :
    Les tops des optiques déclenchent une tempo d'une durée égale au temps entre deux tops à la vitesse maxi, ce qui fait que cela devient comme une véritable PWM.
    En chiffres : sur l'image #124 entre trois tops j'ai 7 cm, ce qui fait 3,5 cm donc 3,5 ms
    Il me suffit de convertir ce signal en tension et aller modifier mes deux 555 de sorties
    Au boulot !!!

  12. #132
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 460
    Par défaut
    J'en ai fait rentrer un, j'ai testé !! euh !! d'abord c'est en Allemand, je n'ai pas pu faire grand chose avec, possible que ça fonctionne mais il faut vraiment connaitre l'appareil, et je ne voulais pas passer des jours à tester sans succès, je l'ai renvoyé
    Il faut dire que j'ai deux moteurs et deux régulateurs, il m'aurait fallut peut-être deux appareils pour mettre les mêmes valeurs !
    Un seul boitier de programmation suffit pour les deux Pulsar B20.
    La doc est en allemand et en anglais :
    https://www.conrad.fr/fr/p/pichler-m...oductDownloads
    Voilà en haut c'est le neutre de DIR et en bas le mini de GAZ, les maxi sont à 4 cm, mini 2, neutre 3. J'espère répondre à ta question
    Pas vraiment, mais ceci dit, si 1 cm = 500µs on aurait donc :
    min = 1000µs (norme = 500µs)
    neutre = 1500µs
    max = 2000µs (norme = 2500µs)
    ... ... au mm près ???

    On a donc un "ambitus" (valeur exploitable) de 0 à 1000 µs pour les GAZ (la norme est de 2000µs).
    Pour DIR on a donc +/- 500µs autour de 1500µs.
    Donc ici on a des valeurs qui sont spécifiques aux récepteur et pulsar b-20.

    C'est exploitable et on peut toujours tenter le coup avec un arduino.

    Mais avant de finaliser, il faudrait quand même faire un petit progame pour tester graduellement la commande GAZ depuis un arduino, pour ne rien griller :
    moteur immobile si 1000µs donc jamais inférieur
    moteur plein pot si 2000µs donc jamais supérieur

    Bon ben ... yapluka !

  13. #133
    Membre habitué
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2022
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 86
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2022
    Messages : 62
    Par défaut
    Salut,
    Bon ben ... yapluka !
    Je te donne bien de peine !! ça me gène !
    Merci en tous cas

  14. #134
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 711
    Par défaut
    Bonjour,

    Si j'en crois le petit mode d'emploi des B20, il y a une phase de calibrage qui leur permet de s'adapter aux extrêmes, quel qu'ils soient.

    Si cette adaptation suffit pour homogénéiser le comportement des moteurs, il n'y a pas de boucle d'asservissement à prévoir. Exit le capteur optique.

    Mais si ce n'est pas le cas, le PWM qui sera soumis au B20 ne sera pas celui reçu, mais la contre-réaction induite par l'erreur entre la vitesse actuelle et l'objectif déduit du PWM entrant. Il n'y a alors pas de raison que les deux types PWM suivent les mêmes règles, d'autant que celui de l'asservissement aura intérêt à présenter le plus d'états possibles pour limiter les risques d'oscillations (ici traduites en variations cycliques des régimes moteurs). En caricaturant, un chauffage en tout ou rien oscille de part et d'autre de la température de consigne.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  15. #135
    Membre habitué
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2022
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 86
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2022
    Messages : 62
    Par défaut
    Salut,
    Si j'en crois le petit mode d'emploi des B20, il y a une phase de calibrage qui leur permet de s'adapter aux extrêmes, quel qu'ils soient.
    J'ai testé, sans succès, j'ai testé le module aussi, sans succès, et comme ma patience est de courte durée !! voyant que je n'arrivais pas je faisais le montage analogique (555) l'origine de mes échecs de tests c'est que je mets deux systèmes sur le même PWM
    , d'autant que celui de l'asservissement aura intérêt à présenter le plus d'états possibles pour limiter les risques d'oscillations (
    Je connais ,on rencontrait ce phénomène sur des machines outils
    Merci

  16. #136
    Membre habitué
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2022
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 86
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2022
    Messages : 62
    Par défaut
    Salut,
    Voilà quelques jours que l'on a pas correspondu, plusieurs raisons: un bug? vous vous êtes lassé de mon cas et je le comprendrais! ? je vous prie de me pardonner et en dernier j'espère que vous avez autres choses à faire bien plus importantes, ce que je souhaite,
    J'ai en partie réglé le problème avec mon montage avec mes tempos 555, J'ai aussi pas mal d'occupations , je vais donc mettre ce projet en stand by, je le ressortirais aux beaux jours, et si vous le permettez, je profiterais de votre savoir.
    Je vous remercie de votre aide et de votre patience apportées, un regret, c'est de ne pas connaitre la programmation !!
    Bien cordialement
    Positron 2

  17. #137
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 711
    Par défaut
    Bonjour,

    Je me demandais si le sujet était toujours actif

    J'ai un peu l'esprit en escalier, mais il m'est venu que les deux moteurs devraient tourner en sens inverse (avec des hélices à pas inversé) pour exercer un couple résultant nul sur l'avion. Cela élimine la possibilité qui avait été évoquée d'avoir un unique pilote (c'est le mot idoine ) pour les deux moteurs.

    J'ai tenté une simulation, mais les moteurs simulés ne présentent pas d'inertie ce qui interdit de vérifier le bon fonctionnement de la boucle d'asservissement.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  18. #138
    Membre habitué
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2022
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 86
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2022
    Messages : 62
    Par défaut
    Re,
    Je me demandais si le sujet était toujours actif
    Etant donné la peine que vous avez pris, la moindre des politesses aurait été de vous prévenir.
    il m'est venu que les deux moteurs devraient tourner en sens inverse (avec des hélices à pas inversé) pour exercer un couple résultant nul sur l'avion.
    Bien vu , mais ce n'est pas un problème, pour la rotation dans un sens ou dans l'autre, il suffit d'inverser deux fils, régulateur =>moteur D ou G, ce sont des moteurs pseudo tri.
    Merci
    Clt.

  19. #139
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 460
    Par défaut
    De mon coté j'ai travaillé un peu sur le sujet à partir d'une UNO :
    2 "objets" servos sur les broches 9 et 10 dont les sorties étaient connectées sur A0 et A1.
    Juste pour simuler et évaluer la réception des infos GAZ et DIR et vérifier le comportement des signaux en sortie de servo.
    Les deux servos générant en fait les signaux GAZ et DIR.
    Le contexte étant : 1000 µs pour la goütière min avec un déploiement sur 2000 µs max donc 1000 µs à moduler, avec une période de 20 ms.

    Donc voici le code qui en résulte et qu'il faudrait vérifier et tester :
    La PCINT1 a été un peu modifiée...
    A dire vrai ... je ne sais pas ce que ça vaut !

    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
     
    #include <Servo.h>
    //--------------------------
    #define Output_Left 9  // aka PB1 >>> vers pulsar gauche
    #define Output_Right 10 // aka PB2 >>> vers pulsar droit
    #define Input_GAZ A0 // aka PC0 >>> entrée commande GAZ
    #define Input_DIR A1 // aka PC1 >>> entrée commande DIR
    #define Min_Signal 1000 // goutière min du signal
    #define Max_Modulation 2000 // maximum
    //-------------------------- 
    union U{
    unsigned long time;
    unsigned int value[2]; // pour récupérer la partie basse qui est en value[0]
    };
    //-------------------------- classe pour GAZ et DIR
    class jSignal
    {
      public :
      unsigned long start;
      U pulse;
    };
    //-------------------------- 
    jSignal Signal_GAZ;
    jSignal Signal_DIR;
    Servo Servo_LEFT;
    Servo Servo_RIGHT;
    //--------------------------
    volatile unsigned long time; // = micros() temporaire
    volatile unsigned int i = 0;
    volatile byte b, c;
     
    volatile unsigned int GAZ_pulse=0;
    volatile unsigned int Power = 0;
    volatile unsigned int DIR_pulse=0;
     
    volatile byte BitGAZ = 0;
    volatile byte BitDIR = 0;
     
    volatile unsigned int old_Power=0;
    volatile unsigned int old_Pitch=0;
    volatile bool PowerChanged;
    volatile bool PitchChanged;
    volatile unsigned int d;
    volatile float Pitch;
    /* ce qui servait à faire écho sur le moniteur
    char buff[20];
    char cPlsGAZ[20];
    char cPlsDIR[20];
    */
    //--------------------------
    ISR (PCINT1_vect) 
    {
      time = micros();
      b = digitalRead(Input_GAZ);
      if(BitGAZ != b)
        {
        BitGAZ = b;
        if(b != 0)
          {
            Signal_GAZ.start = time;
          }
        else
          {
            Signal_GAZ.pulse.time = time - Signal_GAZ.start;
            GAZ_pulse = Signal_GAZ.pulse.value[0];
          }
        }
     
      b = digitalRead(Input_DIR);
      if(BitDIR != b)
        {
        BitDIR = b;
        if(b != 0)
          {
            Signal_DIR.start = time;
          }
        else
          {
            Signal_DIR.pulse.time = time - Signal_DIR.start;
            DIR_pulse  = Signal_DIR.pulse.value[0];
          }
        }
    }
    //--------------------
    void pciSetup(byte pin)
    {
        *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));  // enable pin
        PCIFR  |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
        PCICR  |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
    }
    //--------------------
    /*
    void ToStringAndPrint(char *str, unsigned int *val)
    {
    str[5] = 0;
    sprintf(buff, "%d", val);
    strcat(str, buff);
    Serial.print(str);
    Serial.print("\n");
    }
    */
    //--------------------
    void setup() 
    {
      /* ce qui servait à faire écho sur le moniteur
      Serial.begin(57600);
      delay(200);
      */
     
      // enable interrupt for pin...
      pinMode(Input_GAZ, INPUT_PULLUP);
      pinMode(Input_DIR, INPUT_PULLUP);
      pciSetup(Input_GAZ);
      pciSetup(Input_DIR);
     
      // Servo LEFT
      Servo_LEFT.attach(9);
      Servo_LEFT.writeMicroseconds(Min_Signal);
      // Servo RIGHT
      Servo_RIGHT.attach(10);
      Servo_RIGHT.writeMicroseconds(Min_Signal);
     
      /* ce qui servait à faire écho sur le moniteur
      strcpy(cPlsGAZ, "GAZ= ");
      strcpy(cPlsDIR, "DIR= ");
      */
    }
    //-------------------------- 
    void loop() 
    {
      PowerChanged = false;
      PitchChanged = false;
     
      Power = GAZ_pulse - Min_Signal;
      if(Power != old_Power)
        {
          old_Power = Power;
          PowerChanged = true;
        }
      i = DIR_pulse - Min_Signal;
      if(i != old_Pitch)
        {
          old_Pitch = i;
          PitchChanged = true;
        }
      if(PowerChanged || PitchChanged)
        {
        if(i < 500)
          {
            // pitch left
            Pitch = (Power * i) / 500;
            Servo_LEFT.writeMicroseconds(Min_Signal + Pitch);
            Servo_RIGHT.writeMicroseconds(Min_Signal + Power);
          }
        else
          {
          if(i > 500)
            {
              // pitch right
              d = 1000 - i;
              Pitch = (Power * d) / 500;
              Servo_LEFT.writeMicroseconds(Min_Signal + Power);
              Servo_RIGHT.writeMicroseconds(Min_Signal + Pitch);
            }
          else
            {
              Servo_LEFT.writeMicroseconds(Min_Signal + Power);
              Servo_RIGHT.writeMicroseconds(Min_Signal + Power);
            }
          }
        }
     
      /* ce qui servait à faire écho sur le moniteur
      if(Serial.available())
        {
        c = Serial.read();
        switch(c)
          {
            case '?' :
            Serial.print("Ready !\n");
            break;
    	...
    	...
    	...
          }
        }
      */
    }

  20. #140
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 735
    Par défaut
    Salut tout le monde,

    En ce qui me concerne, au sujet du dernier code, je t'avais demandé @Positron de confirmer que tu avais bien une variation de tension. Après tes problèmes de réglages d'oscillo, tu as fini par poster ce message :

    Citation Envoyé par Positron 2 Voir le message
    J'ai aussi avancé en analogique, dont voici les explications :
    Les tops des optiques déclenchent une tempo d'une durée égale au temps entre deux tops à la vitesse maxi, ce qui fait que cela devient comme une véritable PWM.
    En chiffres : sur l'image #124 entre trois tops j'ai 7 cm, ce qui fait 3,5 cm donc 3,5 ms
    Il me suffit de convertir ce signal en tension et aller modifier mes deux 555 de sorties
    Au boulot !!!
    D'après toi, comment a-t-il été compris ?

    Ensuite, à chaque fois qu'on te répond, tu t'excuses et tu écris que ça te fait de la peine qu'on se donne de la peine pour ce qui n'est qu'un jeu. Avec ton message que je viens de citer, je m'étais dit que c'était le bon moment d'arrêter avant que le gars fasse une dépression.

    Citation Envoyé par Positron 2 Voir le message
    J'ai en partie réglé le problème avec mon montage avec mes tempos 555,
    Et donc ?

Discussions similaires

  1. Problème sur la commande COPY depuis un programme Java
    Par klereth dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 10/02/2006, 15h14
  2. Questions sur la commande awk
    Par vbcasimir dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 17/01/2006, 11h35
  3. [VBA excel] Probleme sur bouton commande
    Par RedBurn dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 22/11/2005, 11h10
  4. Question de débutant sur la commande Accept
    Par deaven dans le forum Oracle
    Réponses: 1
    Dernier message: 21/10/2005, 09h25
  5. [LG]plantage sur une commande basique !
    Par Jeff on the web dans le forum Langage
    Réponses: 5
    Dernier message: 13/01/2004, 20h07

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