pilotez un moteur brushless ERC avec joystick

Bonjour ,
je suis en train de faire un drone quadrotors. J'ai déja fait le pcb et soudez tout les composants. plus qu'a faire le code :slight_smile: ! mais une question me viens. Comment faire pour que quand on leve le joystick vers le haut , les moteurs s'activent ( plus on monte le joystick plus les moteurs vont fort ). et inversement.
Et j'envoyerais les commandes en radio.
Bref , je sais pas ou trouver les informations donc je viens içi ;).
Ensuite je ferais le PID et puis ce sera bon :).
Merci d'avance :slight_smile:

1 Like

bonjour,
assez fort quand même, tu fais le pcb avant le code ? ? ? ?

c'est quoi un joystick? juste un "potar", donc lire la valeur simplement, pas plus compliqué.

J'ai fait le PCB avant car je savais déjà qu'elle composants mettre. Et j'ai aussi été aider par une personne.
Pour le joystick , je parle d'un 2 axes ( voir photo ) :

Je construis moi-même un quadricoptère basé sur des composants Arduino.

Vous voulez parler de ESC (Electronic Speed Controller) et non ERC. Ces composants se pilotent comme des servos. Donc, utilisez la bibliothèque "Servos" puis déclarez autant de servos que vous avez de moteurs. Après émission/réception des données fournies par votre joystick, convertissez ces données en durée en microsecondes assimilables par les servos.

Pour ce qui concerne le joystick que vous utilisez, j'en utilise aussi. Donc, en plus de mettre au point un drone, il vas falloir que vous (comme moi) vous fassiez à ces joysticks ... qui ne sont pas la joie :

  • zone morte centrale de l'ordre d'une dizaine de degrés,
  • valeur centrale à calibrer,
  • zone morte au-delà d'une vingtaine de degrés bien que l'excursion physique soit d'une trentaine de degrés.
    Quand aux PID, là sera tout le plaisir, sachant que le modélisation du comportement de ces engins fait intervenir des notions d'aérodynamisme pas franchement évidentes.

Cordialement.

Pierre

1 Like

Merci pierre pour toutes ses informations et précision. Oui j'ai fait une faute de frappe , je modifierais si possible.
Ca peux avoir l'air bête comme question , mais , comment convertir ses valeurs en secondes ( comment on sait quand il est de x , x microsecondes ) ?
Et le calibrage la , ce fait comment ? Software ou avec du code ?
Et pour le PID , je suppose qu'il y a moyen d'en trouver des modèles sur internet non ?
Merci !

Et comment on fait de base pour activer le moteur brushless ? C'est pas le même que des servos a savoir digiralwrite

On vous laisse chercher un peu et faire des propositions.

Cordialement.

Pierre

Justement , j'ai déjà chercher et je suis bloqué. Je viens pas içi pour faire joli et qu'on me ponde des réponses toutes faites. Juste des pistes. A prendre en compte que je débute aussi.

Une simple recherche avec ESC drone.

Cordialement.

Pierre

Oui mais ca explique pas comment les programmez. j'ai regarder et c'est hyper spécial a faire le code ... c'est pas comme un servo.

Avez-vous essayé de taper "piloter un ESC avec un arduino" dans votre moteur de recherche préféré ?

Cordialement.

Pierre

bonjour ,
Oui j'ai déja essayer beaucoup de chose. Et c'est jamais assez clair.

si tu disais exactement ce que tu veux faire?

tu parle de piloter via un joystick un ESC.

ma réponse n'était pas dénuée de bon sens.

un joystick, c'est un potar, donc une valeur qui va varier de 0 à X
commence déjà par un code pour lire ces valeurs afin d'avoir une référence.
c'est une question de logique, on monte le joystick, donc la valeur va monter, on baisse, donc la valeur baisse.

après tu parle d'ESC, mais quel ESC

Oui j'ai déja essayer beaucoup de chose. Et c'est jamais assez clair.

c'est jamais assez clair de toute facon, il faut piocher et interpréter les choses.

Oui il y a plusieurs sens.
Je suppose que:

Include Servo.h

typedef struct ESCSettingsDef
{
int Low; // Initialisation du ESC
int High;
};

ESCSettingsDef ESCSettings;

Define MotG 3
Define MotD 5
Define MotBasG 9
Define MotBasD 13

Servo MotG;
Servo MotD;
Servo MotBasG;
Servo MotBasD;

void setup ()

MotG.attach(3); // On fait avec ca ou des defines.

Ensuite après comme tu dis c'est juste une lecture de donnée de type O a 1023. Plus on monte le joystick , plus la valeur monte donc plus les moteurs vont vite. Et inversement.
Ensuite le PID je suppose que ca ce trouve sur internet. Demain je vous link tout ce que j'ai mit sur ma plaque ^^.

Voiçit : https://fr.aliexpress.com/item/A2212-1000KV-13T-Brushless-Motor-30A-Brushless-ESC-2-PCS-1045-Counter-Rotating-Propeller-for-FPV/32274889178.html?spm=2114.44010208.4.1.GbFUN4.

Je reviens vers vous ce soir , normalement je recois de l'aide d'un ami ^^.
Si pas , j'sais pas trop comment faire et des pistes seraient les bienvenues.

J'utilise les mêmes ESC que ceux que vous avez commandés. Normalement, ils sont accompagnés d'une notice qui explique bien comment s'en servir en chinois :cry: mais aussi en anglais :smiley:

Cordialement.

Pierre

Bonjour ,
j'ai déja fait ca comme bout de code. Le but : pilotez les moteurs avec mon joystick 2 axes.
Dans ce code j'ai juste fait ( joystick vers le haut : accelere progressivement en fonction de l'inclinaison du joystick ; joystick vers le bas : l'inverse d'accelerer et l'arret : point mort ).
Mais rien ne se passe et même l'initialisation des moteurs et du driver ESC ne se passe pas ^^. Bref je suis perdu. Need some helps :slight_smile:

#include <Servo.h>
#define joyStickY A0
#define joyStickX A1

Servo esc1;
Servo esc2;
Servo esc3;
Servo esc4;

int val = 0;
//int val_joystick = 0;
int valservo = 0;

////////////////////////////////////////////////////////////////////////ICILESVOIDSENPLUS/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void forward(){

}

void back(){

}

void left(){

}

void right(){

}

void up(){
unsigned int i;

i = analogRead(joyStickY);
while(i >=512); // Tant que le joystick est = 512 , il reste dans le void.
valservo = map(i,512,1023,0,100); // Convertis la valeur 512 en valeur moteur : repos , actionnés.
esc1.write(valservo);
delay(15);
esc2.write(valservo);
delay(15);
esc3.write(valservo);
delay(15);
esc4.write(valservo);
delay(15);

}

void down(){
unsigned int i;

i = analogRead(joyStickY);
while(i<=510);
valservo = map(val,0,510,0,100); // Convertis la valeur 510 en valeur moteur : actionnés , repos.
esc1.write(valservo);
delay(15);
esc2.write(valservo);
delay(15);
esc3.write(valservo);
delay(15);
esc4.write(valservo);
delay(15);

}
void arret(){

while ( joyStickY == 511 ) {
valservo = 0; // Convertis la valeur 510 en valeur moteur : actionnés , repos.
esc1.write(valservo);
delay(15);
esc2.write(valservo);
delay(15);
esc3.write(valservo);
delay(15);
esc4.write(valservo);
delay(15);

}

}
void setup() {
esc1.attach(9); // On attache l'ESC au port numérique 9
esc2.attach(6); // On attache l'ESC au port numérique 6
esc3.attach(5); // On attache l'ESC au port numérique 5 //PINMODE
esc4.attach(3); // On attache l'ESC au port numérique 3
delay(15);
Serial.begin(9600);
Serial.setTimeout(500);

delay(20); // Initialisation de l'ESC

esc1.write(180);
delay(20);
esc1.write(0);
delay(20);

delay(10);

esc2.write(180);
delay(20);
esc2.write(0);
delay(20);

delay(10);

esc3.write(180);
delay(20);
esc3.write(0);
delay(20);

delay(10);

esc4.write(180);
delay(20);
esc4.write(0);
delay(20);

// Quelques informations pour l'utilisateur
Serial.println("J'ai rien a dire");
}

void loop() {
val=0;
if (Serial.available()) {
val = Serial.parseInt(); // lecture de la valeur passée par le port série
if(val<=25)val=0;
if(val>=180)val=0;
int joyStickY = analogRead(A0);
int joyStickX = analogRead(A1);
Serial.print(joyStickY);
Serial.println(joyStickX);
if (arret){ // si arrêt , sinon up , sinon down , ...
else (up){

}
else (down){ // pas correct ( syntaxe )

}
else (forward){

}
else (back){

}
else (left){

}
else (right){

}
}
/* Serial.println(val);
esc1.write(val);
delay(15);
esc2.write(val);
delay(15);
esc3.write(val);
delay(15);
esc4.write(val);
delay(15);
*/
}
}

Avez-vous reçu vos ESC et en avez-vous lu la documentation ?

Si oui, qu'en avez-vous déduit qu'il fallait faire pour faire tourner les moteurs ?

Cordialement.

Pierre

Bonjour ,

Oui j'ai tout bien reçu et lu la documentation. De ce que je vois , il faut une partie d'initialisation. Mais je ne vois absolument pas comment la faire ^^.

firkhorme:
Bonjour ,

Oui j'ai tout bien reçu et lu la documentation. De ce que je vois , il faut une partie d'initialisation. Mais je ne vois absolument pas comment la faire ^^.

Vous avez lu, mais n'avez pas su interpréter.

Par mesure de sécurité, un ESC ne commandera pas les moteurs si au départ sa commande ne correspond pas à une vitesse nulle. Si on lui envoie cet ordre, il émettra plusieurs sons (voir doc) et sera prêt à recevoir une commande pour une vitesse non nulle.

Donc, dans le setup(), après avoir attaché l'ESC à un servo, il faut lui commander une vitesse nulle et ne rien faire d'autre tant qu'il n'a pas émis les sons attendus.

Alors, dans le loop(), vous pouvez envoyer des ordres de vitesse non nulle.

Comme ici on ne parle pas d'angle, mais de vitesse, il est préférable d'utiliser la commande "writeMicroseconds()", c'est plus parlant

Nominalement, une vitesse nulle correspond à 1000 µS et la vitesse max à 2000 µS. Pour autant, il est préférable, au préalable, d'appliquer la procédure "Throttle Range Setting" (voir la doc).

Cordialement.

Pierre