Выход GY-521 и градусы

Я пытаюсь создать обсерваторию с помощью двух гироскопов GY-521 и, используя выходы, мне нужно заставить двигатель двигаться, но у меня возникла проблема.

Когда я перемещаю один из двух гироскопов, выходные данные меняются, но затем, как только я оставляю его, он возвращается к исходному значению, данные, которые я вижу через ESP8266 на интернет-сайте, это код:

#include <Wire.h>
#include "WiFiEsp.h"
// Эмулируем Serial1 на контактах 6/7, если они отсутствуют
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(18, 19); // прием, передача
#endif

char ssid[] = "Vodafone-A61356555";            // SSID вашей сети (имя)
char pass[] = "YgtHnkJHNpFAcPfH";        // ваш сетевой пароль
int status = WL_IDLE_STATUS;     // статус радио Wi-Fi
int reqCount = 0;                // количество полученных запросов

WiFiEspServer server(80);

int MPU = 0x69;
int MPU1 = 0x69;
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
int16_t AcX1, AcY1, AcZ1, Tmp1, GyX1, GyY1, GyZ1;
int gyro_state = 2;
int gyro_state_1 = 3;
int RED_LED = 8;
int GREEN_LED = 9;

void setup(){
  pinMode(gyro_state, OUTPUT);
  pinMode(gyro_state_1, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  pinMode(GREEN_LED, OUTPUT);
  digitalWrite(gyro_state, HIGH);
  digitalWrite(gyro_state_1, HIGH);
  Wire.begin(); 
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // регистр PWR_MGMT_1
  Wire.write(0);     // установить в ноль (пробуждает MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(115200);
  // инициализируем последовательный порт для модуля ESP
  Serial1.begin(9600);
  // инициализируем модуль ESP
  WiFi.init(&Serial1);

  // проверяем наличие щита
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // не продолжать
    while (true);
  }

  // попытка подключения к сети Wi-Fi
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Подключиться к сети WPA/WPA2
    status = WiFi.begin(ssid, pass);
  }

  Serial.println("You're connected to the network");
  printWifiStatus();
  
  // запускаем веб-сервер на порту 80
  server.begin();
}

void loop() {
  // прослушивание входящих клиентов
  WiFiEspClient client = server.available();
  if (client) {
    Serial.println("New client");
    // HTTP-запрос заканчивается пустой строкой
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // если вы дошли до конца строки (получили перевод строки
        // символ) и строка пуста, HTTP-запрос завершился,
        // чтобы вы могли отправить ответ
        if (c == '\n' && currentLineIsBlank) {
          Serial.println("Sending response");
          
          // отправляем стандартный HTTP-заголовок ответа
          // используем \r\n вместо многих операторов println для ускорения отправки данных
          client.print(
            "HTTP/1.1 200 OK\r\n"
            //"Тип контента: text/html\r\n"
            "Connection: close\r\n"  // соединение будет закрыто после завершения ответа
            "Refresh: 5\r\n"
            "\r\n");
          client.print("<!DOCTYPE HTML>\r\n");
          client.print("<html>\r\n");
          client.print("<br>\r\n");
          client.print("Accelerometro Telescopio X: ");
          client.print(AcX);
          client.print("  Accelerometro Cupola X: ");
          client.print(AcX1);
          client.print("<br>\r\n");
          client.print("<br>\r\n");
          client.print("Accelerometro Telescopio Y: ");
          client.print(AcY);
          client.print("  Accelerometro Cupola Y: ");
          client.print(AcY1);
          client.print("<br>\r\n");
          client.print("<br>\r\n");
          client.print("Accelerometro Telescopio Z: ");
          client.print(AcZ);
          client.print("  Accelerometro Cupola Z: ");
          client.print(AcZ1);
          client.print("<br>\r\n");
          client.print("<br>\r\n");
          client.print("Giroscopio Telescopio X: ");
          client.print(GyX);
          client.print("  Giroscopio Cupola X: ");
          client.print(GyX1);
          client.print("<br>\r\n");
          client.print("<br>\r\n");
          client.print("Giroscopio Telescopio Y: ");
          client.print(GyY);
          client.print("  Giroscopio Cupola Y: ");
          client.print(GyY1);
          client.print("<br>\r\n");
          client.print("<br>\r\n");
          client.print("Giroscopio Telescopio Z: ");
          client.print(GyZ);
          client.print("  Giroscopio Cupola Z: ");
          client.print(GyZ1);
          client.print("<br>\r\n");
          client.print("<br>\r\n");
          client.print("Temperatura Telescopio: ");
          client.print(Tmp);
          client.print("  Temperatura Cupola: ");
          client.print(Tmp1);
          client.print("<br>\r\n");
          client.print("<br>\r\n");
          client.print("</html>\r\n");
          break;
        }
        if (c == '\n') {
          // вы начинаете новую строку
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // вы получили символ в текущей строке
          currentLineIsBlank = false;
        }
      }
    }
    // дать веб-браузеру время для получения данных
    delay(100);

    // закрыть соединение:
    client.stop();
    Serial.println("Client disconnected");
  }
  digitalWrite(gyro_state, HIGH);
  digitalWrite(gyro_state_1, LOW);

  do {
    Wire.beginTransmission(MPU);
    Wire.write(0x3B);  // начиная с регистра 0x3B (ACCEL_XOUT_H)
    Wire.endTransmission(false);
    Wire.requestFrom(MPU, 14, true);       // запрашиваем всего 14 регистров
    AcX = Wire.read() << 8 | Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
    AcY = Wire.read() << 8 | Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
    AcZ = Wire.read() << 8 | Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
    Tmp = Wire.read() << 8 | Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
    GyX = Wire.read() << 8 | Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
    GyY = Wire.read() << 8 | Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
    GyZ = Wire.read() << 8 | Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

    Tmp = Tmp / 340 + 36.53;
    
    Serial.println("First Gyro");
    Serial.println(GyZ);

    digitalWrite(gyro_state_1, HIGH);
    digitalWrite(gyro_state, LOW);
    delay(1000);

  } while(digitalRead(gyro_state)== HIGH);

  do {
    Wire.beginTransmission(MPU1);
    Wire.write(0x3B);  // начиная с регистра 0x3B (ACCEL_XOUT_H)
    Wire.endTransmission(false);
    Wire.requestFrom(MPU1, 14, true);       // запрашиваем всего 14 регистров
    AcX1 = Wire.read() << 8 | Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
    AcY1 = Wire.read() << 8 | Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
    AcZ1 = Wire.read() << 8 | Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
    Tmp1 = Wire.read() << 8 | Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
    GyX1 = Wire.read() << 8 | Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
    GyY1 = Wire.read() << 8 | Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
    GyZ1 = Wire.read() << 8 | Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

    Tmp1 = Tmp1 / 340 + 36.53;
    
    Serial.println("Second Gyro");
    Serial.println(Gy1);

    digitalWrite(gyro_state, HIGH);
    digitalWrite(gyro_state_1, LOW);
    delay(1000);


  } while(digitalRead(gyro_state_1) == HIGH);

  if (GyY > GyY1) {
    digitalWrite(9, HIGH);
    digitalWrite(8, LOW);
  }
  else if (GyY < GyY1) {
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
  }
}


void printWifiStatus() {
  // вывести SSID сети, к которой вы подключены
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // напечатать IP-адрес вашего WiFi-шилда
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  
  // печатать куда идти в браузере
  Serial.println();
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
  Serial.println();
}

Вывод:

First Gyro
1503
Second Gyro
3730
First Gyro
1558
Second Gyro
-162
First Gyro
1498
Second Gyro
-164

Кто-нибудь может мне объяснить, почему, как только я перестаю двигать гироскоп, значение возвращается в исходное положение? А можно ли перевести в градусы?

, 👍2

Обсуждение

Вы знаете, это то, что делают гироскопы. Они измеряют угловую скорость, а не угол. Когда вы перестаете вращать датчик, угловая скорость падает до нуля. Обычно можно объединить данные акселерометра и встроенного гироскопа, чтобы получить стабильное значение угла., @chrisl

См. этот вопрос на Stackexchange по электротехнике: [MPU6050 теряет ориентацию] (https://electronics.stackexchange.com/questions/604632/mpu6050-losing-orientation/604633), @ocrdu


1 ответ


1

GY-521 и MPU6050 функционально одинаковы, и вам нужно использовать одну из нескольких библиотек, чтобы получить то, что вы хотите. Похоже, вы получаете значения угловой скорости, но вам нужен относительный курс. Угловая скорость вернется к нулю (или какому-либо начальному значению), как только он перестанет двигаться, но курс (при правильном обращении) останется постоянным.

Я успешно использовал MPU6050 в нескольких проектах, используя библиотеку I2CDevLib Джеффа Роуберга, и хотя все настроить сложно, я рекомендую ее. см. этот пост для базовой настройки.

Также отмечу, что большая часть вашей программы не имеет вообще никакого отношения к гироскопу. Я рекомендую вам использовать самую маленькую и самую простую программу для решения аппаратных проблем, перед добавлением более сложных битов.

,