Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    ADXL 345 (from Adafruit)

    Scheduled Pinned Locked Moved Discussion
    adxl345accelerometersensoradafruitsensors
    14 Posts 6 Posters 4.2k Views 6 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • L Offline
      livius @Lokefar
      last edited by

      @Lokefar
      look here - should be simple to convert
      https://github.com/pimoroni/adxl345-python/blob/master/adxl345.py

      think about people first, then computers

      L 1 Reply Last reply Reply Quote 0
      • L Offline
        Lokefar @livius
        last edited by

        @livius Thanks. I will look into that one.

        1 Reply Last reply Reply Quote 0
        • L Offline
          Lokefar
          last edited by

          Have been trying to write a library for the sensor (Or at least a class that can be turned into a library), but I can't seem to get it to work. This is the code I have written and it is inspired by this https://github.com/pimoroni/adxl345-python/blob/master/adxl345.py

          Any help would be greatly appreciated!

          import time
          from machine import I2C
          
          
          ADXL345_ADDR = 0x53
          
          i2c = I2C(0, I2C.MASTER, baudrate=100000)
          
          BW_RATE_100HZ = 0x0B
          POWER_CTL = 0x2D 
          MEASURE = 0x08
          DATA_FORMAT = 0x31
          AXES_DATA = 0x32
          BW_RATE = 0x2C
          RANGE_2G = 0x00
          SCALE_MULTIPLIER = 0.004
          EARTH_GRAVITY_MS2 = 9.80665
          
          class ADXL345(object):
          	
          
          	def __init__(self, i2c=None):
          		self.i2c = i2c
          		self.addr = ADXL345_ADDR
          		print('One')
          		self.setBandwidthRate(BW_RATE_100HZ)
          		self.setRange(RANGE_2G)
          		self.enableMeasurement()
          
          	def enableMeasurement(self):
          		i2c.writeto(self.addr, bytes(POWER_CTL))
          		i2c.writeto(self.addr, bytes(MEASURE)) 
          
          	def setBandwidthRate(self, rate_flag):
          		print('Two')
          		i2c.writeto_mem(self.addr, bytes(BW_RATE)
          
          	def setRange(self, range_flag):
          		value = i2c.readfrom_mem(self.addr, bytes(DATA_FORMAT))
          		print('here')
          		value &= ~0x0F;
          		value |= range_flag;
          		value |= 0x08;
          
          		i2c.writeto(self.addr, DATA_FORMAT, value)
          
          	def getAxes(self, gforce = False):
          		bytes = i2c.readfrom(self.addr, AXES_DATA, 6)
          
          		x = bytes[0] | (bytes[1] << 8)
          		if(x & (1 << 16 - 1)):
          			x = x - (1<<16)
          
          		y = bytes[2] | (bytes[3] << 8)
          		if(y & (1 << 16 - 1)):
          			y = y - (1<<16)
          
          		z = bytes[4] | (bytes[5] << 8 )
          		if(z & (1 << 16 - 1)):
          			z = z - (1<<16)
          
          		x = x * SCALE_MULTIPLIER
          		y = y * SCALE_MULTIPLIER
          		z = z * SCALE_MULTIPLIER
          
          		if gforce == False: 
          			x = x * EARTH_GRAVITY_MS2
          			y = y * EARTH_GRAVITY_MS2
          			z = z * EARTH_GRAVITY_MS2
          
          		x = round(x,4)
          		y = round(y,4)
          		z = round(z,4)
          
          		return {"x": x, "y": y, "z": z}
          print('Start')
          
          for i in range(0,10):
          	adxl345 = ADXL345()
          	axes = adxl345.getAxes(True)
          	print(axes['x'])
          	sleep_ms(25)
          

          Also for some reason the LED light on the expansion board has started to blink blue again.

          L 1 Reply Last reply Reply Quote 0
          • R Offline
            rikkertmark
            last edited by

            @Lokefar

            I Think the heartbeat is Enabled

            Please put the following code in your main.py or boot.py

            import pycom
            
            pycom.heartbeat(False)
            

            I hope this is the solution for your blue light problem

            1 Reply Last reply Reply Quote 0
            • L Offline
              livius @Lokefar
              last edited by livius

              @Lokefar

              i do not have this sensor to test but i have fixed some errors:

              import time
              from machine import I2C
              
              
              ADXL345_ADDR = 0x53
              
              i2c = I2C(0, I2C.MASTER, baudrate=100000)
              
              BW_RATE_100HZ = 0x0B
              POWER_CTL = 0x2D 
              MEASURE = 0x08
              DATA_FORMAT = 0x31
              AXES_DATA = 0x32
              BW_RATE = 0x2C
              RANGE_2G = 0x00
              SCALE_MULTIPLIER = 0.004
              EARTH_GRAVITY_MS2 = 9.80665
              
              class ADXL345(object):
              	
              
              	def __init__(self, i2c=None):
              		self.i2c = i2c
              		self.addr = ADXL345_ADDR
              		print('One')
              		self.setBandwidthRate(BW_RATE_100HZ)
              		self.setRange(RANGE_2G)
              		self.enableMeasurement()
              
              	def enableMeasurement(self):
              		i2c.writeto(self.addr, bytes([POWER_CTL]))
              		i2c.writeto(self.addr, bytes([MEASURE])) 
              
              	def setBandwidthRate(self, rate_flag):
              		print('Two')
              		i2c.writeto_mem(self.addr, BW_RATE, bytes([rate_flag]))
              
              	def setRange(self, range_flag):
              		value = i2c.readfrom_mem(self.addr, DATA_FORMAT, bytes([range_flag]))
              		print('here')
              		value &= ~0x0F;
              		value |= range_flag;
              		value |= 0x08;
              
              		i2c.writeto(self.addr, DATA_FORMAT, value)
              
              	def getAxes(self, gforce = False):
              		bytes = i2c.readfrom(self.addr, AXES_DATA, 6)
              
              		x = bytes[0] | (bytes[1] << 8)
              		if(x & (1 << 16 - 1)):
              			x = x - (1<<16)
              
              		y = bytes[2] | (bytes[3] << 8)
              		if(y & (1 << 16 - 1)):
              			y = y - (1<<16)
              
              		z = bytes[4] | (bytes[5] << 8 )
              		if(z & (1 << 16 - 1)):
              			z = z - (1<<16)
              
              		x = x * SCALE_MULTIPLIER
              		y = y * SCALE_MULTIPLIER
              		z = z * SCALE_MULTIPLIER
              
              		if gforce == False: 
              			x = x * EARTH_GRAVITY_MS2
              			y = y * EARTH_GRAVITY_MS2
              			z = z * EARTH_GRAVITY_MS2
              
              		x = round(x,4)
              		y = round(y,4)
              		z = round(z,4)
              
              		return {"x": x, "y": y, "z": z}
              print('Start')
              
              for i in range(0,10):
              	adxl345 = ADXL345()
              	axes = adxl345.getAxes(True)
              	print(axes['x'])
              	sleep_ms(25)
              

              think about people first, then computers

              L 1 Reply Last reply Reply Quote 0
              • B Offline
                bucknall
                last edited by

                Hey @Lokefar this looks really cool! I'd love to add it to our libraries repository on GitHub!

                When you finish and wish to share it, feel free to drop a pull request at https://github.com/pycom/pycom-libraries and we'll happily add it to our example library :)

                Developer Evangelist - Pycom

                L 1 Reply Last reply Reply Quote 0
                • L Offline
                  Lokefar @livius
                  last edited by

                  @livius Thanks for the fixes. However, I still get an error:

                    File "main.py", line 79, in <module>
                    File "main.py", line 27, in __init__
                    File "main.py", line 39, in setRange
                  TypeError: can't convert bytes to int
                  

                  The problem seems to be with this line:

                  value = i2c.readfrom_mem(self.addr, DATA_FORMAT, bytes([range_flag]))
                  

                  I noticed that you changed BW_RATE to an int instead of a hex. Tried changing DATA_FORMAT to 49 but that didn't solve the issue.

                  L 1 Reply Last reply Reply Quote 0
                  • L Offline
                    Lokefar @bucknall
                    last edited by

                    @bucknall Will do :)

                    1 Reply Last reply Reply Quote 1
                    • L Offline
                      livius @Lokefar
                      last edited by

                      @Lokefar said in ADXL 345 (from Adafruit):

                      I noticed that you changed BW_RATE to an int instead of a hex. Tried changing DATA_FORMAT to 49 but that didn't solve the issue.

                      i revert this - this was only my try and forgot to revert

                      this line should be:

                      value = i2c.readfrom_mem(self.addr, DATA_FORMAT, range_flag)
                      

                      think about people first, then computers

                      1 Reply Last reply Reply Quote 0
                      • L Offline
                        livius
                        last edited by

                        @Lokefar any progress? :)

                        think about people first, then computers

                        L 1 Reply Last reply Reply Quote 0
                        • L Offline
                          Lokefar @livius
                          last edited by

                          @livius Yup I got it working. Just looking into cleaning up the code and add a few things then I will make it available for all to use :)

                          1 Reply Last reply Reply Quote 1
                          • A Offline
                            arthurlutz
                            last edited by

                            @Lokefar I'm happy to help with clean up and testing your code.

                            1 Reply Last reply Reply Quote 0
                            • D Offline
                              Divij Vignesh
                              last edited by

                              @Lokefar Can you post the final working code for this sensor with lopy 4?

                              1 Reply Last reply Reply Quote 0

                              Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                              Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                              With your input, this post could be even better 💗

                              Register Login
                              • 1 / 1
                              • First post
                                Last post

                              Pycom on Twitter

                              Pycom