Посоветуйте точный акселерометр

fire_on_line
Offline
Зарегистрирован: 25.02.2015

Друзья. 

Посоветуйте акселерометр, нужно мерять угол наклона до десятых градуса ( 10.3 например), cейчас пользуюсь ADXL335,  но или датчик не подходит, то ли руки кривые,  но десятые градуса реальности не соответствуют реальностию. Хелп

Пример кода что и спользуеться:

//////////////////////////////////////////////////////////////////
//©2011 bildr
//Released under the MIT License - Please reuse change and share
//Simple code for the ADXL335, prints calculated orientation via serial
//////////////////////////////////////////////////////////////////


//Analog read pins
const int xPin = 0;
const int yPin = 1;
const int zPin = 2;

//The minimum and maximum values that came from
//the accelerometer while standing still
//You very well may need to change these
int minVal = 265;
int maxVal = 402;


//to hold the caculated values
double x;
double y;
double z;


void setup(){
  Serial.begin(9600); 
}


void loop(){

  //read the analog values from the accelerometer
  int xRead = analogRead(xPin);
  int yRead = analogRead(yPin);
  int zRead = analogRead(zPin);

  //convert read values to degrees -90 to 90 - Needed for atan2
  int xAng = map(xRead, minVal, maxVal, -90, 90);
  int yAng = map(yRead, minVal, maxVal, -90, 90);
  int zAng = map(zRead, minVal, maxVal, -90, 90);

  //Caculate 360deg values like so: atan2(-yAng, -zAng)
  //atan2 outputs the value of -π to π (radians)
  //We are then converting the radians to degrees
  x = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI);
  y = RAD_TO_DEG * (atan2(-xAng, -zAng) + PI);
  z = RAD_TO_DEG * (atan2(-yAng, -xAng) + PI);

  //Output the caculations
  Serial.print("x: ");
  Serial.print(x);
  Serial.print(" | y: ");
  Serial.print(y);
  Serial.print(" | z: ");
  Serial.println(z);

  delay(100);//just here to slow down the serial output - Easier to read
}

 

James
Offline
Зарегистрирован: 26.02.2016
fire_on_line
Offline
Зарегистрирован: 25.02.2015

Пробовал, десятые градуса не соотвеисивуют реальности :(

James
Offline
Зарегистрирован: 26.02.2016

т.е. ты хочешь мерять диапазон в 180 гр. с точностью до десятой?

fire_on_line
Offline
Зарегистрирован: 25.02.2015

Да, или в диапазон 90, но с точностью до десятой, но что для этого взять, уже запутался.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

fire_on_line, откуда может взяться точность в 0.1, если Вы в скетче явно задаете погрешность в 1 градус?

fire_on_line
Offline
Зарегистрирован: 25.02.2015

Где именно? С тригонометрией у меня напряг )

Скейтч от сюда http://bildr.org/2011/04/sensing-orientation-with-the-adxl335-arduino

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А вот здесь:

int xAng = map(xRead, minVal, maxVal, -90, 90);

у Вас все вычисления в градусах - в целых числах. Меньше одного градуса так в принципе получить нельзя.

fire_on_line
Offline
Зарегистрирован: 25.02.2015

Мммммда, не обратих внимание, выдает то не ценые числа:

x: 355.71 | y: 353.58 | z: 213.69
x: 354.14 | y: 355.60 | z: 233.13
x: 354.29 | y: 354.29 | z: 225.00
x: 354.29 | y: 353.58 | z: 221.63
x: 354.14 | y: 354.14 | z: 225.00
x: 354.29 | y: 354.29 | z: 225.00
x: 354.43 | y: 354.43 | z: 225.00
 
ВН
Offline
Зарегистрирован: 25.02.2016
fire_on_line
Offline
Зарегистрирован: 25.02.2015

И????

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

"Функция map() использует целочисленные вычисления, поэтому не возвращает дробных значений, как это иногда ожидается. При этом дробная часть числа просто отбрасывается, без округления или вычисления средних значений."

Кроме того

//The minimum and maximum values that came from 
//the accelerometer while standing still
//You very well may need to change these
int minVal = 265;
int maxVal = 402;

то есть требуется калибровка, коэффициент преобразования mv\g надо знать точно.

 

James
Offline
Зарегистрирован: 26.02.2016

да там в статье все описано, даже как калибровать.