Справка - Поиск - Участники - Войти - Регистрация
Полная версия: Arduino Nano
Частный клуб Алекса Экслера > Программирование
Chingiz
7 сентября 2015, 14:52
Есть тут спецы по сабжевой железке?
Решил я начать с ней разбираться, а вот со скрещиванием двух железок у меня случились несрастушки.

Вот такой код нашёл на просторах интернета.

CODE
#include <Wire.h>
#include <ADXL345.h>


ADXL345 adxl; //variable adxl is an instance of the ADXL345 library

void setup(){
Serial.begin(9600);
adxl.powerOn();

//set activity/ inactivity thresholds (0-255)
adxl.setActivityThreshold(75);//75 def //62.5mg per increment
adxl.setInactivityThreshold(75);//75 def //62.5mg per increment
adxl.setTimeInactivity(0); // how many seconds of no activity is inactive?

//look of activity movement on this axes - 1 == on; 0 == off
adxl.setActivityX(1);
adxl.setActivityY(1);
adxl.setActivityZ(1);

//look of inactivity movement on this axes - 1 == on; 0 == off
adxl.setInactivityX(1);
adxl.setInactivityY(1);
adxl.setInactivityZ(1);

//look of tap movement on this axes - 1 == on; 0 == off
adxl.setTapDetectionOnX(0);
adxl.setTapDetectionOnY(0);
adxl.setTapDetectionOnZ(1);

//set values for what is a tap, and what is a double tap (0-255)
adxl.setTapThreshold(50); //62.5mg per increment
adxl.setTapDuration(15); //625μs per increment
adxl.setDoubleTapLatency(80); //1.25ms per increment
adxl.setDoubleTapWindow(200); //1.25ms per increment

//set values for what is considered freefall (0-255)
adxl.setFreeFallThreshold(7); //(5 - 9) recommended - 62.5mg per increment
adxl.setFreeFallDuration(45); //(20 - 70) recommended - 5ms per increment

//setting all interupts to take place on int pin 1
//I had issues with int pin 2, was unable to reset it
adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT,  ADXL345_INT1_PIN );
adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT,  ADXL345_INT1_PIN );
adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT,  ADXL345_INT1_PIN );
adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT,   ADXL345_INT1_PIN );
adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT,  ADXL345_INT1_PIN );

//register interupt actions - 1 == on; 0 == off
adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT, 1);
adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT,  1);
adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
}

void loop(){

//Boring accelerometer stuff  
int x,y,z;

adxl.readAccel(&x, &y, &z); //read the accelerometer values and store them in variables x,y,z
 

//Fun Stuff!  
//read interrupts source and look for triggerd actions

//getInterruptSource clears all triggered actions after returning value
//so do not call again until you need to recheck for triggered actions
byte interrupts = adxl.getInterruptSource();

// freefall
if(adxl.triggered(interrupts, ADXL345_FREE_FALL)){
 Serial.println("freefall");
 //add code here to do when freefall is sensed
}

//inactivity
if(adxl.triggered(interrupts, ADXL345_INACTIVITY)){
 Serial.println("inactivity");
 //add code here to do when inactivity is sensed
}

//activity
if(adxl.triggered(interrupts, ADXL345_ACTIVITY)){
 //Serial.println("activity");
 //add code here to do when activity is sensed

// Output x,y,z values - Commented out
Serial.print(x);
Serial.print(' ');
Serial.print(y);
Serial.print(' ');
Serial.println(z);
}

//double tap
if(adxl.triggered(interrupts, ADXL345_DOUBLE_TAP)){
 Serial.println("double tap");
 //add code here to do when a 2X tap is sensed
}

//tap
if(adxl.triggered(interrupts, ADXL345_SINGLE_TAP)){
 Serial.println("tap");
 //add code here to do when a tap is sensed
}

delay (1000);
}


Прошивается он нормально. Отрабатывает прилично, но!
Показывает на выходе примерно следующую картину:
CODE

-128 -270 511
-127 -271 511
-129 -270 511
-130 -270 511
-128 -270 511
-128 -270 511
-128 -270 511
-129 -270 511
-129 -270 511
-128 -269 511
-129 -271 511
-129 -270 511
-129 -270 511
-128 -270 511


Ну, это дребезжание это понятно. Цифры тоже понятны. Только вот проблемка с параметром Z какая-то. Он вне зависимости от положения датчика стоит в HIGH положении 511. Может что-то не так всё-таки в коде?
Или самому датчику амба?

Плюс, очень интересная штука - когда поворачиваешь датчик больше чем на 90 градусов от горизонта в любую сторону - то на выход он не выдаёт цифры, а говорит Inactivity.


Подключение примерно такое как на картинке. Только датчик другой версии, но контакты те же.

user posted image
Chingiz
7 сентября 2015, 15:22
Взял другой код из интернетов. Всё разрешилось.
Можно закрывать тему.
Эта версия форума - с пониженной функциональностью. Для просмотра полной версии со всеми функциями, форматированием, картинками и т. п. нажмите сюда.
Invision Power Board © 2001-2017 Invision Power Services, Inc.
модификация - Яро & Серёга
Хостинг от «Зенон»Сервера компании «ETegro»