Paso 9: Actualización opcional: detección de movimiento
Para este paso adicional, estoy suponiendo que ya has construido las ruedas para permitir el movimiento (ver opcional paso 8). Todo lo que queda ahora es agregar el sensor y hacer algunas modificaciones en el código de detección de movimiento.
El sensor tiene 3 cables de señal de cables, amarillo conectado al pin 3 de arduino, mientras el rojo y negro se conectan a v5 y tierra respectivamente en el tablero.
Yo he colocado el sensor oculto debajo de la puerta como se muestra en la imagen, así que puede 'ver' movimiento del usuario sólo cuando la puerta se abre. exactamente lo que necesito!
También tuve que cambiar el código un poco (aquí) para implementar una rutina de detección de movimiento (ver el código, en función zee7()), tal que cuando se detecta movimiento, se moverá la caja, primero a la derecha, luego hacia la izquierda, luego la mano gira el interruptor y el ocultar. El código es muy comentado, espero que no exagere!
Usted puede encontrar el código actualizado a continuación, tenga en cuenta también que he hecho la máquina recoge los movimientos al azar, esto puede ser cambiado a secuencial mediante una simple configuración aleatorizar boolean = false;
Gracias todos por sus sugerencias gran!
El código (mejor para descargar el archivo adjunto a este paso en vez de copiar/pegar desde abajo) :
#include
Servo doorServo;
Servo handServo;
unsigned TimerA largo, TimerB; contador de tiempo para la rutina de detección de movimiento
int switch_pin = 2; Ponga el interruptor en el pin 2
variables de motor
int motorThrottle = 11;
int motorDirection = 13;
Resistancia de int = 8;
Variables de distancia
int motionPin = 3; Motion sensor pin analógico 0
int lastDist = 0; recordar última distancia
int currentDist = 0;
trille el int = 200; Umbral para el movimiento (sistema que se obtiene la sensibilidad deseada de detección de movimiento)
int pos = 0;
int selectedMove = 0; colocar el selector de
int Testmove = 0; modo de prueba: sistema para mover el número para probar sólo una jugada seleccionada
(establecido en cero para funcionar normalmente es decir: roundrobbin en todas las jugadas)
aleatorizar el booleano = true; Si es cierto, la caja hará movers al azar, si establece en false, entonces los movimientos se hará sequencially de 1 a 10
void setup()
{
Serial.Begin(9600);
pinMode (switch_pin, entrada);
doorServo.attach(9); servo sistema puerta de 9 Pin pwm
handServo.attach(10); servo de mano set de 10 Pin pwm
doorServo.write(80); Set puerta para ocultar la posición
handServo.write(0); sistema mano para ocultar la posición
Configuración canal B, canal A está reservado por servos de puerta y de la mano y no puede ber utilizado al mismo tiempo
pinMode (motorDirection, salida); Clavija de iniciados Motor canal de B
pinMode (resistancia, salida); Pin de B inicia canal de freno
}
void loop()
{
Si el interruptor está encendido, luego mover la puerta y a mano para apagarlo...
if(digitalRead(switch_pin) == HIGH)
{
Si (Testmove == 0)
{
if(RANDOMIZE == false)
{
Si (selectedMove > 10)
{
selectedMove = 0; Cuando se reproducen todos los movimientos, repetir los movimientos desde
}
}
otra cosa
{
selectedMove = random(11);
}
}
otra cosa
{
selectedMove = Testmove;
}
Serial.println(selectedMove);
Si (selectedMove == 0) {switchoff();}
else if (selectedMove == 1) {switchoff();}
else if (selectedMove == 2) {switchoffbitaraddod();}
else if (selectedMove == 3) {crazydoor();}
else if (selectedMove == 4) {crazyslow();}
else if (selectedMove == 5) {m7anika7anika();}
else if (selectedMove == 6) {m3alla2();}
else if (selectedMove == 7) {switchoff();}
else if (selectedMove == 8) {matrix();}
else if (selectedMove == 9) {sneak();}
else if (selectedMove == 10) {zee7();}
Si (Testmove == 0 & & aleatorizar == false) {}
selectedMove ++; cambiar al siguiente paso si no es en modo de prueba
}
}
}
Biblioteca de movimientos
movimiento básico
void switchoff()
{
Puerta en movimiento
para (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Movimiento de la mano
para (pos = 0; pos < 129; pos = 4)
{
handServo.write(pos);
Delay(15);
}
esconder la mano
para (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}
movimiento 3: abrir y esperar, luego mueva la mano y esperar, luego apague y ocultar
void switchoffbitaraddod()
{
Puerta en movimiento
para (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Delay(800);
Movimiento de la mano
para (pos = 0; pos < 100; pos = 4)
{
handServo.write(pos);
Delay(15);
}
Delay(1000);
para (pos = 100; pos < 129; pos = 4)
{
handServo.write(pos);
Delay(15);
}
esconder la mano
para (pos = 129; pos > = 0; pos-= 5)
{
handServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}
movimiento 4: Abra la puerta luego cierre espera muchas veces, entonces rápidamente reoprn una nd apague y ocultar.
void crazydoor()
{
Puerta en movimiento
para (pos = 80; pos < 125; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 125; pos > = 80; pos-= 5)
{
doorServo.write(pos);
Delay(15);
}
Puerta en movimiento
para (pos = 80; pos < 110; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 110; pos > = 80; pos-= 15)
{
doorServo.write(pos);
Delay(15);
}
Delay(700);
Puerta en movimiento
para (pos = 80; pos < 125; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Delay(700);
puerta oculta
para (pos = 125; pos > = 80; pos-= 5)
{
doorServo.write(pos);
Delay(15);
}
---del interruptor de---/ /
Puerta en movimiento
para (pos = 80; pos < 155; pos = 8)
{
doorServo.write(pos);
Delay(15);
}
Movimiento de la mano
para (pos = 0; pos < 129; pos = 3)
{
handServo.write(pos);
Delay(15);
}
esconder la mano
para (pos = 129; pos > = 0; pos-= 3)
{
handServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 155; pos > = 80; pos-= 15)
{
doorServo.write(pos);
Delay(15);
}
}
mover 5: Abra la puerta, luego mueva la mano lentamente hacia adelante y atrás para ocultar muy lentamente, luego rápidamente cierre puerta
void crazyslow()
{
Puerta en movimiento
para (pos = 80; pos < 155; pos = 1)
{
doorServo.write(pos);
Delay(30);
}
Movimiento de la mano
para (pos = 0; pos < 129; pos = 1)
{
handServo.write(pos);
Delay(30);
}
esconder la mano
para (pos = 129; pos > = 0; pos-= 1)
{
handServo.write(pos);
Delay(30);
}
puerta oculta
para (pos = 155; pos > = 125; pos-= 1)
{
doorServo.write(pos);
Delay(30);
}
Delay(100);
para (pos = 125; pos > = 80; pos-= 4)
{
doorServo.write(pos);
Delay(15);
}
}
movimiento 6:
void m7anika7anika() {}
Puerta en movimiento
para (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Movimiento de la mano
para (pos = 0; pos < 70; pos = 1)
{
handServo.write(pos);
Delay(15);
}
Delay(800);
puerta oculta
para (pos = 155; pos > = 130; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 130; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 155; pos > = 130; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 130; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
handServo.write(40);
Delay(1000);
Movimiento de la mano
para (pos = 40; pos < 129; pos = 4)
{
handServo.write(pos);
Delay(15);
}
esconder la mano
para (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
para (pos = 120; pos > = 80; pos-= 1)
{
doorServo.write(pos);
Delay(15);
}
}
void m3alla2() {}
Puerta en movimiento
para (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Movimiento de la mano
para (pos = 0; pos < 127; pos = 4)
{
handServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 155; pos > = 130; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
Delay(2000);
para (pos = 130; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
para (pos = 155; pos > = 140; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
para (pos = 140; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Delay(500);
esconder la mano
para (pos = 127; pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}
matrix() vacío
{
Puerta en movimiento
para (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Movimiento de la mano
para (pos = 0; pos < 80; pos = 4)
{
handServo.write(pos);
Delay(15);
}
para (pos = 80; pos < 129; pos = 1)
{
handServo.write(pos);
Delay(30);
}
Delay(300);
para (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(10);
}
puerta oculta
para (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}
void sneak()
{
Puerta en movimiento
para (pos = 80; pos < 130; pos = 1)
{
doorServo.write(pos);
Delay(30);
}
Delay(2000);
Movimiento de la mano
para (pos = 0; pos < 40; pos = 1)
{
handServo.write(pos);
Delay(30);
}
Delay(500);
para (pos = 130; pos < 155; pos = 4)
{
doorServo.write(pos);
Delay(15);
}
Delay(100);
para (pos = 40; pos < 90; pos = 4)
{
handServo.write(pos);
Delay(15);
}
Delay(500);
esconder la mano
para (pos = 90; pos > = 70; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
Delay(100);
para (pos = 70; pos < 90; pos = 4)
{
handServo.write(pos);
Delay(15);
}
Delay(100);
para (pos = 90; pos > = 70; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
Delay(100);
para (pos = 70; pos < 129; pos = 4)
{
handServo.write(pos);
Delay(15);
}
para (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}
Este movimiento se abra la puerta y esperar para el movimiento, si detecta cerca del interruptor,
la caja se moverá primero a la derecha y luego a la izquierda, y finalmente la mano se mueve y se apaga el interruptor de
void zee7()
{
Abra la puerta
para (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Delay(1200); espera para estabilizar las lecturas del sensor después de abrir la puerta
ajustar el temporizador y leer el sensor
esperar para el movimiento que supera el umbral o si el temporizador expira (5 seg),
lastDist = analogRead(motionPin);
TimerA = millis();
mientras que (millis ()-TimerA < = 5000)
{
currentDist = analogRead(motionPin);
¿La distancia actual difiera de la última distancia por encima del umbral?
Si sí, entonces mover el recuadro a la derecha
Si ((currentDist > lastDist trille || currentDist < lastDist - trille) || currentDist > 300)
{
hacia adelante a velocidad media a la izquierda (elegir la velocidad y el retardo
(caja de delay(300), es decir, según usted y voltaje de la batería que el movimiento del tiro es deseable)
digitalWrite (motorDirection, bajo); Establece la dirección correcta del canal A
digitalWrite (resistancia, LOW); Soltar el freno para el canal B
analogWrite (motorThrottle, 100); Gira el motor en canal B a toda velocidad
Delay(300);
digitalWrite (resistancia, HIGH); Eengage el freno para el canal B
rotura;
}
lastDist = currentDist;
}
ajustar el temporizador y leer el sensor
esperar para el movimiento que supera el umbral o si el temporizador expira (5 seg),
Delay(1200); espera para estabilizar las lecturas del sensor después de abrir la puerta
lastDist = analogRead(motionPin);
TimerB = millis();
mientras que (millis ()-TimerB < = 5000)
{
currentDist = analogRead(motionPin);
¿la caja ya cedió a la derecha y el actual se desvía de distancia de la última distancia por encima del umbral?
Si sí, entonces mover a la izquierda
Si ((currentDist > lastDist trille || currentDist < lastDist - trille) || currentDist > 300)
{
hacia atrás a velocidad media a la derecha (elegir la velocidad y el retardo
(caja de delay(300), es decir, según usted y voltaje de la batería que el movimiento del tiro es deseable)
digitalWrite (motorDirection, HIGH); Establece la izquierda en dirección de canal B
digitalWrite (resistancia, LOW); Soltar el freno para el canal B
analogWrite (motorThrottle, 100); Gira el motor en canal B en la mitad de velocidad
Delay(300);
digitalWrite (resistancia, HIGH); Eengage el freno para el canal B
rotura;
}
lastDist = currentDist;
}
Delay(100);
Movimiento de la mano
para (pos = 0; pos < 130; pos = 4)
{
handServo.write(pos);
Delay(15);
}
esconder la mano
para (pos = 130; pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
puerta oculta
para (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}