Rörelse kontrollerad ultraljud lampa (3 / 9 steg)
Steg 3: Skriva Arduino koden
När du har är allt ansluten upp nästa steg att koppla Arduino till datorn och börja skriva koden för det. Du kan hämta koden eller kopiera och klistra in nedan, men innan du kan köra det, måste du ladda ner NewPing Arduino bibliotek och packa upp den till mappen Arduino bibliotek.
/ * BEGIN ARDUINO KOD * /
/ * IMPORTERA nödvändiga bibliotek * / < br > #include //Import "NewPing" biblioteket för den ultraljudssensorer
#include //Import server biblioteket
/ * DEKLARERA ALLA VARIABLER * /
int bild = 0; Skjut detektor variabel
booleska vänster = false; Lämnade sant/falskt variabel
booleska center = false; Center sant/falskt variabel
booleska höger = sant; Alldeles sant/falskt varialbe
#define leftTrig 8 //left sensor utdata Arduino pin
#define leftEcho 9 //left sensor Arduino ingångsstift
#define centerTrig 10 //center sensor utdata Arduino pin
#define centerEcho 11 / / center sensor Arduino ingångsstift
#define rightTrig 12 //right sensor utdata Arduino pin
#define rightEcho 13 //right sensor Arduino ingångsstift
Servo servoRotate; Servo som roterar lampan
Servo servoUpDown; Servo som kommer att flytta lampan upp/ner
int servoRotatePin = 4; Roterande servo Arduino pin
int servoUpDownPin = 5; //Vertical servo Arduino pin
CONST int maxD = 20; cm; Maximalt avstånd
långa int lastTouch = -1; MS
int resetAfter = 2000. MS
int afterSlideDelay = 500. MS; alla bilder ignoreras efter lyckade bilden
int afterSlideOppositeDelay = 1500; vänstra bilderna ignoreras efter framgångsrika högra bilden
int SLIDELEFT_BEGIN = -1; Motion har identifierats från höger
int SLIDELEFT_TO_CENTER = -2; motion har identifierats från höger till mitten
int SLIDENONE = 0; Ingen motion upptäcktes
int SLIDERIGHT_BEGIN = 1; motion har identifierats från vänster
int SLIDERIGHT_T0_CENTER = 2; motion har identifierats från vänster till mitten
int centerDistance;
/ * SETUP SERIAL MONITOR OCH SERVON * /
void setup()
{
Serial.BEGIN(9600);
servoRotate.attach (servoRotatePin, 0, 180);
servoUpDown.attach (servoUpDownPin, 0, 180);
servoRotate.write(0);
}
/ * PING ULTRALJUDSSENSORER, BERÄKNA BILDEN STATUS * /
void loop()
{
vänster = ping (leftTrig, leftEcho); Skicka ping till vänster sensor
Center = ping (centerTrig, centerEcho); Skicka ping till center sensor
höger = ping (rightTrig, rightEcho); Skicka ping till rätt censor
centerDistance = getDistance (centerTrig, centerEcho); få objekt avstånd från centrum sensor
Om det finns något upptäcks av snensors, lagra tid att "sista touch"
om (vänster || center || rätt) {
lastTouch=millis();
}
Om tiden senast kände är större än återställningstiden, återställa bilden variabeln
om (millis ()-lastTouch > resetAfter)
{
bild = 0;
Serial.println ("Återställ bild och timer");
}
Upptäcka en bild till höger
om (bild > = SLIDENONE) {
om ((till vänster) & & (! rätt))
bild = SLIDERIGHT_BEGIN;
om (center & & (bild == SLIDERIGHT_BEGIN))
bild = SLIDERIGHT_T0_CENTER;
om (rätt & & (bild == SLIDERIGHT_T0_CENTER)) {
slideNow('R');
}
}
Upptäcka en bild till vänster
om (bild < = SLIDENONE) {
om (rätt & & (! vänster))
bild = SLIDELEFT_BEGIN;
om (center & & bild == SLIDELEFT_BEGIN)
bild = SLIDELEFT_TO_CENTER;
om (vänster & & bild == SLIDELEFT_TO_CENTER) {
slideNow('L');
}
}
upptäcka centrum avstånd
IF(Slide) {
om (center & & (! vänster) & & (! rätt)) {
om (centerDistance) {
verticalMove(centerDistance);
}
}
}
Delay(50); MS
}
/ * FUNKTION FÖR ATT SKICKA UT EN PING * /
booleska ping (int trigPin, int echoPin) / /, int ledPin)
{
int d = getDistance (trigPin, echoPin); cm
booleska pinActivated = false;
om (d < maxD) {
pinActivated = sant;
} annat {
pinActivated = false;
}
återvända pinActivated;
}
/ * FUNKTION FÖR ATT FÅ OCH CACLULATE AVSTÅND * /
int getDistance (int trigPin, int echoPin)
{
lång varaktighet, tum, cm;
pinMode (trigPin, produktionen);
digitalWrite (trigPin, låg);
delayMicroseconds(2);
digitalWrite (trigPin, hög);
delayMicroseconds(10);
digitalWrite (trigPin, låg);
pinMode (echoPin, ingång);
längd = pulseIn (echoPin, hög);
tum = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);
Return(inches);
Return(cm);
}
/ * KONVERTERA MIKROSEKUNDER TILL INCHES
lång microsecondsToInches(long microseconds)
{
återvända mikrosekunder / 74 / 2;
}
*
* KONVERTERA MIKROSEKUNDER TILL CENTIMETER * /
lång microsecondsToCentimeters(long microseconds)
{
återvända mikrosekunder / 29 / 2;
}
/ * BILD VÄNSTER OCH BILDEN RÄTT RÖRELSE FUNKTIONER * /
void slideNow(char direction) {
om ("R" == riktning) {
servoRotation('R');
Serial.println ("rotera höger");
}
om ("L" == riktning) {
servoRotation('L');
Serial.println ("rotera vänster");
}
Delay(afterSlideDelay);
bild = SLIDENONE;
}
/ * UPP OCH NER RÖRELSE FUNKTIONER * /
int verticalMove (int originalDistance) {
om (originalDistance > 0 & & originalDistance < = 10) {
servoVertical('D');
Serial.Print ("flytta ner:");
Serial.println(originalDistance);
} else om (originalDistance < = 30) {
servoVertical('U');
Serial.Print ("flytta upp:");
Serial.println(originalDistance);
}
Delay(afterSlideDelay);
bild = SLIDENONE;
}
/ * SERVO ROTATION FUNKTIONEN * /
void servoRotation(char whichway) {
int currentPos = servoRotate.read();
om ('R' == whichway) {
servoRotate.write(currentPos + 15);
} else om ('L' == whichway) {
servoRotate.write (currentPos - 15);
}
}
/ * SERVO UPP/NER FUNKTION * /
void servoVertical(char upOrDown) {
int currentPos = servoUpDown.read();
om ('U' == upOrDown) {
servoUpDown.write (currentPos - 25);
} else om (hade ' == upOrDown) {
servoUpDown.write(currentPos + 25);
}
}