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

    Maxbotix Ultrasonic/Ultrasound sensor MB7137 for Lopy

    Scheduled Pinned Locked Moved LoPy
    lopyi2c
    3 Posts 2 Posters 5.5k Views 3 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.
    • I Offline
      innovpoint
      last edited by jmarcelino

      Hi,

      I have 1 sensor I2C MB7137 : (Datasheet: http://www.m axbotix.com/documents/XL-TrashSonar-WR_Datasheet.pdf)

      I need to mesure the distance with this sensor like on arduino:

      Arduino code resume:

      /* RANGE SENSOR */
      #define SensorAddress byte(0x70)            // send 112 address
      #define RangeCommand byte(0x51)             // send 81 address
      
      void setup(){
         configureRangeSensor()
      }
      
      void loop()
      {
      takeRangeReading()
      requestRange()
      }
      
      
      
      void configureRangeSensor(){
          //sensor:
          Wire.begin();
          delay(100);
      } 
      
      //Commands the sensor to take a range reading
      void takeRangeReading(){
             Wire.beginTransmission(SensorAddress);             //Start addressing 
             Wire.write(RangeCommand);                          //send range command 
             Wire.endTransmission();                            //Stop and do something else now
      } 
      //Returns the last range that the sensor determined in its last ranging cycle in centimeters. Returns 0 if there is no communication. 
      word requestRange(){ 
          Wire.requestFrom(SensorAddress, byte(2));
                  if(Wire.available() >= 2){                   //Sensor responded with the two bytes 
                 byte HighByte = Wire.read();                  //Read the high byte back 
                 byte LowByte = Wire.read();                   //Read the low byte back 
                 word range = word(HighByte, LowByte);     //Make a 16-bit word out of the two bytes for the range 
                 return range; 
              }
              else { 
              return word(0);                                  //Else nothing was received, return 0 
          }
      } 
      

      I need to convert for python for lopy:

      My code not work:

      from time import sleep_ms
      from machine import I2C
      
      # Default Address
      MB7137_I2C_DEFAULT_ADDR = 0x70   #112 ADDRESS
      
      # Commands
      CMD_MEASURE_DISTANCE = 0x51 #81 ADDRESS
      
      
      i2c = I2C(0, I2C.MASTER, baudrate=250000)
      
      
      class MB7137(object):
        
        print ("start:")
      
        def __init__(self, i2c=None):
          self.i2c = i2c
          self.addr = MB7137_I2C_DEFAULT_ADDR
          self.cbuffer = bytearray(2)
          self.cbuffer[1] = 0x00
          
        def write_command(self, command_byte):
          print ("write:")
          self.cbuffer[0] = command_byte
          self.i2c.writeto(self.addr, self.cbuffer)
      
        def readDistance(self):
          print ("read:")
          self.write_command(CMD_MEASURE_DISTANCE)
          sleep_ms(25)
          dist = self.i2c.readfrom(self.addr, 3)
          dist2 = dist[0] << 8
          dist2 = dist2 | dist[1]
          return  dist
      
      
      sensor = MB7137()
      sensor.__init__(MB7137_I2C_DEFAULT_ADDR)
      sensor.write_command()
      sensor.readDistance()
      

      Help please :)

      1 Reply Last reply Reply Quote 1
      • J Offline
        jmarcelino
        last edited by jmarcelino

        Olá innovpoint!

        I don't have that sensor, but some suggestions:

        1. Lower your I2C speed, the sensor is very slow you don't to use a fast speed: i2c = I2C(0, I2C.MASTER, baudrate=100000) is enough

        2. In readDistrance you do sleep_ms(25) but the datasheet recommends waiting 100ms (the Arduino code polls for data, but not sure you have to)

        3. In your main code sensor.write_command() has no purpose, that's a function used by readDistance

        Hope this helps

        ps: I formatted up the code in your post, next time please use the forum Markdown syntax using ``` to start/end code blocks

        1 Reply Last reply Reply Quote 1
        • I Offline
          innovpoint
          last edited by

          Ok..

          Solved:

          from machine import I2C
          import time

          ADDR = 0x70
          CMD = 0x51

          configure the I2C bus

          i2c = I2C(0, I2C.MASTER, baudrate=250000)

          i2c.writeto(ADDR, bytes([CMD]))
          time.sleep(0.5)
          dist = i2c.readfrom(ADDR, 2)
          total = (dist[0]*255)+dist[1]

          print(total)

          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