Paso 5: Probar la materia toda
El servo incluido con este sensor puede mover 180 grados. Porque quiero el tanque inteligente para evitar cualquier cosa en la parte delantera, sería demasiado sensible evita obstáculos en 180 grados. Quiero que el servo se mueve en cierto grado frente al tanque, no en el grado completo del servo. El servo debe ser calibrar y asegúrese de que 90 grados es apuntando al frente. Puede girar el servo en sentido antihorario hasta que se queda pegado. Luego conecte el sensor y en otra vez señalando a 9. Después eso vuelta el servo 90 grados en sentido horario hasta que apunta al frente.
Para el cableado de los servos, marrón a Arduino GND, rojo para 5V y amarillo al pin 7.
Hay un ejemplo en la librería de Arduino para nuestra referencia: ejemplos > servos > barrido. Como dije antes, no quiero que el servo mantiene girando 180 grados, para ajustar el ángulo para la necesidad. Aquí uso grado de 0 a 100. También he ajustar el servo para asegurarse de que mueve hacia el frente. Creo que la respuesta del servo es muy lento if seguir utilizando el ejemplo, para borrar la segunda parte del bucle.
#include <Servo.h>#define trigPin 5#define echoPin 6Servo myservo; // create servo object to control a servo // a maximum of eight servo objects can be created int pos = 0; // variable to store the servo position int servoDirection = 100;int servoDelay = 20;int motorPin = 8; //right side to IB - forwardint motorPin2 = 9; //left side to IA - forwardint motorPin3 = 10; //right side to IA - backwardint motorPin4 = 11; //left side to IB - backwardvoid setup() { Serial.begin (9600); myservo.attach(7); // attaches the servo on pin 7 to the servo object myservo.write(pos); pinMode(motorPin, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);}void forward(){ digitalWrite(motorPin, HIGH); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); } void backward() { digitalWrite(motorPin, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, HIGH); } void turnLeft() { digitalWrite(motorPin, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); } void turnRight() { digitalWrite(motorPin, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); }int CheckDistance(){ long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; return distance;}void sweepServo(){ for(pos = 0; pos < 100; pos += 1) // goes from 0 degrees to 100 degrees { // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(10); }}void loop() { sweepServo(); int testDistance = CheckDistance(); /// get object distance using ping /// if object is more than 30 cm away it is out of range if (testDistance >= 30 || testDistance <= 0) /// if object is more than 30 cm away it is out of range and goes forward { Serial.println("out of range"); forward(); } else /// object is closer than 30cm, turn right and print distance { turnRight(); Serial.print(testDistance); Serial.println("cm"); }}
Se presenta un problema: debe ejecutar totalmente el bucle antes de que comience otro bucle. El sensor detecta una vez sólo cuando el servo mover de 0 grados a 100 grados. Quiero que el sensor de detección de la distancia sin esperar a que el servo se mueve. En otras palabras, quiero que el sensor detecta varias veces en el giro de un servo. ¿Cómo hacerlo?