Bonjour à tous,
Je me suis penché sur la réalisation d'un petit drone quadcopter basé sur une arduino Uno (pour les tests, qui passera en arduino mini pro si je poursuis le projet), principalement pour comprendre les principes de fonctionnement et voir si le grand débutant que je suis arrivais à me débrouiller.
J'ai donc acheté le matériel minimal nécessaire pour faire des tests :
- carton plume pour la structure (design en croix, un moteur au bout de chaque branche)
- arduino uno / mini pro au centre
- 1 module Bluetooth HC-06 (pas top mais ça fait l'affaire)
- 2 moteurs miniatures avec pales, rotation horaire, branches du haut et du bas
- 2 moteurs miniatures avec pales, rotation anti-horaire, branches gauche et droite
- 4 transistors IRFZ44N
- 1 batterie LiPo 7,4v 250mAh
Le tout contrôlé par un smartphone Android, dans un premier temps pour transmettre la vitesse de rotation des moteurs.
La bonne nouvelle c'est que les moteurs tournent et que le drone décolle.
La mauvaise c'est qu'il part systématiquement d'un côté dès le départ -> un des moteurs tournent (beaucoup) plus vite que les autres alors qu'ils sont tous identiques, et qu'ils sont chacun contrôlés par une sortie PWM de l'arduino sur lesquelles j'envoie la même valeur (255 par exemple).
Si je comprends bien qu'il faille un IMU pour stabiliser son appareil en vol, je ne pensais pas qu'il serait nécessaire dès le décollage ...
Pourquoi l'appareil ne décolle pas à la verticale alors que la même vitesse de rotation est appliquée à chaque moteur ?
Je vous joins le schéma basique, et le code du programme ci-dessous, si besoin :
#include <Wire.h>
String s = "";
String p = "";
int bt_speed = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
stop_motor();
}
void loop() {
s = Serial.readString(); // 1255090
if (s==""){s=p;}
if (s!=""){
Serial.println(s);
bt_speed = s.substring(1,4).toInt();
p = s.substring(0,7);
} else{
if (bt_speed>0){
for(int i=bt_speed;i>=0;i--){bt_speed--;}
}
else{ bt_speed = 0; }
}
if (bt_speed==0){stop_motor();} else{dc_motor(bt_speed);}
Serial.println(bt_speed);
}
void dc_motor(int vitesse){
analogWrite(5,vitesse);
analogWrite(6,vitesse);
analogWrite(10,vitesse);
analogWrite(11,vitesse);
}
void stop_motor(){
analogWrite(5,0);
analogWrite(6,0);
analogWrite(10,0);
analogWrite(11,0);
}