Tuesday, February 18, 2014

Ultrasonic Programming- Matt Mannino

While we are in the process of waiting for parts to come in, we started working on some of the programming.  Since we already have the Ultrasonic sensor, I started working on a program for the "hopper".  This program uses the Parallax 2x16 Serial LCD backlit display, the Parallax Ultrasonic Ping sensor, and the Arduino Mega.  The current version displays current readings from the Ultrasonic Sensor on the LCD display.  It is in the process of being able to detect if the hopper is full or not.

The setup with the Ping sensor and LCD display

LCD display showing current status



#include <SoftwareSerial.h>

const int TxPin = 18;
const int pingPin = 30;

SoftwareSerial mySerial = SoftwareSerial(255, TxPin);

void setup()
{
  // initialize serial communication:
  Serial.begin(9600);
}

void loop()
{
  // establish variables for duration of the ping,
  // and the distance result in inches and centimeters:
  long duration, inches, cm;
  int timer = 0;

  pinMode(TxPin, OUTPUT);
  digitalWrite(TxPin, HIGH);

  mySerial.begin(9600);
  delay(100);
  mySerial.write(12);                 // Clear          
  mySerial.write(17);                 // Turn backlight on
  delay(5);                           // Required delay

  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);

  // The same pin is used to read the signal from the PING))): a HIGH
  // pulse whose duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);

  // convert the time into a distance
  inches = microsecondsToInches(duration);
  cm = microsecondsToCentimeters(duration);

  mySerial.print(inches);
  mySerial.print("in, ");
  mySerial.print(cm);
  mySerial.print("cm");
  mySerial.println();

  delay(5);

  if(inches < 3)
  {
    mySerial.write(13);
    mySerial.print("Filling");

  if(timer > 10)
  {
    mySerial.write(13);
    mySerial.write(12);                 // Clear
    mySerial.print("Hopper Full");
  }
    timer ++;
  }
  else
  {
    mySerial.write(13);
    mySerial.print("Empty");
  }
}

long microsecondsToInches(long microseconds)
{
  // According to Parallax's datasheet for the PING))), there are
  // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
  // second).  This gives the distance travelled by the ping, outbound
  // and return, so we divide by 2 to get the distance of the obstacle.
  // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
  return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
}

No comments:

Post a Comment