Выход 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
Кто-нибудь может мне объяснить, почему, как только я перестаю двигать гироскоп, значение возвращается в исходное положение? А можно ли перевести в градусы?
@Liam Ferretti, 👍2
Обсуждение1 ответ
GY-521 и MPU6050 функционально одинаковы, и вам нужно использовать одну из нескольких библиотек, чтобы получить то, что вы хотите. Похоже, вы получаете значения угловой скорости, но вам нужен относительный курс. Угловая скорость вернется к нулю (или какому-либо начальному значению), как только он перестанет двигаться, но курс (при правильном обращении) останется постоянным.
Я успешно использовал MPU6050 в нескольких проектах, используя библиотеку I2CDevLib Джеффа Роуберга, и хотя все настроить сложно, я рекомендую ее. см. этот пост для базовой настройки.
Также отмечу, что большая часть вашей программы не имеет вообще никакого отношения к гироскопу. Я рекомендую вам использовать самую маленькую и самую простую программу для решения аппаратных проблем, перед добавлением более сложных битов.
- Arduino Mega и ошибочные значения гироскопа
- Что означает “LSB на градус в секунду” (LSB per degree per second)?
- В чем разница между акселерометром, гироскопом и датчиком магнитометра?
- MPU-6050 - угловой дрейф
- Линейное ускорение от MPU 6050
- Arduino с 12-битным ЦАП (MCP4725) не работает
- Странное явление с avrdude: stk500v2_ReceiveMessage(): таймаут только с ATmega250 на windows 7x64
- Проанализировать большой ответ json с помощью ESP8266
Вы знаете, это то, что делают гироскопы. Они измеряют угловую скорость, а не угол. Когда вы перестаете вращать датчик, угловая скорость падает до нуля. Обычно можно объединить данные акселерометра и встроенного гироскопа, чтобы получить стабильное значение угла., @chrisl
См. этот вопрос на Stackexchange по электротехнике: [MPU6050 теряет ориентацию] (https://electronics.stackexchange.com/questions/604632/mpu6050-losing-orientation/604633), @ocrdu