Un moteur sans balais, ou « moteur sans balais », ou un moteur synchrone autoguidé à aimants permanents, est un type de moteur synchrone dont le rotor est composé d'un ou plusieurs aimants permanents et est équipé d'un équipement d'origine. Capteur de position du rotor : Capteur à effet Hall, résolveur synchrone, codeur rotatif (type codeur incrémental) ou tout autre système permettant à la machine de s'autocontrôler.
Le programme Arduino:
Fonction de mise à jour de la vitesse du moteur :
void SetSpeedMotor(double *PitchRollYaw, byte Vitesse_0, double Gain)
{
double P=PitchRollYaw[0];
double R=PitchRollYaw[1];
double Y=PitchRollYaw[2];
double Vitesse=Vitesse_0+Gain*(P+R);
M1.write(Vitesse);
}
Fonction de lecture de données brutes du capteur
void ReadGY521_0( long *GyAccTempp)
{
long GATCorr_0[NumData]={0,0,0,0,0,0,0};
ReadGY521(GyAccTemp,GATCorr_0);
}
Le programme complet
#include<Wire.h>
#include <math.h>
#include <Servo.h>
#define NumData 7
#define pi 3.1415926535897932384626433832795
#define MPU 0x68
#define PinM1 9
Servo M1;
long GyAccTemp[NumData];
long GATCorr[NumData]={0,0,0,0,0,0,0};
double PitchRoll[3];
void setup()
{
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(19200);
M1.attach(PinM1);
}
void loop()
{
ReadGY521_0(GyAccTemp);
ComputeAngle(GyAccTemp, PitchRoll);
SetSpeedMotor(PitchRoll,90, 0.5);
}
void SetSpeedMotor(double *PitchRollYaw, byte Vitesse_0, double Gain)
{
double P=PitchRollYaw[0];
double R=PitchRollYaw[1];
double Y=PitchRollYaw[2];
double Vitesse=Vitesse_0+Gain*(P+R);
M1.write(Vitesse);
}
void ReadGY521( long *GyAccTempp, long *GATCorrr)
{
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU,14,true);
for (long i=0;i<NumData;i++)
{
if(i!=3)
{
GyAccTempp[i]=(Wire.read()<<8|Wire.read()) - GATCorrr[i];
}
else
{
GyAccTempp[i]=(Wire.read()<<8|Wire.read()) - GATCorrr[i];
GyAccTempp[i] = GyAccTempp[i]/340 + 36.53;
}
}
}
void ReadGY521_0( long *GyAccTempp)
{
long GATCorr_0[NumData]={0,0,0,0,0,0,0};
ReadGY521(GyAccTemp,GATCorr_0);
}
void ComputeAngle(long *GyAccTempp, double *PitchRol)
{
double x,y,z, X, Y, Z;
x= (double)GyAccTempp[0];
y= (double)GyAccTempp[1];
z= (double)GyAccTempp[2];
X=sqrt((y*y) + (z*z));
Y=sqrt((x*x) + (z*z));
Z=sqrt((x*x) + (y*y));
PitchRol[0] = atan(x/X);
PitchRol[
1] = atan(y/Y);
PitchRol[2] = atan(z/Z);
PitchRol[0] = PitchRol[0] * (180.0/pi);
PitchRol[1] = PitchRol[1] * (180.0/pi) ;
PitchRol[2] = PitchRol[2] * (180.0/pi) ;
Post a Comment