Ultrasonic unit reads erroneous distance



  • Hello, I have a M5 CoreInk onto which I have plugged a Ultrasonic sensor. I am getting a buggy distance read all the time.

    [-] bad distance: 4294967.500000
    [-] bad distance: 4294967.500000
    [-] bad distance: 4294967.500000
    

    My code is very much taken from this example.

    This is how I initialized Wire. I am not sure about this Wire.begin(21,22). It is taken from this code, but this other code uses other values...

    void setup() {
    
        M5.begin(); //Init CoreInk.  
        if( !M5.M5Ink.isInit()) //Init CoreInk screen.
        {
            Serial.printf("[-] M5Ink init failed");  
            while (1) delay(100);
        }
    
        Wire.begin(21,22);
        Serial.printf("[+] Wire begin done\n");
        
        M5.M5Ink.clear();   //Clear screen.  
        ...
    

    And this is how I read distance. This looks good to me...

    #define M5_I2C_ADDR_ULTRASONIC 0x57
    float readDistance() {
      uint32_t data;
      Wire.beginTransmission(M5_I2C_ADDR_ULTRASONIC); 
      Wire.write(0x01);
      Wire.endTransmission(); 
      delay(120);
      Wire.requestFrom(M5_I2C_ADDR_ULTRASONIC,3); 
      data  = Wire.read();data <<= 8;
      data |= Wire.read();data <<= 8;
      data |= Wire.read();
      return float(data) / 1000; // distance in mm
    }
    

    and then the loop - can't see anything wrong either...

    void loop() {
      static float newvalue = 0;
      newvalue = readDistance();
      if ((newvalue < 1500) && (newvalue > 0)) {
        Serial.printf("Distance: ",newvalue);
      } else {
        Serial.printf("[-] bad distance: %f\n",newvalue);
      
      }
      delay(100);
    
    }
    

    Can you help me spot the error? Or is my sensor faulty? or is something different with CoreInk?

    Thanks



  • I fixed my problem using

    Wire.begin(32,33);
    

    The distance now makes sense. I don't know what these values are for, though...

    Also, my distance is not precise. I'll investigate and post again if the problem persists.



  • The distances I get are really strange:

    • The values are well below or well above the expected ones. For example, for a distance of ~95cm the sensor answers 4.5cm. For a distance of ~110cm, 4.9cm. For ~35cm, 3.7cm etc.
    • The values change for the same distance. So different measures of ~200cm gives 13.7cm or 79.6cm the next time...

    The command Wire.begin(32,33) seems correct as I realize those are the ports for the sensor on the CoreInk.

    So, what am I doing wrong?