Avec un pote Shadock21 "Ariolas" on a un peu planché sur une tourelle automatique.
elle est déclenché par 3 capteurs de mouvements.
première détection, la tourelle s'active, s’élève et met en place la réplique.
si détection à droite ou gauche, tirs en petites rafales et rotation de la tourelle du coté ou le mouvement a été détecté puis retour au point milieu.
si détection au centre, tirs en petites rafales
possibilité de désactiver la tourelle qui se repliera l'espace d'un instant par un tir sur capteur cible, puis remise en activité à la prochaine détection de mouvement.
angle couvert par la tourelle 90°, 3 zones de 30°.
une caméra wireless permettra de profiter du spectacle en ZN,
photo de la base rotative:
le programme v1.0.0:
Prog 1.0.0 a écrit:int MoteurRotationGauche = 0; // relais moteur rotation gauche
int MoteurRotationDroit = 1; // relais moteur rotation droite
int CapteurMouvementGauche = 4; // detecteur mouvement gauche
int CapteurMouvementDroit = 5; // detecteur mouvement droit
int CapteurMouvementCentral = 6; // detecteur mouvement central
int CommandeTir = 13; // commande de tir
int broche_detecteur_Gauche = 2; // fin de course gauche
int broche_detecteur_Droit = 3; // fin de course droit
int etat = 0; // Variable d'etat de la tourelle.
int duree_retour = 1800; // tempo de retour au point milieu
int duree_tir = 400; // tempo de tir
int duree_arret_tir = 400; // tempo arret de tir
int duree_chg_sens = 400; // tempo changement de sens de rotation
void setup() ////////////////////////////////////////////////////////////////////////////////////////////
{
pinMode (MoteurRotationGauche , OUTPUT);
pinMode (MoteurRotationDroit , OUTPUT);
pinMode (CapteurMouvementGauche , INPUT);
pinMode (CapteurMouvementDroit , INPUT);
pinMode (CapteurMouvementCentral , INPUT);
pinMode (CommandeTir , OUTPUT);
pinMode (broche_detecteur_Gauche , OUTPUT);
pinMode (broche_detecteur_Droit , OUTPUT);
//mise a l'etat LOW des relais
digitalWrite(MoteurRotationGauche, HIGH);
digitalWrite(MoteurRotationDroit, HIGH);
digitalWrite(CommandeTir, LOW);
//activation des resistances de tirage
digitalWrite(CapteurMouvementGauche, HIGH);
digitalWrite(CapteurMouvementDroit, HIGH);
digitalWrite(CapteurMouvementCentral, HIGH);
digitalWrite(broche_detecteur_Gauche, HIGH);
digitalWrite(broche_detecteur_Droit, HIGH);
attachInterrupt(0, fin_course_gauche, CHANGE); //fin de course gauche (2)
attachInterrupt(1, fin_course_droit, CHANGE); //fin de course droit (3)
}
void loop() ///////////////////////////////////////////////////////////////////////////////////////////////
{
etat = 0;
if (digitalRead(CapteurMouvementCentral) == LOW) //si detection de mouvement au centre
{
digitalWrite(CommandeTir, HIGH); // déclenchement du tir
delay(duree_tir); // pendant 0.4s
digitalWrite(CommandeTir, LOW); // arret du tir
delay(duree_arret_tir); // pendant 0.4s
digitalWrite(CommandeTir, HIGH); // déclenchement du tir
delay(duree_tir); // pendant 0.4s
digitalWrite(CommandeTir, LOW); // arret du tir
}
if (digitalRead(CapteurMouvementGauche) == LOW) // si detection de mouvement à gauche
{
digitalWrite(MoteurRotationGauche, LOW); // rotation à gauche
do
{
digitalWrite(CommandeTir, HIGH); // déclenchement du tir
delay(duree_tir);
if(etat != 1)
{
digitalWrite(CommandeTir, LOW); // déclenchement du tir
delay(duree_tir);
}
}while(etat != 1);
delay(duree_chg_sens); // temps de freinage avant changement de sens de rotation
// On fait revenir la tourelle a sa position centrale
digitalWrite(MoteurRotationDroit, LOW); // retour au point milieu
delay(duree_retour); // durée rotation à droite
digitalWrite(MoteurRotationDroit, HIGH); // arret rotation
}
if (digitalRead(CapteurMouvementDroit) == LOW) // si detection de mouvement à droite
{
digitalWrite(MoteurRotationDroit, LOW); // rotation à droite
do
{
digitalWrite(CommandeTir, HIGH); // déclenchement du tir
delay(duree_tir);
if(etat != 1)
{
digitalWrite(CommandeTir, LOW); // déclenchement du tir
delay(duree_tir);
}
}while(etat != 1);
delay(duree_chg_sens); // temps de freinage avant changement de sens de rotation
// On fait revenir la tourelle a sa position centrale
digitalWrite(MoteurRotationGauche, LOW); // retour au point milieu
delay(duree_retour); // durée rotation à gauche
digitalWrite(MoteurRotationGauche, HIGH); // arret rotation
}
}
void fin_course_gauche()
{
digitalWrite(MoteurRotationGauche, HIGH); // arret rotation gauche
digitalWrite(CommandeTir, LOW); // arret tir
etat = 1;
}
void fin_course_droit()
{
digitalWrite(MoteurRotationDroit, HIGH); // arret rotation droite
digitalWrite(CommandeTir, LOW); // arret tir
etat = 1;
}