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
      Lokefar
      last edited by

      Has anyone already written a library for this sensor? Or are in the proces of doing so?
      Am a bit lost at the moment on how to write the sensor driver.

      The sensor is this one https://www.adafruit.com/products/1231

      L 1 Reply Last reply Reply Quote 0
      • 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