Min sjätte projekt: Smart Tank chassi med Ultrasonic Sensor (5 / 7 steg)
Steg 5: Testa hela grejer
Servo medföljer denna sensor kan flytta 180 graders. Eftersom jag vill ha smarta tanken att undvika allt i fronten, skulle det vara för känslig om man undviker hinder i 180 graders. Jag vill ha servo flyttar i viss grad framför tanken, inte i servo fulla omfattning. Servo har att kalibrera och se till att 90 graders pekar på framsidan. Du kan aktivera servo moturs tills det fastnar. Anslut sedan sensorn ut och på igen pekar på 9. Efter att vända servo pekar 90 grader medurs tills det på framsidan.
För ledningar av servo, brunt en Arduino GND, röd till 5V och gult till stift 7.
Det finns ett exempel i Arduino bibliotek för våra referens: exempel > Servo > svep. Som jag sade tidigare, vill jag inte servo håller vända 180 grader, så jag justera vinkeln för att passa in behovet. Här använder jag 0 till 100 grader. Jag har också justera servo så den rör sig pekar på framsidan. Jag tycker att svaret från servo är ganska långsam om hålla med exempel, så jag ta bort den andra delen av slingan.
#include < Servo.h >
#define trigPin 5
#define echoPin 6
Servo myservo; skapa objekt för att styra en servo servo
maximalt åtta servo objekt kan skapas
int pos = 0; variabel att lagra servo position
int servoDirection = 100;
int servoDelay = 20;
int motorPin = 8; höger sida till IB - framåt
int motorPin2 = 9; vänster sida till IA - framåt
int motorPin3 = 10; höger sida till IA - bakåt
int motorPin4 = 11; vänster sida till IB - bakåt
void setup()
{
Serial.BEGIN (9600);
myservo.attach(7); tillmäter objektet servo servo på stift 7
myservo.write(POS);
pinMode (motorPin, produktionen);
pinMode (motorPin2, produktionen);
pinMode (motorPin3, produktionen);
pinMode (motorPin4, produktionen);
pinMode (trigPin, produktionen);
pinMode (echoPin, ingång);
}
void forward() {
digitalWrite (motorPin, hög);
digitalWrite (motorPin2, hög);
digitalWrite (motorPin3, låg);
digitalWrite (motorPin4, låg);
}
void backward() {
digitalWrite (motorPin, låg);
digitalWrite (motorPin2, låg);
digitalWrite (motorPin3, hög);
digitalWrite (motorPin4, hög);
}
void turnLeft() {
digitalWrite (motorPin, hög);
digitalWrite (motorPin2, låg);
digitalWrite (motorPin3, låg);
digitalWrite (motorPin4, hög);
}
void turnRight() {
digitalWrite (motorPin, låg);
digitalWrite (motorPin2, hög);
digitalWrite (motorPin3, hög);
digitalWrite (motorPin4, låg);
}
int CheckDistance()
{
lång varaktighet, avstånd;
digitalWrite (trigPin, låg);
delayMicroseconds(2);
digitalWrite (trigPin, hög);
delayMicroseconds(10);
digitalWrite (trigPin, låg);
längd = pulseIn (echoPin, hög);
avståndet = (längd/2) / 29,1;
returnera avstånd;
}
void sweepServo()
{
för (pos = 0; pos < 100; pos + = 1) / / går från 0 grader till 100 grader
{/ / i steg om 1 grad
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10);
}
}
void loop()
{
sweepServo();
int testDistance = CheckDistance(); få objekt avstånd med hjälp av ping
om objektet är mer än 30 cm bort det är utanför intervallet
om (testDistance > = 30 || testDistance < = 0) / / / om objektet är mer än 30 cm bort det är utanför intervallet och går framåt
{
Serial.println ("out of range");
Forward();
}
annat / / / objektet är närmare än 30cm, vända rätt och skriva ut avstånd
{
turnRight();
Serial.Print(testDistance);
Serial.println("cm");
}
}
Uppstår ett problem: det har att köra loopen helt innan en annan slinga startar. Sensorn upptäcka en gång endast när servo flyttar från 0 grader till 100 grader. Jag vill upptäcka avståndet utan att vänta på servo flyttar sensorn. I annan uttrycka vill jag sensorn känner flera gånger i en servo rotation. Hur man gör det?