Hallo,
ich bin noch Arduino-Neuling und brauche einmal Hilfe.
Ich arbeite momentan an einem Versuchsaufbau, bei dem ich mit einem MPU6050 Sensor die Drehgeschwindigkeit überwache.
Der Sensor ist mit einem HC-06 Bluetooth-Modul verbunden, das habe ich so als fertige Lösung gekauft (siehe: https://www.amazon.de/Bluetooth-MPU6050-Ausgang-Beschleunigungsmesser-Gyroskop/dp/B01LXXHUDR). Es wird lt Hersteller ein Kalmanfilter verwendet, als Werte bekomme ich Beschleunigung, Winkelgeschwindigkeit und Winkel je Raumachse plus die Temperatur.
Empfangen wird das ganze per HC-05 Modul mit einem Arduino.
Dieser erstellt abhängig von der empfangenen Winkelgeschwindigkeit eine Rechteckspannung, über deren Frequenz ich die Winkelgeschwindigkeit mit einem Messgerät bestimmen kann.
Ich habe in einem Versuch festgestellt, dass der so ausgelesene Wert der tatsächlichen Drehgeschwindigkeit um etwa 55ms hinterher läuft.
Der Sensor gibt die Werte in einer Frequenz von 100 Werten pro Sekunde aus, also ist der beste Wert eine Verzögerung von 10ms.
Ich habe mir einmal die Zeit ausgeben lassen, die der Arduino für das Durchlaufen seiner Schleife braucht und bekam da einen maximalen Wert von 2ms. Ich frage mich, wo die übrige Verzögerung herkommt. Ist die Schnittstelle etwa so langsam?
Ich würde intuitiv vermuten, dass der Chip mit dem Sensor noch weitere Verzögerungen verursacht, leider ist das für mich eine Blackbox.
Mein Code:
/*
This code is used for connecting arduino to serial mpu6050 module, and test in arduino uno R3 board.
connect map:
arduino mpu6050 module
VCC 5v/3.3v
TX RX<-0
TX TX->1
GND GND
note:
because arduino download and mpu6050 are using the same serial port, you need to un-connect 6050 module when you want to download program to arduino.
Created 14 Nov 2013
by Zhaowen
serial mpu6050 module can be found in the link below:
http://item.taobao.com/item.htm?id=19785706431
*/
//#include <SoftwareSerial.h>
#include<math.h>
#include <toneAC.h>
unsigned char Re_buf[11],counter=0;
unsigned char sign=0;
unsigned int frequency; //Zero-frequency/offset
unsigned int freqRef=0; //Reference frequency from the loop before
unsigned int res=30; //Auflösung: +1°/sek -> +10Hz
float a[3],w[3],angle[3],T; //Arrays for acceleration, angular speed, angle and temperature
//int pinTone = 10; //Output pin for frequency
short i=0; //Counter of loops. Used for indication of successful connection
short axis = 1; //axis of measurement. 0: x across direction of BT-module, 1: y along direction of BT-module, 2 = z;
void setup() {
pinMode(13,OUTPUT);
digitalWrite(13, LOW); //Indication for connection. Default LOW
Serial.begin(115200); //Initialize serial. Baud rate of 115200 is fixed on the sensor
digitalWrite(12,HIGH);
}
void loop(){
if(sign)
{
i=0;
sign=0;
if(Re_buf[0]==0x55) //检查帧头 -- Check the header
{
switch(Re_buf [1])
{
case 0x51:
a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;
a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;
a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x52:
w[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*2000;
w[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*2000;
w[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*2000;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x53:
angle[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*180;
angle[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*180;
angle[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*180;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
frequency = 2500 + round(w[axis]);
toneAC(frequency);
//digitalWrite(pinTone, HIGH);
//Serial.print("a:");
//Serial.print(a[0]);Serial.print(" ");
//Serial.print(a[1]);Serial.print(" ");
//Serial.print(a[2]);Serial.print(" ");
//Serial.print("w:");
/*Serial.print("x:");
Serial.print(round(10*w[0])/10);Serial.print(";");
Serial.print("y:");
Serial.print(round(10*w[1])/10);Serial.print(";");*/
Serial.print("z:");
//Serial.print(axis); Serial.print(":");
Serial.print(round(w[2]));Serial.println(";");
// Serial.println(frequency);
// Serial.print("angle:");
/* Serial.print(angle[0]+180);Serial.print(";");
Serial.print(angle[1]+180);Serial.print(";");
Serial.println(angle[1]+180); Serial.print(" ");*/
/* Serial.print("T:");
Serial.println(T);*/
break;
}
}
}
else{
i++;
if(i>10000){
digitalWrite(13,LOW); //Wait for a high number of loops. If still no connection to BT, turn off LED
}
}
}
void serialEvent() {
while (Serial.available()) {
digitalWrite(13,HIGH); //Indicate successful data transfer from BT
//char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code
Re_buf[counter]=(unsigned char)Serial.read();
if(counter==0&&Re_buf[0]!=0x55) return; //第0号数据不是帧头 -- No. 0 data is not a header
counter++;
if(counter==11) //接收到11个数据 -- Received 11 data
{
counter=0; //重新赋值,准备下一帧数据的接收 -- Reassigned, ready to receive the next frame of data
sign=1;
}
}
}