Multiwii et moteur DJI 2212/920KV

Bonjour à tous,

Je me suis lancé dans la réalisation d’un drone F450 (quadricoptère).

Pour le réaliser, j’utilise 4 moteurs brushless DJI 2212 / 920 KV (avec leur ESC opto E300), pilotés par une carte MWC multiwii Flight Controller pour UAV w/ Pins, elle-même piloté par une carte (maîtresse) ARDUINO Méga ADK.

Jusque là, j’ai réussi à activer les moteurs juste avec la carte arduino, et avec la carte multiwii, j’ai piloté des servo moteurs (Robot Servo HSR-1425CR).

Par contre, quand il s’agit de faire tourner les moteurs DJI avec la carte multiwii (avec un programme arduino spécial multiwii), impossible de les faire fonctionner. Pourtant, en modifiant juste les paramètres pour piloter un servo moteur HSR, pas de problème.

Donc je bloque à ce stade (piloter les 4 moteurs brushless d’un quadricoptère avec multiwii via un programme arduino).

Quelqu’un aurait-il une solution ou un conseil s’il vous plaît?

Salut fefe450,

Il y a probablement un problème dans l’armement des ESC. Pour fonctionner, ils doivent recevoir un signal “BAS” pour confirmé et ne pas partir a tournée toute seule.
MultiWii normalement a un paramètre “MINCOMMAND” qui est la valeur envoyée à l’ESC lors de l’alimentation. (dans Config.h)

/**************************** Mincommand *******************************/ /* this is the value for the ESCs when they are not armed in some cases, this value must be lowered down to 900 for some specific ESCs, otherwise they failed to initiate */ #define MINCOMMAND 1000

Un servo normal n’aura pas besoin de ceci donc fonctionnera malgré ce détail.

:slight_smile:

Bonjour

Merci bien de la réponse :slight_smile: mais malgré ce changement, toujours pas de rotation. Les moteurs se détectent bien, mais restent immobiles.

Voici la configuration rentré dans “config.h”, si jamais cela peut aider.

Merci bien de l’aide fourni.

[code]#ifndef CONFIG_H_
#define CONFIG_H_
#define QUADX
#define MINTHROTTLE 1150 // () (**
#define MINCOMMAND 900
#define I2C_SPEED 100000L
#define FLYDUINO_MPU
#define PID_CONTROLLER 1
#define YAW_DIRECTION 1
#define ONLYARMWHENFLAT
#define ALLOW_ARM_DISARM_VIA_TX_YAW
#define CAM_TIME_HIGH 1000
#define FLAPPERON_EP { 1500, 1700 } // Endpooints for flaps on a 2 way switch else set {1020,2000} and program in radio.
#define FLAPPERON_INVERT { -1, 1 }
#define COLLECTIVE_PITCH THROTTLE
#define COLLECTIVE_RANGE { 80, 0, 80 }// {Min%, ZeroPitch offset from 1500, Max%}.
#define YAWMOTOR 0 // If a motor is used as YAW Set to 1 else set to 0.
#define SERVO_NICK { +10, -10, 0 }
#define SERVO_LEFT { +10, +5, +10 }
#define SERVO_RIGHT { +10, +5, -10 }
#define CONTROL_RANGE { 100, 100 } // { ROLL,PITCH }
#define SBUS_MID_OFFSET 988 //SBUS Mid-Point at 1500
#define SERIAL0_COM_SPEED 115200
#define SERIAL1_COM_SPEED 115200
#define SERIAL2_COM_SPEED 115200
#define SERIAL3_COM_SPEED 115200
#define INTERLEAVING_DELAY 3000
#define NEUTRALIZE_DELAY 100000
#define AP_MODE 40 // Create a deadspan for GPS.
#define FAILSAFE_DELAY 10 // Guard time for failsafe activation after signal lost. 1 step = 0.1sec - 1sec in example
#define FAILSAFE_OFF_DELAY 200 // Time for Landing before motors stop in 0.1sec. 1 step = 0.1sec - 20sec in example
#define FAILSAFE_THROTTLE (MINTHROTTLE + 200) // (
) Throttle level used for landing - may be relative to MINTHROTTLE - as in this case

#define FAILSAFE_DETECT_TRESHOLD 985
#define GPS_BAUD 57600
#define GPS_LED_INDICATOR
#define NAV_CONTROLS_HEADING true // copter faces toward the navigation point, maghold must be enabled for it
#define NAV_TAIL_FIRST false // true - copter comes in with tail first
#define NAV_SET_TAKEOFF_HEADING true // true - when copter arrives to home position it rotates it’s head to takeoff direction
#define MAG_DECLINATION 0.0f //(**)

#define GPS_LEAD_FILTER // Adds a forward predictive filterig to compensate gps lag. Code based on Jason Short’s lead filter implementation #define GPS_WP_RADIUS 200 // if we are within this distance to a waypoint then we consider it reached (distance is in cm)
#define NAV_SLEW_RATE 30 // Adds a rate control to nav output, will smoothen out nav angle spikes
#define LCD_SERIAL_PORT 0 // must be 0 on Pro Mini and single serial boards; Set to your choice on any Mega based board
#define LCD_MENU_PREV ‘p’
#define LCD_MENU_NEXT ‘n’
#define LCD_VALUE_UP ‘u’
#define LCD_VALUE_DOWN ‘d’

#define LCD_MENU_SAVE_EXIT ‘s’
#define LCD_MENU_ABORT ‘x’
#define VBATSCALE 131 // () (**) change this value if readed Battery voltage is different than real voltage
#define VBATNOMINAL 126 // 12,6V full battery nominal voltage - only used for lcd.telemetry
#define VBATLEVEL_WARN1 107 // (
) () 10,7V
#define VBATLEVEL_WARN2 99 // (*) (
) 9.9V
#define VBATLEVEL_CRIT 93 // () (**) 9.3V - critical condition: if vbat ever goes below this value, permanent alarm is triggered
#define NO_VBAT 16 // Avoid beeping without any battery
#define PSENSORNULL 510 /
() hard only: set to analogRead() value for zero current; for I=0A my sensor
gives 1/2 Vss; that is approx 2.49Volt; /
#define PINT2mA 132 /
(
) hard: one integer step on arduino analog translates to mA (example 4.9 / 37 * 1000) ;
soft: use fictional value, start with 100.
for hard and soft: larger PINT2mA will get you larger value for power (mAh equivalent) /
#define ALT_HOLD_THROTTLE_NEUTRAL_ZONE 50
#define BOARD_NAME “MultiWii V-.–”
#define NO_FLASH_CHECK
#define MIDRC 1500
#define SERVO_RFR_50HZ
#define MEGA_HW_PWM_SERVOS
#define SERVO_RFR_RATE 50 // In Hz, you can set it from 20 to 400Hz, used only in HW PWM mode for mega and 32u4
#define ESC_CALIB_LOW MINCOMMAND
#define ESC_CALIB_HIGH 2000
#define LCD_TELEMETRY_FREQ 23 // to send telemetry data over serial 23 <=> 60ms <=> 16Hz (only sending interlaced, so 8Hz update rate)
#define LCD_TELEMETRY_AUTO_FREQ 967// to step to next telemetry page 967 <=> 3s
#define PSENSOR_SMOOTH 16 // len of averaging vector for smoothing the PSENSOR readings; should be power of 2; set to 1 to disable
#define VBAT_SMOOTH 16 // len of averaging vector for smoothing the VBAT readings; should be power of 2; set to 1 to disable
#define RSSI_SMOOTH 16 // len of averaging vector for smoothing the RSSI readings; should be power of 2; set to 1 to disable
#define DISABLE_POWER_PIN
#endif /
CONFIG_H_ */[/code]

Un Controleur MultiWii nécessite d’être “Armé” pour fonctionner.
Il faut initié une première commande comme suis pour “Armé” et “Dé-Armé” le contrôleur. (Normalement avec la télécommande RC)

Armé:

]Throttle: 1000/:m]
]Yaw: 2000/:m]
Dé-Armé:

]Throttle: 1000/:m]
]Yaw: 1000/:m]


Bonjour,

Suite aux diverses informations reçu, nous avons établi un petit programme, de façon a faire tourner les moteurs en appliquant vos règles (armement et Dé-Armement).

Sur la carte de commande (arduino), nous programmons en PWM (broches connectés à la carte multiwii), mais les moteurs ne tournent toujours pas.

Carte Méga ADK: Carte contrôleur multiwii:
Broche 9 Broche throttle
Broche 10 Broche yaw

Ci-contre le programme établi:

[code]#include <Servo.h>
char commande;
Servo throttle;
Servo yaw;

const int pinThrottle=9;
const int pinYaw=10;

int valThrottle;
int valYaw;

void setup()
{
throttle.attach(9);
yaw.attach(10);
Serial.begin(115200);
}

void loop()
{

commande = Serial.read(); //on lit

if (commande == ‘a’) // armer throttle et yaw
{
valThrottle=35;
valYaw=145;
yaw.write(valYaw);
throttle.write(valThrottle);
}

else if (commande == ‘d’) // désarmer throttle et yaw
{
valThrottle=35;
valYaw=35;
yaw.write(valYaw);
throttle.write(valThrottle);
}

else if (commande == ‘z’) //Incrémenter throttle
{
for(valThrottle = 35; valThrottle <= 145; valThrottle += 10)
{
throttle.write(valThrottle);
Serial.println(valThrottle);
delay(150);
}
}
else if (commande == ‘e’) //Décrémenter throttle
{
for(valThrottle = 145; valThrottle >= 35; valThrottle -= 5)
{
throttle.write(valThrottle);
Serial.println(valThrottle);
delay(150);
}
}
}
[/code]

Faut-il bien programmer en utilisant des signaux PWM?
Faut-il aussi insérer le roll et le pitch?

Dans des documents, nous avons aussi lu que le processus d’armement est sur “auxiliaire 1”, est-ce un point important?
Et je précise aussi, nous n’utilisons pas de radio commande pour piloter le drone (le but étant qu’il vole seul, ou piloté via une application androïde).

Je vous remercie de l’aide apporté jusqu’à présent.

Sincères salutations.

Il s’agit d’une méthode d’utilisation de MultiWii qui n’est pas supporté normalement. Les commandes sont recu par une télécommande en PWM oui.

Une bonne manière de faire le monitorage serait de connecté votre carte MultiWii a l’ordinateur et d’ouvrir le GUI (WinGUI ou MultiWiiConf) pour voir ce qui ce passe.
MultiWii ne s’arme pas si le controleurs n’est pas de niveau ou non calibré (ACC).

Effectivement, c’était juste un problème de niveau, nos moteurs tournent avec la carte multiwii (via des commande clavier pour le moment).

Merci grandement :slight_smile: et bonne journée a vous.

Vous pouvez mettre des photos et vidéos de votre assemblage.
Ça nous intéresse de voir comment vous y arrivez. Le projet est intéressant… :wink:

Bonjour,

Il n’y a pas de souci, on présentera tout sa :slight_smile:

Maintenant, on doit régler le PID (la vitesse des moteurs varie bien selon l’angle du gyroscope, mais il y a toujours un couple de moteur qui va plus vite qu’un autre ( Vitesse moteur avant droite et arrière gauche > Vitesse avant gauche et arrière droite)).

Selon ce problème, comment bien régler le PID?

Merci de votre réponse.

Cordialement,

Grégory

Le PID est fonction de la réaction a l’erreur, si le UAV est sur une table sans bougé il n’y a aucune correction réel donc les valeurs aux moteurs ne sont pas relevante.
Voici une explication mieux détaillé ICI

Je me suis mal exprimé.

En fait on test déjà sans régler au préalable le PID, afin que les moteurs tournent à peu prêt à la même vitesse (ce qu’ils ne font absolument pas comme dit précédemment).

Seul le Throttle fonctionne correctement, mais dès qu’on agit légérement sur un autre mode (yaw, pitch, ou roll), ils partent dans “tous les sens” (le moteur avant gauche monte à 1800, l’avant droit à 1500, l’arrière gauche à 1500, et l’arrière droit à 1200 (environ)).

Comme je vous ai dit, il est normal d’avoir une réaction comme celle-ci sous MultiWii.
Les paramètres sont fait pour le vol et non sans mouvements.

Bonjour,

Nous arrivons à la phase de réglage du PID.
Nous savons que pour le régler, le drone doit être en vole.
Malheureusement, il est, disons, “complètement fou” (imaginez un shuriken, c’est notre drone).
Nous avons donc bel et bien un problème sur le yaw, mais il nous est impossible donc de le contrôler un minimum afin de régler le PID.
Et il y a toujours le problème des “pairs de moteurs” (2 moteurs ont une vitesse bien supérieur aux 2 autres), et ce, même en vole.

Merci bien pour tout vos conseils, et bonne journée.

Comment arrivez vous a vérifié la vitesse de ces deux moteurs en vol exactement ?
Il y a deux notions, premièrement il y a le signal qui est envoyé au moteurs par le controleur pour la vitesse et ensuite l’interprétation de ce signal et traduit en un RPM.

Il faut bien s’assuré d’avoir calibré les ESC de la bonne manière, je vous suggère de regarder notre tutoriel qui vient d’etre mis en ligne ici:
Lynxmotion Quadrino Nano – Calibration avancée des ESC