Grove - 3-Axis Digital Accelerometer

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Grove - 3-Axis Digital Accelerometer

      Ich habe mir folgendes Modul für eine Batterie betriebene Schaltung ausgesucht,
      um den µC und den Rest der Schaltung bei Bedarf (durch Bewegung) zu aktivieren
      b.z.w. in den Schlafmodus zu schicken (in den Schrank legen):

      seeeddoc.github.io/Grove-3-Axis_Digital_Accelerometer-16g/

      Dafür gibt es interne Funktionsblöcke, die "aktiv" oder "inaktiv" im Interrupt-Register generieren.
      Das muss nur einmalig konfiguriert werden und man braucht sich nicht weiter darum kümmern.
      Ein Interrupt wird ggf. generiert, der µC wird "geweckt", schaut in das Register und kann die Arbeit beginnen.
      Durch das lesen des Registers werden die auslösenden Bits gelöscht.
      Genau das habe ich gesucht!

      Leider wollte das ganze anfangs nicht so recht klappen.
      Ich hatte nur den INT1 -Ausgang des Moduls mit dem µC verbunden (Irgendwie sah alles verdreht aus). a_27_b277ca12
      Letztendlich stellte sich heraus das der Ausgang INT1 des ADXL345 nicht mit dem Ausgang des Moduls INT1 verbunden ist.
      ADXL345 INT1 > Platine INT2 / ADXL345 INT2 > Platine INT1 !!!
      Das ist im Platinenlayout der Eagle-Files zu erkennen, nicht aber im Schaltplan.

      Ich hoffe, das Ihr nicht (mehr) darauf hereinfallt. ;)

      LG
    • Eine fertige Lib gibt es nicht (!?).
      Das Datenblatt ist aber ausreichend um die paar Register zu bewältigen........

      So könnte man anfangen:

      BASCOM Source Code

      1. Config Pind.2 = Input
      2. Config Int0 = Rising
      3. On Int0 Irq_adxl345
      4. Enable Int0
      5. Const Adxl345write = &HA6
      6. Const Adxl345read = &HA7
      7. Dim A0 As Integer
      8. Dim Adxl_dat(60) As Byte
      9. Dim Adxl_x As Integer At Adxl_dat Overlay
      10. Dim Adxl_y As Integer At Adxl_dat + 2 Overlay
      11. Dim Adxl_z As Integer At Adxl_dat + 4 Overlay
      12. Gosub Adxl345_init
      13. Do
      14. Gosub Adxl345
      15. Loop
      16. Adxl345_init:
      17. I2cstart
      18. I2cwbyte Adxl345write
      19. I2cwbyte &H24 'Reg 24 (Thresh_act)
      20. I2cwbyte &H02 'activity threshold
      21. I2cwbyte &H02 'Reg 25 inactivity threshold
      22. I2cwbyte &HFF 'Reg 26 255 sek inactivity time
      23. I2cwbyte &B1111_1111 'Reg 27 (Act_inact_ctl) Int1 / Int2
      24. I2cstop
      25. I2cstart
      26. I2cwbyte Adxl345write
      27. I2cwbyte &H2C
      28. I2cwbyte &B0000_0011 'Low-Power / 0,78 Hz
      29. I2cwbyte &B0011_1000 'Reg 2D (Power_ctl) =Link+Auto-Sleep
      30. I2cwbyte &B0001_1000 'Reg 2E (Int_enable) =Activity+Inactivity
      31. I2cwbyte &B1111_1111 'Reg 2F (Int_Map) =Activity an Int1
      32. I2cstop
      33. I2cstart
      34. I2cwbyte Adxl345write
      35. I2cwbyte &H31
      36. I2cwbyte &B0000_1011 'Full Res. / +-16g
      37. I2cstop
      38. Return
      39. Irq_adxl345:
      40. I2cstart
      41. I2cwbyte Adxl345write
      42. I2cwbyte &H2B
      43. I2cstart
      44. I2cwbyte Adxl345read
      45. I2crbyte Adxl_dat(7) , Nack
      46. I2cstop
      47. I2cstart
      48. I2cwbyte Adxl345write
      49. I2cwbyte &H30
      50. I2cstart
      51. I2cwbyte Adxl345read
      52. I2crbyte Adxl_dat(8) , Nack
      53. I2cstop
      54. If Adxl_dat(8).4 = 1 Then
      55. Print "Wecken--------"
      56. End If
      57. If Adxl_dat(8).3 = 1 Then
      58. Print "Schlafen-------"
      59. End If
      60. Print "Reg_2B= " ; Bin(adxl_dat(7)) ; " Reg_30= " ; Bin(adxl_dat(8))
      61. Return
      62. Adxl345:
      63. I2cstart
      64. I2cwbyte Adxl345write
      65. I2cwbyte &H32
      66. I2cstart
      67. I2cwbyte Adxl345read
      68. For A0 = 1 To 5
      69. I2crbyte Adxl_dat(a0) , Ack
      70. Next A0
      71. I2crbyte Adxl_dat(6) , Nack
      72. I2cstop
      73. Print "X= " ; Adxl_x ; " Y= " ; Adxl_y ; " Z= " ; Adxl_z
      74. Return
      Display All
      LG