This is an old revision of the document!
Currently a Work in Progress
In this lesson, we will connect an ultrasonic sensor to the Oak. An ultrasonic sensor, using the properties of sound, not only detect an object, but also how far away the object is. The sensor generates a high frequency sound, then listens to the echo received back to the sensor. The time interval from send to receive allows you to calculate the distance.
| Part | Quantity | Identification |
|---|---|---|
| Oak with soldered headers | 1 | |
| Breadboard | 1 | |
| Ultrasonic Sensor | 1 | US-100 Y401 |
| Jumper wires | 6 |
Note: The HC-SR04 sensor is NOT being used in this tutorial as it uses 5v. Instead a US-100 sensor, which operates from 3v - 5v is used.
Particle.publish will be used to send the sensor data to the cloud. To view the data, you will need a free Particle account, which you can get here if you done have one already: https://build.particle.io/signup.
The US-100 Ultrasonic sensor has a number of configurations available. In this example we will be configuring it for digital (PWM) mode. In order to do so first remove the jumper on the back of the sensor (with the jumper engaged, the sensor will be in analog mode). The rest of the connections are straight forward:
Here's a picture of the actual setup. Note the differences from the sketch: The sensor is facing outward from the breadboard, and the Oak is rotated 180 degrees. You can also see here that the jumper does NOT connect the 2 rear pins, thereby enabling digital mode.
The first part of our sketch is the variable declaration:
/* US-100 Ultrasonic distance sensor: VCC to Oak vcc GND x2 to Ground Rail to Oak Ground Trig to Oak Pin 2 Echo to Oak Pin 4 */ int trigPin = 2; // Trigger Pin int echoPin = 4; // Echo Pin int LEDPin = 1; // Onboard LED unsigned long Time_Echo_us = 0; // container for PulseIn data unsigned long Len_mm = 0; // variable for length conversion char post_Distance[16]; //particle post variable
Next we tell the Oak what the pins will be doing in the setup section:
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LEDPin, OUTPUT); // Use onboard LED for visual feedback
}
Now the loop portion. First we tell the sensor to send a sound:
void loop() {
//Make sure the trigger pin is off
digitalWrite(trigPin, LOW);
delay(100);
//tell the sensor to send its pulse
digitalWrite(trigPin, HIGH);
delay(10);
//end trigger
digitalWrite(trigPin, LOW);
Then listen for the echo:
// pulseIn HIGH starts measuring the time until it hears the echo Time_Echo_us = pulseIn(echoPin, HIGH); // Calculate distance to object. Divide by 2 because echo time is roundtrip Len_mm = (Time_Echo_us*34/100)/2;
Now that we have our data, let's use it:
//Send distance to cloud for viewing by Particle dashboard, and OakTerm
sprintf(post_Distance, "%04d", Len_mm); //convert int to string for Particle.publish
Particle.publish("distance in mm:", post_Distance); //invoke Particle.publish
/*
Use onboard LED for visual feedback: off for out of range, on for in range
Hook up and RGB LED to change colors based on distance
*/
if((Len_mm < 3000) && (Len_mm > 1)) { // Length effective range (1, 3000).
digitalWrite(LEDPin, HIGH);
}
else {
digitalWrite(LEDPin, LOW);
}
delay(1000);
}
Our setup in action: