Pages: [1]   Go Down
Author Topic: Reading serial data from maxSonar ultrasonic rangefinder  (Read 2413 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi all, just started with arduino and thought I would share this. There seems to be plenty on using the analog or pulse width outputs from the MaxSonar products but nothing about their serial use. This simple function reads the incoming serial data, converts it to an integer and returns the result.

A few things to note first.

     - The serial output on the MAxSonar is always enabled unless told otherwise. Attempting to hook it up directly to the serial port will cause communication problems between arduino and computer.

     - Serial data is inverted from the MaxSonar, to remove the need for extra circuitry I have used the very handy function in SoftwareSerial to flip the signal

     - This should work for all LV-EZ* and XL* modules, however the range returned will either be inches or centimeters depending on the type.

Code:
/* test function to Parse data from MaxSonar serial data
 and return integer */

#include <SoftwareSerial.h>

#define txPin 3                                            //define pins used for software serial for sonar
#define rxPin 2

SoftwareSerial sonarSerial(rxPin, txPin, true);            //define serial port for recieving data, output from maxSonar is inverted requiring true to be set.



boolean stringComplete = false;

void setup()
{
  Serial.begin(9600);                                      //start serial port for display
  sonarSerial.begin(9600);                                 //start serial port for maxSonar
  delay(500);                                              //wait for everything to initialize

}

void loop()
{
  int range = EZread();
  if(stringComplete)
  {
    stringComplete = false;                                //reset sringComplete ready for next reading

    Serial.print("Range ");
    Serial.println(range);
    //delay(500);                                          //delay for debugging
  }
}


int EZread()
{
  int result;
  char inData[4];                                          //char array to read data into
  int index = 0;


  sonarSerial.flush();                                     // Clear cache ready for next reading

  while (stringComplete == false) {
    //Serial.print("reading ");    //debug line

      if (sonarSerial.available())
    {
      char rByte = sonarSerial.read();                     //read serial input for "R" to mark start of data
      if(rByte == 'R')
      {
        //Serial.println("rByte set");
        while (index < 3)                                  //read next three character for range from sensor
        {
          if (sonarSerial.available())
          {
            inData[index] = sonarSerial.read();
            //Serial.println(inData[index]);               //Debug line

            index++;                                       // Increment where to write next
          } 
        }
        inData[index] = 0x00;                              //add a padding byte at end for atoi() function
      }

      rByte = 0;                                           //reset the rByte ready for next reading

      index = 0;                                           // Reset index ready for next reading
      stringComplete = true;                               // Set completion of read to true
      result = atoi(inData);                               // Changes string data into an integer for use
    }
  }

  return result;
}


Hope this helps someone out there. Thanks to everyone who posts their code, I would never have got anywhere without you.
Logged

Global Moderator
UK
Offline Offline
Brattain Member
*****
Karma: 302
Posts: 26338
I don't think you connected the grounds, Dave.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I don't understand the presence of the flag "stringComplete".
If I'm reading that correctly, "EZreadead" doesn't return (blocks) unless it has a complete reading, so the flag is redundant.
Logged

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

AWOL: I am looking to get the same information using TTL. Should I use a different approach than softwareserial?
I specifically ordered a maxbotix rangefinder that uses TTL logic, thinking that it would be easier to interface with the arduino UNO than RS-232 but I see no examples on how to communicate with it using TTL.
Should I post this as a new topic? My apololgies for digging up an old one.
Logged

Global Moderator
UK
Offline Offline
Brattain Member
*****
Karma: 302
Posts: 26338
I don't think you connected the grounds, Dave.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

It should be just as easy using TTL, just keep in mind that unlike RS232, TTL is not normally inverted.
Logged

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks for this Goldthing.
Does anyone out there know how to get a serial (apparently the most accurate) mm resolution reading from a HRLV unit ?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
I work in computer repair, technical support, I am a pianist, and I moderate several Bible studies.
I am an employee for MaxBotix Inc. Any question or comment under this user name is my opinion and does not represent MaxBotix Inc.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

A couple of days ago, I was helping a user with support for this topic (remember I work for MaxBotix), and I noticed that by default when reading the 1mm resolution from the MB1013 if the target was under 1 meter in distance, the Arduino would only read 3 numbers.  As soon as the target was further than 1 meter, the Arduino would output all 4 numbers.

Attached is the code that I gave this end user for support with this topic.

The information given, is from my personal experience and does not represent MaxBotix Inc. in any way.

* TTL_ArduinoCode_Parsing.ino (2.47 KB - downloaded 51 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi all,
In order to get the above serial code to resolve 1mm resolution the array has to be changed to 5 characters (from four), otherwise the last digit is not stored (giving you unrounded cm results as opposed to mm results).

Change from:
char inData[4];                                          //char array to read data into
to:
char inData[5];                                          //char array to read data into

AND...
Change from:
while (index < 3)
to:
while (index < 4)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
I work in computer repair, technical support, I am a pianist, and I moderate several Bible studies.
I am an employee for MaxBotix Inc. Any question or comment under this user name is my opinion and does not represent MaxBotix Inc.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Thank you for the correction.  I will make that change in my code, I appreciate this.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

What is the purpose of the line:

#define txPin 3   

(And isn't the specific usage of #define outdated?)
I do not current have anything connected to Pin 3 and the code seems to work fine.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
I work in computer repair, technical support, I am a pianist, and I moderate several Bible studies.
I am an employee for MaxBotix Inc. Any question or comment under this user name is my opinion and does not represent MaxBotix Inc.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

It tells the Arduino that this pin may not be used.

I tried removing this part of the code, and I kept getting errors because it wasn't defined.   So to keep from having a headache, I just removed it.

if anyone has a better way to using the serial data connection, please let me know.
Logged

Pages: [1]   Go Up
Jump to: