Mon aile volante est propulsée par un moteur brushless, actuellement le pwm de contrôle du moteur qui arrive du récepteur radio) part directement au contrôleur du moteur.
J'aurai besoin d'une part lire la valeur pwm sur une arduino nano, puis renvoyer la valeur sur une sortie pwm de la nano.
Suivant la valeur du pwm reçu par la nano, il ne faut pas simplement dupliquer le signal qui arrive et le signal vers le contrôleur, mais laisser la main du contrôle puissance moteur à l'arduino...
Mon problème est de faire la lecture et envoi signal pwm la plus rapide et fiable possible.
Quelle méthode (et librairie) utiliser ?
Ce n'est pas la gestion du moteur lui-même qui me pose problème mais la vitesse de lecture et écriture pwm.
Suivant la valeur du pwm reçu par la nano, il ne faut pas simplement dupliquer le signal qui arrive et le signal vers le contrôleur, mais laisser la main du contrôle puissance moteur à l'arduino...
tu as fait quoi exactement comme code pour le moment?
lire un pwm, c'est comme lire en gros la valeur d'un potard
envoyer un pwm 0-255, c'est pas le problème non plus
c'est le type de code pour faire changer la luminosité d'une led via un potard.
donc, l'arduino doit faire quoi entre la réception et la retransmission?
ça veut dire que suivant la valeur qui arrive depuis le récepteur radio, un algorithme de gestion va prendre le relais pour le contrôle du moteur, mais pour ça je n'ai pas de problème.
Ce que je voudrais, c'est lire la valeur d'entrée puis stocker en variable et inversement en perdant le moins de temps possible (minimiser la latence...)
ça veut dire que suivant la valeur qui arrive depuis le récepteur radio, un algorithme de gestion va prendre le relais pour le contrôle du moteur, mais pour ça je n'ai pas de problème.
Bonjour, je ne comprend pas. C'est exactement le rôle de l'ESC.
Bonjour, il contient un code qui utilise un capteur ir pour placer l'hélice à l'horizontale notamment lors de la phase finale d’atterrissage.
Pour la lecture du signal entrant, je pense utiliser une interruption (puis compter l'écart en microseconds entre les interruptions et ainsi avoir le signal.
Mais pour l'envoi du signal, je ne trouve pas plus rapide que servo.writeMicroseconds et il faut faire un traitement le plus rapide possible.
Il faut altérer le moins possible le signal d'entrée (dans le cas où le système de gestion estime qu'il n'a pas à prendre la main, mais simplement de relayer le signal d'entrée)
A un bout de la chaîne, un récepteur radio fournit une valeur PWM_1,
A l'autre bout, un Arduino NANO envoie une valeur PWM_2 à l'ESC, cette valeur étant fonction de celle venant du récepteur et modifiée par la contrôleur de vol.
Donc, entre les deux, il faut modifier la valeur PWM_1 pour obtenir PWM_2. Pour cela, on la lit et on la transforme en valeur numérique; le contrôleur de vol y met son grain de sel et la valeur finale est transformée en PWM_2 (via la bibliothèque Servo je suppose) pour commander l'ESC.
Le problème serait donc la transformation de PWM_1 en valeur numérique, ce qui suppose un analogRead() sur une onde PWM_1: il faut alors la filtrer pour avoir une lecture stable.
Sonis:
Mais pour l'envoi du signal, je ne trouve pas plus rapide que servo.writeMicroseconds et il faut faire un traitement le plus rapide possible.
Bonjour,
Heu, tu es sur que ce n'est pas assez rapide?
servo.writeMicroseconds doit prendre quelques microsecondes voire quelques dizaines de micro secondes, c'est tout à fait négligeable vis à vis du timing du signal PWM classique qui transmet une consigne toutes les 20 ms.
Tu crois qu'il y a des problèmes de stabilité sur la lecture pwm par la méthode d'interruption ?, à première vue je dirais moins qu'avec analogRead(), mais c'est un point très important parce-que si jamais la lecture donne quelque-chose d'éloigné de la commande ou même aberrante, puis que c'est envoyé au contrôleur moteur et qu'il se met en sécurité; la perte de propulsion en situation critique peut faire des dégâts...
ça coûterait beaucoup sur le temps de cycle d'utiliser la fonction map pour être sur qu'aucune valeur aberrante ne soit envoyé, ou de vérifier les bornes et envoyer la dernière valeur cohérente reçue au lieu de la nouvelle mais aberrante ?
j'ai besoin que toutes les opérations (de lecture jusqu'à envoi signal) prennent moins de 2 ms, donc si tu me dis que writeMicroSeconds prend que quelques microsecondes je crois que ça peut faire.
Après, si y a mieux j'aime bien apprendre et faire les choses bien.
Sonis:
Une méthode via interruption externe serait plus rapide que analogRead non ? ...
Non, pas forcément. Mais de toutes façons, la méthode analogRead() nécessite un filtrage passe-bas du signal PWM et cela introduit un retard important dans la boucle.
Si la méthode par interruption manque un cycle de PWM, vous ne mettez la valeur à jour que si elle est comprise dans des bornes raisonnables. Par exemple, si l'écart max entre deux commandes PWM est de 100, vous testez si la nouvelle valeur est dans cet intervalle.