Open form

3-osiowy akcelerometr ADXL345 i Arduino

Poradnik przedstawia sposób, w jaki można zmierzyć przyspieszenie korzystając z modułu ADXL345 za pomocą Arduino.

 

W przykładzie wykorzystano następujące elementy:

 

Podłączenie czujnika z Arduino:

Moduł komunikuje się za pośrednictwem popularnej magistrali I2C. Zatem połączenie z Arduino należy wykonać w następujący sposób:

 

Moduł ADXL345 Pin Arduino
VCC 5 V
GND GND
SCL A5
SDA A4

 

 

 

Schemat podłączenia modułu ADXL345 z Arduino Uno.

 

Program do Arduino

Na początku bibliotekę należy dodać do środowiska Arduino (Szkic -> Include Library -> Add .ZIP Library...). W przykładzie został wykorzystany następujący kod:

 

  1. #include
  2. #include
  3. #include
  4. //Przypisanie ID
  5. Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
  6. void displaySensorDetails(void)
  7. {
  8. sensor_t sensor;
  9. accel.getSensor(&sensor);
  10. Serial.println("------------------------------------");
  11. Serial.print ("Czujnik: "); Serial.println(sensor.name);
  12. Serial.print ("Wersja sterownika: "); Serial.println(sensor.version);
  13. Serial.print ("ID: "); Serial.println(sensor.sensor_id);
  14. Serial.print ("Wartosc maksymalna: "); Serial.print(sensor.max_value); Serial.println(" m/s^2");
  15. Serial.print ("Wartosc minimalna: "); Serial.print(sensor.min_value); Serial.println(" m/s^2");
  16. Serial.print ("Rozdzielczosc: "); Serial.print(sensor.resolution); Serial.println(" m/s^2");
  17. Serial.println("------------------------------------");
  18. Serial.println("");
  19. delay(500);
  20. }
  21. void displayDataRate(void)
  22. {
  23. Serial.print ("Predkosc danych: ");
  24. switch(accel.getDataRate())
  25. {
  26. case ADXL345_DATARATE_3200_HZ:
  27. Serial.print ("3200 ");
  28. break;
  29. case ADXL345_DATARATE_1600_HZ:
  30. Serial.print ("1600 ");
  31. break;
  32. case ADXL345_DATARATE_800_HZ:
  33. Serial.print ("800 ");
  34. break;
  35. case ADXL345_DATARATE_400_HZ:
  36. Serial.print ("400 ");
  37. break;
  38. case ADXL345_DATARATE_200_HZ:
  39. Serial.print ("200 ");
  40. break;
  41. case ADXL345_DATARATE_100_HZ:
  42. Serial.print ("100 ");
  43. break;
  44. case ADXL345_DATARATE_50_HZ:
  45. Serial.print ("50 ");
  46. break;
  47. case ADXL345_DATARATE_25_HZ:
  48. Serial.print ("25 ");
  49. break;
  50. case ADXL345_DATARATE_12_5_HZ:
  51. Serial.print ("12.5 ");
  52. break;
  53. case ADXL345_DATARATE_6_25HZ:
  54. Serial.print ("6.25 ");
  55. break;
  56. case ADXL345_DATARATE_3_13_HZ:
  57. Serial.print ("3.13 ");
  58. break;
  59. case ADXL345_DATARATE_1_56_HZ:
  60. Serial.print ("1.56 ");
  61. break;
  62. case ADXL345_DATARATE_0_78_HZ:
  63. Serial.print ("0.78 ");
  64. break;
  65. case ADXL345_DATARATE_0_39_HZ:
  66. Serial.print ("0.39 ");
  67. break;
  68. case ADXL345_DATARATE_0_20_HZ:
  69. Serial.print ("0.20 ");
  70. break;
  71. case ADXL345_DATARATE_0_10_HZ:
  72. Serial.print ("0.10 ");
  73. break;
  74. default:
  75. Serial.print ("???? ");
  76. break;
  77. }
  78. Serial.println(" Hz");
  79. }
  80. void displayRange(void)
  81. {
  82. Serial.print ("Zakres: +/- ");
  83. switch(accel.getRange())
  84. {
  85. case ADXL345_RANGE_16_G:
  86. Serial.print ("16 ");
  87. break;
  88. case ADXL345_RANGE_8_G:
  89. Serial.print ("8 ");
  90. break;
  91. case ADXL345_RANGE_4_G:
  92. Serial.print ("4 ");
  93. break;
  94. case ADXL345_RANGE_2_G:
  95. Serial.print ("2 ");
  96. break;
  97. default:
  98. Serial.print ("?? ");
  99. break;
  100. }
  101. Serial.println(" g");
  102. }
  103. void setup(void)
  104. {
  105. Serial.begin(9600);
  106. Serial.println("--- Test akcelerometru ADXL345 ---"); Serial.println("");
  107. //Inicjalizacja modułu
  108. if(!accel.begin())
  109. {
  110. //Błąd połączenia
  111. Serial.println("Nie wykryto czujnika ... Sprawdz polaczenie!");
  112. while(1);
  113. }
  114. //Wybór zakresu
  115. accel.setRange(ADXL345_RANGE_16_G);
  116. // displaySetRange(ADXL345_RANGE_8_G);
  117. // displaySetRange(ADXL345_RANGE_4_G);
  118. // displaySetRange(ADXL345_RANGE_2_G);
  119. //Wyświetelnie informacji
  120. displaySensorDetails();
  121. //Wyświetlenie ustawień dodatkowych
  122. displayDataRate();
  123. displayRange();
  124. Serial.println("");
  125. }
  126. void loop(void)
  127. {
  128. sensors_event_t event;
  129. accel.getEvent(&event);
  130. //Wyświetlenie wyników w m/s^2)
  131. Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print(" ");
  132. Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print(" ");
  133. Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print(" ");Serial.println("m/s^2 ");
  134. delay(500);
  135. }

 

Program wyświetla przyspieszenie w trzech osiach podane w m/s^2. Efekty działania programu możemy zobaczyć poniżej:

 

Zrzut ekranu szeregowego monitora.

zapraszamy do współpracy!