DRONE réalisé grâce à Lobodol !

infrared4ever infrared4ever 6 Messages
Bonjour à tous,
grâce à l'excellent tutoriel de lobodol j'ai réalisé un drone "quadcopter". J'ai conçu et réalisé toute la partie électronique ainsi que l'informatique de l'émetteur et du récepteur HF.
Le tutorial est trés bien fait et j'ai suivi exactement les instructions. Malheureusement j'ai rencontré un problème au démarrage des moteurs.
Voici la situation :
Les sorties vers les "esc" que j'utilise ne sont pas les mêmes que celles du tutorial.
Dans le tutorial il est écrit:
"// Set pins #4 #5 #6 #7 HIGH
    PORTD |= B11110000;
    // Wait until all pins #4 #5 #6 #7 are LOW
    while (PORTD >= 16) "
J'utilise les sorties B1, B2, B3 et B4
pour les mettre au niveau "haut" j'écris :  "PORTB |=B00011110;//toutes les 4 voies "HIGH" (B1..B4)"
Pour mettre toutes les "esc" au niveau bas j'écris: "PORTB &=B11100001"
De ce fait, l'instruction "while (PORTD >= 16) " doit être changée mais je ne sais pas quel est le nombre qu'il faut mettre à la place du nombre "16".
En fait j'ai essayé plusieurs conbinaisons mais rien ne fonctionne.
La phase d'amorçage se fait par un créneau à 1000 microsec sur les 4 "esc" puis suit la commande "gaz" mixée avec les 3 autres axes de l'IMU.
Quand je remplace les valeurs attribuées aux 4 "esc", par la commande commune des gaz  (1000 à 2000 microsec), tout fonctionne parfaitement: les moteurs démarrent sans problème.
Quand je remplace le parametre "gaz" par sa valeur modifiée par le 'roll', le 'pitch' et le 'yaw': les moteurs ne démarrent pas et émettent une note à intervalle régulier...
A la place du nombre "16" j'ai essayé l'instruction suivante:
while (PORTB & B00011110  >= 0x02) mais cela ne fonctionne pas....
Puis je solliciter un conseil pour connaitre le nombre correct à mettre à la place de "16" ?

merci à nouveau pour l'excellent tutorial
lobodol lobodol 842 Messages BIG BOSS
Salut infrared4ever et bienvenue !

Ravis que mes articles te plaisent :)

Avant tout, il faut bien comprendre d'où sort la valeur 16. Pour ça, il faut que tu soit capable de faire la conversion binaire <-> décimale et vice-versa.
Dans mon code, on y voit ceci :



Les broches 4 à 7 sont les 4 derniers bits du PORTD (qui lui est sur 8 bits).
16 exprimé en binaire sur 8 bits donne : 0001000. Dans ce cas, on voit bien que la sortie #4 est à l'état HAUT. Pour que toutes les sorties (4, 5, 6 & 7) soit à l'état BAS, il faut que PORTD soit strictement inférieur à 16. 15 en binaire s'écrit 00001111 : on voit bien que les sorties 4 à 7 sont bien à 0. Comme la condition dans le while exprime la condition pour continuer la boucle, on dit bien "tant que PORTD est supérieur ou égal à 16 c'est que toutes les sorties ne sont pas revenues à l'état BAS => continu".

Dans ton cas, tu veux utiliser les broches du port B. Attention, les broches 8, 9, 10 & 11 sont utilisées pour décoder les signaux de la radiocommande. Tu ne peux donc pas les utiliser pour générer les signaux des ESC.
infrared4ever infrared4ever 6 Messages
Bonjour Lobodol,
merci pour ta réponse.
Entre-temps j'avais résolu le pb: en fait les "esc" nécessitent d'être initialisées pendant un
certain temps avant de recevoir l'ordre en provenance du TX.
Les entrées que j'utilisent en provenance du Rx sont différentes de celles
décrites dans ton tutoriel, d'où l'utilisation de PIN différentes
Mon code final est:
PORTB |=B00011110;//toutes les 4 voies "HIGH" (B1..B4)
value=PORTB & B00011110;
while (value >= 0x02)
{
 now = micros();
difference = now - loop_timer; etc...

Tout fonctionne parfaitement bien.
Je suis passé à la phase suivante: comparaison des ordres envoyés par le
TX aux positions relevées par l'IMU 6050 sur les 3 axes X (pitch), Y
(roll) et Z (yaw) pour implémenter le PID
Mon souci concerne les temps de calcul des "float".
A la suite de mes essais, je ferai un bref compte rendu dans ce forum
Merci encore pour tes conseils
cordialement
infrared4ever infrared4ever 6 Messages
Bonjour Lobodol,
je reprends contact avec toi car je souhaite plus d'explications à propos des interruptions qui offrent la possibilté de mesurer la durée des voies en provenance du Rx.
Pour initialiser les 4 sources des interruptions tu écris:

Les pins 8, 9, 10 et 11 vont créer une interruption à chaque changement d'état

La routine appelée par ces 4 interruptions est (je reprends ton programme ci-dessous) :

Cette routine est positionnée par (voir plus haut) "Set PCINT0" (digital input 8)
Cette routine traite les 4 pins (8, 9, 10 et 11) en 1 seule routine alors que les initialisations pré-positionnent 4 routines (1 routine par pin: 4 pins==>4 routines)
QUESTION IS:
sauf erreur de ma part, les 3 autres pins (9, 10 et 11) n'apparaissent pas dans le traitement  de leur propre interruption,
Comment sont traitées les 3 autres routines d'interruption alors que uniquement l'interruption apparaissant sur la pin 8 est prise en consideration ?
Merci pour le temps que tu voudras bien consacrer à mon interrogation.
infrared4ever infrared4ever 6 Messages
Bonjour Lobodol,
j'ai réalisé un Tx émettant sur 5 voies et dont la durée reste fixe mais variable à volonté (autour de 1500 microsec) afin de localiser l'origine du problème suivant.
La lecture de la durée des voies par ISR  est fluctuante alors que le Tx ne varie pas (vérification à l'oscilloscope)
ci joint un tableau dans lequel se voit bien la fluctuation de la durée des voies, principalement le YAW et le PITCH
La valeur injectée par le Tx est environ 1490 microsec: on voit la variabilité principalement sur le YAW et le PITCH alors que le Tx n'a pas varié.
Toute proposition pour solutionner ce problème est la bienvenue....
Merci pour votre aide
YAW: 2000.0    PITCH: 2000.0    ROLL: 2000.0    Gaz: 2000.0    Trim: 2000.0
YAW: 1480.0    PITCH: 1500.0    ROLL: 1491.0    Gaz: 1491.0    Trim: 1487.0
YAW: 1496.0    PITCH: 1497.0    ROLL: 1478.0    Gaz: 1492.0    Trim: 1484.0
YAW: 2000.0    PITCH: 1823.0    ROLL: 1486.0    Gaz: 1497.0    Trim: 1490.0
YAW: 1511.0    PITCH: 1486.0    ROLL: 1494.0    Gaz: 1490.0    Trim: 1484.0
YAW: 2000.0    PITCH: 2000.0    ROLL: 1499.0    Gaz: 1496.0    Trim: 1473.0
YAW: 2000.0    PITCH: 2000.0    ROLL: 2000.0    Gaz: 2000.0    Trim: 1488.0
YAW: 1866.0    PITCH: 1498.0    ROLL: 1490.0    Gaz: 1480.0    Trim: 2000.0
YAW: 2000.0    PITCH: 2000.0    ROLL: 1482.0    Gaz: 1492.0    Trim: 1482.0
YAW: 1492.0    PITCH: 1490.0    ROLL: 1492.0    Gaz: 1484.0    Trim: 1488.0
YAW: 1518.0    PITCH: 1486.0    ROLL: 1490.0    Gaz: 1494.0    Trim: 1488.0
YAW: 2000.0    PITCH: 1000.0    ROLL: 1502.0    Gaz: 1496.0    Trim: 1488.0
YAW: 2000.0    PITCH: 2000.0    ROLL: 1494.0    Gaz: 1494.0    Trim: 1482.0
YAW: 2000.0    PITCH: 1376.0    ROLL: 1498.0    Gaz: 1490.0    Trim: 1486.0
YAW: 1000.0    PITCH: 2000.0    ROLL: 1672.0    Gaz: 1486.0    Trim: 1480.0
YAW: 1496.0    PITCH: 2000.0    ROLL: 1492.0    Gaz: 1490.0    Trim: 1484.0
YAW: 2000.0    PITCH: 1514.0    ROLL: 1488.0    Gaz: 1490.0    Trim: 1486.0

Ci dessous le prog de l'ISR: //ici converge les interruptions reçues sur les PIN 8, 9, 10 et 11 en provenance du Tx (pour TEENSY 4.0) void unique_ISR(void)//les 4 ISR sont rassemblées dans la même routine "unique_ISR" { current_time=micros(); //RAPPEL // PORTB Pins 8-13 //PIN utilisées pour lecture data TX //PIN 8, 9, 10, 11, 12 //pinMode(8, INPUT_PULLUP);//yaw //pinMode(9, INPUT_PULLUP);//pitch //pinMode(10, INPUT_PULLUP);//roll //pinMode(11, INPUT_PULLUP);//throttle //pinMode(12, INPUT_PULLUP);//trimmer //duree_voies[0] //actual_state[0] = digitalRead(8);//                              YAW actual_state[0]=GPIO7_DR & 0b0000010000000000000000; if (previous_state[0]==LOW && actual_state[0]==HIGH) {   //démarrage chrono   duree_voies[0]=current_time;   previous_state[0]=HIGH; } else if (previous_state[0]==HIGH && actual_state[0]==LOW) {   duree_voie_temp=micros()-duree_voies[0];   duree_voies[0] = duree_voie_temp;   previous_state[0]=LOW; } //++++++++++++++++++++++++++++++++++++++++++++++++ FIN YAW ++++++++++++++++++++++++++ //duree_voies[1] actual_state[1]=GPIO7_DR & 0b0000000000100000000000; //actual_state[1]=digitalRead(9);//                              PITCH if (previous_state[1]==LOW && actual_state[1]==HIGH) {   //démarrage chrono   duree_voies[1]=current_time;   previous_state[1]=HIGH; } else if (previous_state[1]==HIGH && actual_state[1]==LOW) {   //enregistrement chrono   duree_voie_temp=micros()-duree_voies[1];   duree_voies[1] = duree_voie_temp;   previous_state[1]=LOW; } //+++++++++++++++++++++++++++++++++++++++++++++++ FIN PITCH ++++++++++++++++++++++++++ //duree_voies[2] actual_state[2]=GPIO7_DR & 0b0000000000000000000001; //actual_state[2]=digitalRead(10);//                             ROLL if (previous_state[2]==LOW && actual_state[2]==HIGH) {   //démarrage chrono   duree_voies[2]=current_time;   previous_state[2]=HIGH; } else if (previous_state[2]==HIGH && actual_state[2]==LOW) {   //enregistrement chrono   duree_voie_temp=micros()-duree_voies[2];   duree_voies[2] = duree_voie_temp;   previous_state[2]=LOW; } //+++++++++++++++++++++++++++++++++++++++++++++ FIN ROLL +++++++++++++++++++++++++++ //duree_voies[3] actual_state[3]=GPIO7_DR & 0b0000000000000000000100; //actual_state[3]=digitalRead(11);//                       THROTTLE if (previous_state[3]==LOW && actual_state[3]==HIGH) {   //démarrage chrono   duree_voies[3]=current_time;   previous_state[3]=HIGH; } else if (previous_state[3]==HIGH && actual_state[3]==LOW) {   //enregistrement chrono   duree_voie_temp=micros()-duree_voies[3];   duree_voies[3] = duree_voie_temp;   previous_state[3]=LOW; } //++++++++++++++++++++++++++++++++++++++++++ FIN THROTTLE ++++++++++++++++++++++++++ //duree_voies[4] actual_state[4]=GPIO7_DR & 0b0000000000000000000010; //actual_state[4]=digitalRead(12);//                      TRIMMER if (previous_state[4]==LOW && actual_state[4]==HIGH) {   //démarrage chrono   duree_voies[4]=current_time;   previous_state[4]=HIGH; } else if (previous_state[4]==HIGH && actual_state[4]==LOW) {   //enregistrement chrono   duree_voie_temp=micros()-duree_voies[4];   duree_voies[4] = duree_voie_temp;   previous_state[4]=LOW; } //+++++++++++++++++++++++++++++++++++++++++++++++++ FIN TRIM ++++++++++++++++++++++++++ } 
infrared4ever infrared4ever 6 Messages
Bonjour,
je remets au propre le programme ci-dessous, désolé pour ce contre temps.

lobodol lobodol 842 Messages BIG BOSS
Salut @infrared4ever, tu peux mettre ton code en forme en le mettant entre balise [code][/code] stp?
Parce que là c'est difficile à lire...
infrared4ever infrared4ever 6 Messages
Bonjour,
je suis novice pour la programmation et je ne comprends pas ce que veut dire "mettre ton code en forme en le mettant entre balise ".
Pourrais tu me donner un exemple sur qq lignes de code s'il te plait ?
Merci pour ton aide
lobodol lobodol 842 Messages BIG BOSS
C'est bon, je l'ai fait
Vous devez être connecté pour pouvoir répondre à ce sujet.
Utilisation des données

Afin d'améliorer ton expérience utilisateur, nous utilisons des cookies 🍪