Example Code for Arduino-Ultrasonic Ranging

This article offers a detailed tutorial on utilizing Arduino for ultrasonic ranging, covering essential hardware and software setup, wiring instructions, and sample code to accurately measure distances with sensors. Designed for beginners, it guides readers through each step, ensuring successful implementation. Readers will also find tips on configuring settings like transceiver modes and baud rates to optimize performance.

Hardware Preparation

Software Preparation

Wiring Diagram

Connection Diagram

Other Preparation Work

Before burning the code, please switch the transceiver mode switch of the expansion board to AUTO, and the run/compile switch to OFF; after burning the code, switch the run/compile switch to ON, and select the serial port baud rate of 115200.

Sample Code

uint8_t Com[8] = {0x01,0x03,0x01,0x01,0x00,0x01,0xd4,0x36};
void setup()
{
  Serial.begin(115200);    
}
void loop()
{
  int Distance =readDistance();
  Serial.print("Distance = ");
  Serial.print(Distance);
  Serial.println(" mm");
  delay(500);
}

int readDistance(void)
{
  uint8_t Data[10] = {0};
  uint8_t ch = 0;
  bool flag = 1;
  int Distance = 0;
  while (flag) {
    delay(100);
    Serial.write(Com, 8);
    delay(10);
    if (readN(&ch, 1) == 1) {
      if (ch == 0x01) {
        Data[0] = ch;
        if (readN(&ch, 1) == 1) {
          if (ch == 0x03) {
            Data[1] = ch;
            if (readN(&ch, 1) == 1) {
              if (ch == 0x02) {
                Data[2] = ch;
                if (readN(&Data[3], 4) == 4) {
                  if (CRC16_2(Data, 5) == (Data[5] * 256 + Data[6])) {
                    Distance = Data[3] * 256 + Data[4];
                    //Serial.println(Distance);
                    flag = 0;
                  }
                }
              }
            }
          }
        }
      }
    }
    Serial.flush();

  }
  return Distance;
}

uint8_t readN(uint8_t *buf, size_t len)
{
  size_t offset = 0, left = len;
  int16_t Tineout = 500;
  uint8_t  *buffer = buf;
  long curr = millis();
  while (left) {
    if (Serial.available()) {
      buffer[offset] = Serial.read();
      offset++;
      left--;
    }
    if (millis() - curr > Tineout) {
      break;
    }
  }
  return offset;
}

unsigned int CRC16_2(unsigned char *buf, int len)
{
  unsigned int crc = 0xFFFF;
  for (int pos = 0; pos < len; pos++)
  {
    crc ^= (unsigned int)buf[pos];
    for (int i = 8; i != 0; i--)
    {
      if ((crc & 0x0001) != 0)
      {
        crc >>= 1;
        crc ^= 0xA001;
      }
      else
      {
        crc >>= 1;
      }
    }
  }

  crc = ((crc & 0x00ff) << 8) | ((crc & 0xff00) >> 8);
  return crc;
}

Result

View the distance value detected by the sensor through the serial port.

Result

Was this article helpful?

TOP