-
Notifications
You must be signed in to change notification settings - Fork 9
/
HC_SR04_Ping_Servo.ino
143 lines (116 loc) · 4.61 KB
/
HC_SR04_Ping_Servo.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// AServo activated by an HC-SR04 via Arduino.
/*
This sketch reads a HC-SR04 ultrasonic rangefinder and returns
the distance to the closest object in range. To do this, it sends
a pulse to the sensor to initiate a reading, then listens for a
pulse to return. The length of the returning pulse is proportional
to the distance of the object from the sensor.
The Arduino then takes this information and initiates a series of
sweeps. A sweep is defined as the servo moving its horn from
the 0 position to 180 and back to 0 then to -180 and back to 0.
This code was developed partially from Ping))) code found in the
public domain is written by David A. Mellis and adapted to the HC-SRO4
by Tautvidas Sipavicius, servo code was provided the sweep example
that is included in the Arduino IDE, while other portions were written
by Charles Gantt and Curtis Gauger from
http://www.themakersworkbench.com.
This code was written for a tutorial on http://www.themakersworkbench.com,
and was designed for use in a project built by
The Young Makers of Greater Augusta. */
/*Tell the Arduino Ide to include the Servo.h library. */
#include <Servo.h>
/*Setup the variables for the HC-SR04 */
const int trigPin = 6;
const int echoPin = 7;
/*create servo object to control a servo
a maximum of eight servo objects can be created */
Servo myservo;
/*variable to store the servo position */
int pos = 0;
void setup() {
/*initialize serial communication: */
Serial.begin(9600);
/* attaches the servo on pin 9 to the servo object */
myservo.attach(9);
}
void loop()
{
/*establish variables for the duration of the ping,
and the distance result in inches and centimeters: */
long duration, inches, cm;
/*The sensor is triggered by a HIGH pulse of 10 or
more microseconds.
Give a short LOW pulse beforehand to ensure a clean HIGH pulse:*/
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
/*Read the signal from the sensor: 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(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
/*convert the time into a distance*/
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);
/*Tell the Arduino to print the measurement in the serial console*/
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
/* This if-else statement tells the Arduino at what distance
it should trigger the servo, what the servo should do,
and what it should do if the distance is too far away.*/
if (inches <= 24) {
sweep(3);
}
else if (inches >= 24) {
myservo.write(pos);
}
/*Tell the Arduino to wait 0.10 seconds before pinging the
Ultrasonic Sensor again.*/
delay(100);
}
/*Converts the microseconds reading to Inches*/
long microsecondsToInches(long microseconds)
{
/*According to Parallax datasheet for the PING sensor, there are
73.746 microseconds per inch (i.e. sound travels at 1130 feet per
second). This gives the distance traveled 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;
}
/*Converts the Microseconds Reading to Centimeters */
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 traveled. */
return microseconds / 29 / 2;
}
/*This sub-routine is what dictates the movement of the servo */
void sweep(int NUM_OF_CYCLES)
{
/* Tells the Arduino to start this loop at 0 and increment it by 1
each time the loop completes. This is how the Arduino knows to
stop the loop when a specific number of the
Sweep routine has been run. */
for (int j = 0; j < NUM_OF_CYCLES; j++)
/*goes from 0 degrees to 180 degrees */
for (pos = 0; pos < 180; pos += 1)
{ // in steps of 1 degree
/*tell servo to go to position in variable 'pos' */
myservo.write(pos);
/*waits 15ms for the servo to reach the position delay(10); }
goes from 180 degrees to 0 degrees */
for (pos = 180; pos >= 1; pos -= 1) {
/*tell servo to go to position in variable 'pos' */
myservo.write(pos);
/*waits 15ms for the servo to reach the position */
delay(10);
}
}