Одноосевой стабилизатор на MPU6050 и серво

Нам понадобятся:
- Arduino UNO
- Сервопривод SG-90
- Макетная плата
- Гироскоп MPU6050
- Много проводочков 😊
Сервопривод подключаем на 9 порт (желтый провод — на 9, красный — 5В, черный — земля). Гироскоп подключаем на 5В, землю и аналоговые входы А4 и А5. SDA на А4, SCL на А5.
В Arduino заливаем следующий код. Код разработан самостоятельно, в Интернете этого кода нет.
#include <Wire.h>
#include <Servo.h>
const int MPU_addr=0x68; int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
int minVal=265; int maxVal=402;
int servoPovorotUgol = 0;
int servoPovorotUgolChernovik = 0;
double UgolNaklonaPoX; double y; double z;
Servo servoX;
void setup(){
servoX.attach(9, 500, 500);
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop(){
servoX.write(0);
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true);
AcX=Wire.read()<<8|Wire.read();
AcY=Wire.read()<<8|Wire.read();
AcZ=Wire.read()<<8|Wire.read();
int xAng = map(AcX,minVal,maxVal,-90,90);
int yAng = map(AcY,minVal,maxVal,-90,90);
int zAng = map(AcZ,minVal,maxVal,-90,90);
UgolNaklonaPoX= round(RAD_TO_DEG * (atan2(-yAng, -zAng)+PI));
y= round(RAD_TO_DEG * (atan2(-xAng, -zAng)+PI));
z= round(RAD_TO_DEG * (atan2(-yAng, -xAng)+PI));
Serial.print("Угол по оси Х = ");
Serial.print(UgolNaklonaPoX);
if(UgolNaklonaPoX > 270 && UgolNaklonaPoX < 360){
servoPovorotUgolChernovik = 360 - UgolNaklonaPoX;
servoPovorotUgol = 90 - servoPovorotUgolChernovik;
}
else if(UgolNaklonaPoX > 0 && UgolNaklonaPoX < 90){
servoPovorotUgol = 90 + UgolNaklonaPoX;
}
servoX.write(servoPovorotUgol);
Serial.println("*");
Serial.print("Команда на серво:");
Serial.println(servoPovorotUgol);
Serial.println("-----------------------------------------");
delay(100);
}
Видео с демонстрацией работы сервопривода можно посмотреть здесь.