DRONE réalisé grâce à Lobodol !

Le vendredi 15 octobre 2021 à 22:31:40
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
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
Le dimanche 17 octobre 2021 à 16:53:08
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.
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 :
// On boucle tant que toutes les sorties ne sont pas retournées à l'état LOW
while (PORTD >= 16) {
// ...
}
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.

Le lundi 18 octobre 2021 à 10:41:55
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
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