CS4985 Projekt: rörelse Scanner (4 / 5 steg)
Steg 4: Steg 4: kodning enheten
Nu när vi har allt samman, dess tid vi få det att fungera. Första saker först, öppna upp din Arduino programvara. Se till att du väljer rätt enheten och starta ett nytt projekt.
När du är redo, är det dags att börja med vår första installationen. Vi börjar genom att definiera våra konstanter, bifoga filer och variabler.
#include
#define trig 8 //Trig pin
#define echo 9 //Echo pin
#define serv 10 //Servo pin
#define loopDuration 60 //Duration av scan loop
#define alertDuration 30 //Duration av registrering
lång varaktighet, initialDistance, scannedDistance, timer, alertTimer;
Servo servo;
int servoPosition;
bool alertMode;
bool positiveMovement;
Nästa är setup. Här vi ställa in vår första variabler som vi kommer att använda direkt. Placera av servo är inställd, stiften är mappade och den inledande läsning läses i. Det är en 2.1 sekunders fördröjning övergripande innan installationen slutförs.
void setup() {
servoPosition = 45;
positiveMovement = 1;
timer = 0;
alertMode = 0;
servo.attach(serv);
servo.write(servoPosition);
pinMode (trig, OUTPUT);
pinMode (echo, indata);
Serial.BEGIN(9600);
Delay(1000);
Serial.println("INITIALIZING...");
Delay(1000);
Serial.println("Initialized.");
initialScan();
Delay(100);
}
Nu till det viktigaste kretsar. Kontrolleras villkoren och kommer att köra baserat på resultatet. Nämligen, om programmet är i alert läge, det kommer att göra en specifik scan bara för det läget. Om inte, kontrollerar den om slingan är över, och om så är fallet kommer att flytta servo till en ny position och ta en ny behandling och nollställa timern. Annars, det kontrollerar för rörelse och öka timern.
void loop() {
om (alertMode) {
alertScan();
} else om (timer > loopDuration) {
adjustServo();
initialScan();
timer = 0;
} annat {
movementCheck();
timer ++;
}
Delay(10);
}
alertScan handtag informera användaren det har varit ett problem och nedräkningen för hela alert. Om alert tid är upp utan problem, det slutar aviseringen och återgå till normala genomsökningen. Annars kommer det upplysa användaren om situationen och räkna ner.
void alertScan() {
om (alertTimer > = alertDuration) {
alertMode = 0;
initialScan();
Serial.println ("Alert slutade. Återgå till det normala. ");
Delay(50);
initialScan();
} annat {
Serial.Print ("Alert pågår. Tid kvar: ");
Serial.println (alertDuration - alertTimer);
movementCheck();
alertTimer ++;
Delay(10);
}
}
initialScan får avståndet som resten av skanningar kommer att jämföras med. Sensorn kommer att sända ut ultraljud vågor och sedan läsa dem i. Läs i data är sedan omvandlas till inches och visas i den seriella monitorn.
void initialScan() {
digitalWrite (trig, låg);
delayMicroseconds(2);
digitalWrite (trig, hög);
delayMicroseconds(10);
digitalWrite (trig, låg);
längd = pulseIn (echo, hög);
initialDistance = varaktighet / 148; Konverterar till inches
Serial.Print ("övervakning avstånd:");
Serial.Print(initialDistance);
Serial.println("\"");
Delay(100);
}
movementCheck inte samma sak som initialScan, men sedan jämförs resultaten från början Läs i avståndet. Om det finns inga problem, sedan fortsätter loopen. Annars ställer alertMode till true.
}
void movementCheck() {
digitalWrite (trig, låg);
delayMicroseconds(2);
digitalWrite (trig, hög);
delayMicroseconds(10);
digitalWrite (trig, låg);
längd = pulseIn (echo, hög);
scannedDistance = varaktighet / 148;
Delay(100);
om (alertMode) {
hemkomst.
}
om (scannedDistance > initialDistance + 2 || scannedDistance < initialDistance - 2) {
Serial.Print ("fråga upptäcks. Avstånd på: ");
Serial.Print(scannedDistance);
Serial.println("\"");
Serial.println ("Alert pågår.");
alertMode = 1;
alertTimer = 0;
timer-= 50;
Delay(10);
}
}
adjustServo är vad hanterar justeringen av sensorns aktuella rotationsvinkel. För närvarande används 45, 90 och 135 grader, även om detta kan vara justerade hur du behöver. Dröjsmål efter servo.write är att kompensera för skiftande eller rörelse som annars skulle orsaka problem med avläsningarna.
void adjustServo() {
om (alertMode) {
Serial.println ("Lockdown pågår.");
hemkomst.
}
om (positiveMovement) {
servoPosition += 45;
} else om (! positiveMovement) {
servoPosition-= 45;
}
servo.write(servoPosition);
Delay(500);
Serial.Print ("aktuella rotationsvinkel:");
Serial.println(servoPosition);
om (servoPosition == 135) {
positiveMovement = 0;
} else om (servoPosition == 45) {
positiveMovement = 1;
}
}
Här är den fullständiga koden. Känn dig fri att ändra och använda det som du tycker passar.
/ * Nicholas Rowe
CS4985
Rörelsen Scanner
*/
#include < Servo.h >
#define trig 8
#define echo 9
#define serv 10
#define loopDuration 60
#define alertDuration 30
lång varaktighet, initialDistance, scannedDistance, timer, alertTimer;
Servo servo;
int servoPosition;
bool alertMode;
bool positiveMovement;
void setup() {
servoPosition = 45;
positiveMovement = 1;
timer = 0;
alertMode = 0;
servo.attach(serv);
servo.write(servoPosition);
pinMode (trig, OUTPUT);
pinMode (echo, indata);
Serial.BEGIN(9600);
Delay(1000);
Serial.println("INITIALIZING...");
Delay(1000);
Serial.println("Initialized.");
initialScan();
Delay(100);
}
void loop() {
om (alertMode) {
alertScan();
} else om (timer > loopDuration) {
adjustServo();
initialScan();
timer = 0;
} annat {
movementCheck();
timer ++;
}
Delay(10);
}
void alertScan() {
om (alertTimer > = alertDuration) {
alertMode = 0;
initialScan();
Serial.println ("Alert slutade. Återgå till det normala. ");
Delay(50);
initialScan();
} annat {
Serial.Print ("Alert pågår. Tid kvar: ");
Serial.println (30 - alertTimer);
movementCheck();
alertTimer ++;
Delay(10);
}
}
void initialScan() {
digitalWrite (trig, låg);
delayMicroseconds(2);
digitalWrite (trig, hög);
delayMicroseconds(10);
digitalWrite (trig, låg);
längd = pulseIn (echo, hög);
initialDistance = varaktighet / 148;
Serial.Print ("övervakning avstånd:");
Serial.Print(initialDistance);
Serial.println("\"");
Delay(100);
}
void movementCheck() {
digitalWrite (trig, låg);
delayMicroseconds(2);
digitalWrite (trig, hög);
delayMicroseconds(10);
digitalWrite (trig, låg);
längd = pulseIn (echo, hög);
scannedDistance = varaktighet / 148;
Delay(100);
om (alertMode) {
hemkomst.
}
om (scannedDistance > initialDistance + 2 || scannedDistance < initialDistance - 2) {
Serial.Print ("fråga upptäcks. Avstånd på: ");
Serial.Print(scannedDistance);
Serial.println("\"");
Serial.println ("Alert pågår.");
alertMode = 1;
alertTimer = 0;
timer-= 50;
Delay(10);
}
}
void adjustServo() {
om (alertMode) {
Serial.println ("Lockdown pågår.");
hemkomst.
}
om (positiveMovement) {
servoPosition += 45;
} else om (! positiveMovement) {
servoPosition-= 45;
}
servo.write(servoPosition);
Delay(500);
Serial.Print ("aktuella rotationsvinkel:");
Serial.println(servoPosition);
om (servoPosition == 135) {
positiveMovement = 0;
} else om (servoPosition == 45) {
positiveMovement = 1;
}
}