Tříosý akcelerometr ADXL345

Odpovědět
mozopom
Příspěvky: 4
Registrován: 21 lis 2020, 12:14
Reputation: 0

Tříosý akcelerometr ADXL345

Příspěvek od mozopom » 21 lis 2020, 12:25

Dobrý den,
mám základní desku Arduino UNO, akcelerometr ADXL345 a SD Data logger shield. Vše mi funguje, jen maximální naměřená hodnota je 2 G. V manuálech je, že tento akcelerometr dokáže měřit až v rozsahu +- 16 G. Nevěděli byste někdo prosím, jak nastavit větší maximální rozsah? Zde přikládám svůj kod. Děkuji předem za odpověď.

Kód: Vybrat vše

////////////////////////////////////////////////////////knihovny
#include <Wire.h>
#include <SD.h>
#include <SPI.h>
#include "RTClib.h"
#include <Adafruit_Sensor.h> 
#include <Adafruit_ADXL345_U.h>
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified();
/////////////////////////////////////////////////////piny
const int sd_CS = 10;
int ADXL345Pin = A4;
////////////////////////////////////////////////////nastavení času
RTC_DS1307 DS1307;
char seznamDni[7][8] = {"nedele", "pondeli", "utery", "streda", "ctvrtek", "patek", "sobota"};

void setup()
////////////////////////////////////////////////////nastavení času
{ Serial.begin(9600);
  if (! DS1307.begin()) {
    Serial.println("Hodiny nejsou pripojeny!");
    while (1);}
  if (! DS1307.isrunning()) {
    Serial.println("Hodiny nejsou spusteny! Spoustim nyni..");}
////////////////////////////////////////////////////nastavení SD karty
  SD.begin(sd_CS);
if (!SD.begin(sd_CS)) {
    Serial.println("SD karta neni pripojena nebo je vadna!");
    return;}
     Serial.begin(9600);  
   if(!accel.begin())
   {Serial.println("No ADXL345 sensor detected.");
      while(1);}
/////////////////////////////////////////////////čas - nejlepší bude tam dát 00:00:00 pro lepší čtení
   DS1307.adjust(DateTime(2020, 11, 21, 00, 00, 00));}
void loop(void) 
///////////////////////////////////////////////////nastavení času do smyčky - asi jen na sériovou linku
{DateTime datumCas = DS1307.now();
  Serial.print("Aktualni cas ");
  Serial.print(datumCas.hour());
  Serial.print(':');
  Serial.print(datumCas.minute());
  Serial.print(':');
  Serial.print(datumCas.second());
  Serial.print(", ");
  Serial.print(seznamDni[datumCas.dayOfTheWeek()]);
  Serial.print(" ");
  Serial.print(datumCas.day());
  Serial.print('.');
  Serial.print(datumCas.month());
  Serial.print('.');
  Serial.print(datumCas.year());
  Serial.println();
////////////////////////////////////////////////////////nastavení akcelerometru
   sensors_event_t event; 
   accel.getEvent(&event);
  accel.read16(ADXL345Pin);
  String X = String(event.acceleration.x/9.81);  X += "g    ";
  String Y = String(event.acceleration.y/9.81);  Y += "g    ";
  String Z = String(event.acceleration.z/9.81);  Z += "g    ";
////////////////////////////////////////////////////////čtení času a akcelerometru
  String dataString = X + Y + Z + (datumCas.hour()) + ":" + (datumCas.minute()) + ":" + (datumCas.second());
////////////////////////////////////////////////////////nastavení akcelerometru - jen na sériovou linku
  Serial.print("X: "); Serial.print(event.acceleration.x/9.81); Serial.print("  ");
   Serial.print("Y: "); Serial.print(event.acceleration.y/9.81); Serial.print("  ");
   Serial.print("Z: "); Serial.print(event.acceleration.z/9.81); Serial.print("  ");
   Serial.println("g ");
/////////////////////////////////////////////////////////vytvoření souboru na SD kartě
  File zapisDat = SD.open("mereni.txt", FILE_WRITE); 
    if(zapisDat) {
    zapisDat.println(dataString);
    zapisDat.close();}

    delay(500);}
    

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Tříosý akcelerometr ADXL345

Příspěvek od martinius96 » 21 lis 2020, 12:39

Ak sa pozrieš do hlavičkového súboru Adafruit_ADXL345_U.h, nájdeš tam:

Kód: Vybrat vše

typedef enum {
  ADXL345_RANGE_16_G = 0b11, ///< +/- 16g
  ADXL345_RANGE_8_G = 0b10,  ///< +/- 8g
  ADXL345_RANGE_4_G = 0b01,  ///< +/- 4g
  ADXL345_RANGE_2_G = 0b00   ///< +/- 2g (default value)
} range_t;

void setRange(range_t range);
Potrebuješ použiť setRange v tvojom programe po inicializácii senzora.

Kód: Vybrat vše

accel.setRange(ADXL345_RANGE_16_G);
Následne (aj predtým) si môžeš overiť danú hodnotu cez:

Kód: Vybrat vše

accel.getRange();
//
switch(accel.getRange())
  {
    case ADXL345_RANGE_16_G:
      Serial.print  ("16 "); 
      break;
    case ADXL345_RANGE_8_G:
      Serial.print  ("8 "); 
      break;
    case ADXL345_RANGE_4_G:
      Serial.print  ("4 "); 
      break;
    case ADXL345_RANGE_2_G:
      Serial.print  ("2 "); 
      break;
    default:
      Serial.print  ("?? "); 
      break;
  }  
  Serial.println(" g"); 

mozopom
Příspěvky: 4
Registrován: 21 lis 2020, 12:14
Reputation: 0

Re: Tříosý akcelerometr ADXL345

Příspěvek od mozopom » 21 lis 2020, 13:02

Super, děkuji,
v tom senzortestu to funguje (vypisuje to vyšší hodnoty a mám tam jako maximum 16 G), ale když přidám do mého kodu do funkce setup ten řádek setRange s tím jak jste psal, stále mi zrychlení nepřekročí 2 G. Pokud to totiž chápu správně, tak to setRange vložím do void setup.
Když tam zkusím přidat i to vypisování, tak mi to vypisuje:

13:24:32.026 -> 2 g
13:24:32.026 -> Aktualni cas 0:0:0, sobota 21.11.2020
13:24:32.059 -> X: -0.06 Y: -0.14 Z: 0.90 g
13:24:32.294 -> 2 g

Přitom při té zkoušce v Senzortest mi to vypisuje 16 G.

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Tříosý akcelerometr ADXL345

Příspěvek od martinius96 » 21 lis 2020, 14:55

Mal by si to vložiť do setupu za:

Kód: Vybrat vše

accel.begin()
Malo by to fungovať aj podľa posledného príspevku: https://forums.adafruit.com/viewtopic.php?f=25&t=51549

mozopom
Příspěvky: 4
Registrován: 21 lis 2020, 12:14
Reputation: 0

Re: Tříosý akcelerometr ADXL345

Příspěvek od mozopom » 21 lis 2020, 15:10

Už to funguje.
Děkuji za pomoc.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů