Bonjour à tous, je me lance dans la réalisation d'un projet pour ma team d'airsoft :
La réalisation d'un bombe factice, mais cette fois à base d'un arduino.
Pour ceux qui ne connaissent pas, l'Arduino est un petit microcontroleur configurable à l'aide d'un langage de programmation complet.
L'utilisation de ce petit bijou permettra de rendre ma bombe bien plus évoluée que la simple utilisation d'une minuterie, et rendra son utilisation, je pense, plus intéressante
Utilisation :
1ere étape, Réglage de la temporisation : heure, minutes, secondes, avec 2 boutons style minuterie ou montre ( bouton 1 pour choisir l’élément et bouton 2 pour modifier la valeur de cet élément.)
2eme étape, lancement du compte à rebour.
3eme étape, désamorcage. 2 façons de procéder :
_ interrupteur à clé : Il suffit d'utiliser une clé, préalablement récupérée sur un terroriste.
_ combinaison de fils : 4 plots "entrée", 4 plots "sorties", il faut relié chaque "entrée" à une "sortie" bien définie. Seulement, et c'est là que l'Arduino montre sa puissance, la combinaison est redéfinie aléatoirement à chaque partie. De plus, pour aider le démineur, sitôt qu'une paire est bien formée, une LED s'allume pour l'indiquer. Ensuite, il faut brancher un boitier avec un interrupteur pour finaliser le désamorçage.
4eme étape, l'explosion : En cas d’échec du désamorçage, l'Arduino active, via un transistor, une sirène d'alarme anti-incendie. J'ai choisit une sirène 110dB afin qu'elle soit entendu sur tout le terrain.
J'ai choisit de prendre 2 types de désamorçage pour faire plus "RP" :
_ interrupteur à clé très facile à utiliser, la difficulté étant de trouver et éliminer le technicien terroriste.
_ désamorçage à fil + boitier, afin de pouvoir neutraliser la bombe sans chercher le technicien adverse. Mais dans ce cas la complexité du système implique une exposition prolongée aux tirs des défenseurs.
Voila, je posterais au fur et à mesure de mon avancée. De plus, une fois le projet mené à son terme, je mettrais le code Arduino en libre service, ainsi que les plan de montage et les composants utilisés, afin de permettre a n'importe qui de s'en inspirer ou de recopier tout simplement
N'hésitez pas a commenter
EDIT 1 : Code de gestion du compte à rebour ainsi que le compte à rebour.
Code complet fonctionnel (testé avec fils volants) - ouch 600lignes, sa piques ^^ -
La réalisation d'un bombe factice, mais cette fois à base d'un arduino.
Pour ceux qui ne connaissent pas, l'Arduino est un petit microcontroleur configurable à l'aide d'un langage de programmation complet.
L'utilisation de ce petit bijou permettra de rendre ma bombe bien plus évoluée que la simple utilisation d'une minuterie, et rendra son utilisation, je pense, plus intéressante
Utilisation :
1ere étape, Réglage de la temporisation : heure, minutes, secondes, avec 2 boutons style minuterie ou montre ( bouton 1 pour choisir l’élément et bouton 2 pour modifier la valeur de cet élément.)
2eme étape, lancement du compte à rebour.
3eme étape, désamorcage. 2 façons de procéder :
_ interrupteur à clé : Il suffit d'utiliser une clé, préalablement récupérée sur un terroriste.
_ combinaison de fils : 4 plots "entrée", 4 plots "sorties", il faut relié chaque "entrée" à une "sortie" bien définie. Seulement, et c'est là que l'Arduino montre sa puissance, la combinaison est redéfinie aléatoirement à chaque partie. De plus, pour aider le démineur, sitôt qu'une paire est bien formée, une LED s'allume pour l'indiquer. Ensuite, il faut brancher un boitier avec un interrupteur pour finaliser le désamorçage.
4eme étape, l'explosion : En cas d’échec du désamorçage, l'Arduino active, via un transistor, une sirène d'alarme anti-incendie. J'ai choisit une sirène 110dB afin qu'elle soit entendu sur tout le terrain.
J'ai choisit de prendre 2 types de désamorçage pour faire plus "RP" :
_ interrupteur à clé très facile à utiliser, la difficulté étant de trouver et éliminer le technicien terroriste.
_ désamorçage à fil + boitier, afin de pouvoir neutraliser la bombe sans chercher le technicien adverse. Mais dans ce cas la complexité du système implique une exposition prolongée aux tirs des défenseurs.
Voila, je posterais au fur et à mesure de mon avancée. De plus, une fois le projet mené à son terme, je mettrais le code Arduino en libre service, ainsi que les plan de montage et les composants utilisés, afin de permettre a n'importe qui de s'en inspirer ou de recopier tout simplement
N'hésitez pas a commenter
EDIT 1 : Code de gestion du compte à rebour ainsi que le compte à rebour.
- Spoiler:
- Code:
//Programme de la bombe d'airsoft
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//Definition des broches:
int code1 = 1;
int code2 = 2;
int code3 = 3;
int code4 = 4;
int bouton1 = 0;
int etat1;
int bouton2 = 1;
int etat2;
int led1 = 3;
int led2 = 11;
int led3 = 12;
int led4 = 13;
int alimboutonarret = 19;
int detectboutonarret = 2;
//variable de controle
int test1 = 0;
int test2 = 0;
//variable de minutage
int H = 0;
int M = 0;
int S = 0;
//initialisation
void setup()
{
//definition des entrees
pinMode(bouton1, INPUT);
pinMode(bouton2, INPUT);
pinMode(detectboutonarret, INPUT);
pinMode(alimboutonarret, OUTPUT);
//definition des sorties
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
lcd.begin(16, 2);
}
//programme
void loop()
{
// definition du Timer
do
{
if (digitalRead(bouton1) == LOW)
{
test1 = 1;
}
delay (500);
lcd.clear();
//definition de la valeur des heures
do //incrementation heure
{
lcd.setCursor(0, 0);
lcd.print("HEURES");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
etat2 = digitalRead(bouton2);
if (etat2 == LOW)
{
/*digitalWrite(13, HIGH);
delay (1000);
digitalWrite(13, LOW);
delay (1000);*/
if (test2 == 0)
{
H = H + 1;
if ( H % 9 == 0)
{
H = 0;
lcd.clear();
}
test2 = 1;
}
}
else
{
test2 = 0;
}
etat1 = digitalRead(bouton1);
if (etat1 == LOW)
{
test1 = 2;
}
} while (test1 != 2);
delay (500);
lcd.clear();
//definition de la valeur des minutes
do //incrementation minutes
{
lcd.setCursor(0, 0);
lcd.print("MINUTES");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
etat2 = digitalRead(bouton2);
if (etat2 == LOW)
{
if (test2 == 0)
{
M = M + 1;
if ( M % 60 == 0)
{
M = 00;
lcd.clear();
}
test2 = 1;
}
}
else
{
test2 = 0;
}
etat1 = digitalRead(bouton1);
if (etat1 == LOW)
{
test1 = 3;
}
} while (test1 != 3);
delay (500);
lcd.clear();
//definition de la valeur des secondes
do //incrementation minutes
{
lcd.setCursor(0, 0);
lcd.print("SECONDES");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
etat2 = digitalRead(bouton2);
if (etat2 == LOW)
{
if (test2 == 0)
{
S = S + 1;
if ( S % 60 == 0)
{
S = 0;
lcd.clear();
}
test2 = 1;
}
}
else
{
test2 = 0;
}
etat1 = digitalRead(bouton1);
if (etat1 == LOW)
{
test1 = 4;
}
} while (test1 != 4);
delay (500);
lcd.clear();
//choix de la validation ou de la correction. Bouton1 pour recommencer, Bouton2 pour valider
do //incrementation minutes
{
lcd.setCursor(0, 0);
lcd.print("VALIDER ?");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
etat2 = digitalRead(bouton2);
if (etat2 == LOW)
{
if (test2 == 0)
{
test1 = 5;
test2 = 1;
}
}
else
{
test2 = 0;
}
etat1 = digitalRead(bouton1);
if (etat1 == LOW)
{
test1 = 1;
}
} while (test1 == 4);
} while (test1 < 5);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13,LOW);
//Compte à rebour
do
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Detonation dans :");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
if ( S <= 1)
{
if ( M > 0 )
{
M = M - 1;
S = 60;
}
else
{
if (H > 0)
{
H = H - 1;
M = 59;
S = 60;
}
else
{
//instructions à effectuer lors de l'arrivée à 0. Ici, on passe la broche 3 à l'état haut pour le test
digitalWrite(13,HIGH);
test1 = 6;
H = 0;
M = 0;
S = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PERDU");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
}
}
}
S = S - 1;
delay (1000);
} while (test1 != 6);
}
Code complet fonctionnel (testé avec fils volants) - ouch 600lignes, sa piques ^^ -
- Spoiler:
- Code:
//Programme de la bombe d'airsoft
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//Definition des broches:
int code1 = 1;
int code2 = 2;
int code3 = 3;
int code4 = 4;
int bouton1 = 0;
int etat1;
int bouton2 = 1;
int etat2;
int led1 = 3;
int led2 = 11;
int led3 = 12;
int led4 = 13;
int alimboutonarret = 19;
int detectboutonarret = 2;
//variable de controle
int test1 = 0;
int test2 = 0;
int compteur = 0;
int arret = 0;
//variable de minutage
int H = 0;
int M = 0;
int S = 0;
//variables de lecture analogiques
int broche1;
int min1;
int max1;
int val1;
int broche2;
int min2;
int max2;
int val2;
int broche3;
int min3;
int max3;
int val3;
int broche4;
int min4;
int max4;
int val4;
//initialisation
void setup()
{
//definition des entrees
pinMode(bouton1, INPUT);
pinMode(bouton2, INPUT);
pinMode(detectboutonarret, INPUT);
pinMode(alimboutonarret, OUTPUT);
//definition des sorties
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
//definition des pullup
digitalWrite(bouton1, HIGH);
digitalWrite(bouton2, HIGH);
digitalWrite(detectboutonarret, HIGH);
lcd.begin(16, 2);
randomSeed(analogRead(4));
}
//programme
void loop()
{
arret = 0;
H = 0;
M = 0;
S = 0;
digitalWrite(alimboutonarret, HIGH);
// definition du Timer
do
{
if (digitalRead(bouton1) == LOW)
{
test1 = 1;
}
delay (500);
lcd.clear();
//definition de la valeur des heures
do //incrementation heure
{
lcd.setCursor(0, 0);
lcd.print("HEURES");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
etat2 = digitalRead(bouton2);
if (etat2 == LOW)
{
/*digitalWrite(13, HIGH);
delay (1000);
digitalWrite(13, LOW);
delay (1000);*/
if (test2 == 0)
{
H = H + 1;
if ( H % 9 == 0)
{
H = 0;
lcd.clear();
}
test2 = 1;
}
}
else
{
test2 = 0;
}
etat1 = digitalRead(bouton1);
if (etat1 == LOW)
{
test1 = 2;
}
} while (test1 != 2);
delay (500);
lcd.clear();
//definition de la valeur des minutes
do //incrementation minutes
{
lcd.setCursor(0, 0);
lcd.print("MINUTES");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
etat2 = digitalRead(bouton2);
if (etat2 == LOW)
{
if (test2 == 0)
{
M = M + 1;
if ( M % 60 == 0)
{
M = 00;
lcd.clear();
}
test2 = 1;
}
}
else
{
test2 = 0;
}
etat1 = digitalRead(bouton1);
if (etat1 == LOW)
{
test1 = 3;
}
} while (test1 != 3);
delay (500);
lcd.clear();
//definition de la valeur des secondes
do //incrementation secondes
{
lcd.setCursor(0, 0);
lcd.print("SECONDES");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
etat2 = digitalRead(bouton2);
if (etat2 == LOW)
{
if (test2 == 0)
{
S = S + 1;
if ( S % 60 == 0)
{
S = 0;
lcd.clear();
}
test2 = 1;
}
}
else
{
test2 = 0;
}
etat1 = digitalRead(bouton1);
if (etat1 == LOW)
{
test1 = 4;
}
} while (test1 != 4);
delay (500);
lcd.clear();
//choix de la validation ou de la correction. Bouton1 pour recommencer, Bouton2 pour valider
do
{
lcd.setCursor(0, 0);
lcd.print("VALIDER ?");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
etat2 = digitalRead(bouton2);
if (etat2 == LOW)
{
if (test2 == 0)
{
test1 = 5;
test2 = 1;
}
}
else
{
test2 = 0;
}
etat1 = digitalRead(bouton1);
if (etat1 == LOW)
{
test1 = 1;
}
} while (test1 == 4);
} while (test1 < 5);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13,LOW);
//affectation des valeurs souhaitees a chaque broche
broche1 = int(random(1, 5));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("broche 1");
lcd.setCursor(0, 1);
lcd.print(broche1);
delay(1000);
do
{
broche2 = int(random(1,5));
} while (broche1 == broche2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("broche 2");
lcd.setCursor(0, 1);
lcd.print(broche2);
delay(1000);
do
{
broche3 = int(random(1,5));
} while (broche1 == broche3 || broche2 == broche3);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("broche 3");
lcd.setCursor(0, 1);
lcd.print(broche3);
delay(1000);
do
{
broche4 = int(random(1,5));
}
while (broche1 == broche4 || broche2 == broche4 || broche3 == broche4);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("broche 4");
lcd.setCursor(0, 1);
lcd.print(broche4);
delay(1000);
switch (broche1)
{
case 1:
min1 = 90;
max1 = 170;
break;
case 2:
min1 = 220;
max1 = 308;
break;
case 3:
min1 = 360;
max1 = 445;
break;
case 4:
min1 = 500;
max1 = 580;
break;
}
switch (broche2)
{
case 1:
min2 = 90;
max2 = 170;
break;
case 2:
min2 = 220;
max2 = 308;
break;
case 3:
min2 = 360;
max2 = 445;
break;
case 4:
min2 = 500;
max2 = 580;
break;
}
switch (broche3)
{
case 1:
min3 = 90;
max3 = 170;
break;
case 2:
min3 = 220;
max3 = 308;
break;
case 3:
min3 = 360;
max3 = 445;
break;
case 4:
min3 = 500;
max3 = 580;
break;
}
switch (broche4)
{
case 1:
min4 = 90;
max4 = 170;
break;
case 2:
min4 = 220;
max4 = 308;
break;
case 3:
min4 = 360;
max4 = 445;
break;
case 4:
min4 = 500;
max4 = 580;
break;
}
//Compte à rebour
do
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Detonation dans :");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
if ( S <= 1)
{
if ( M > 0 )
{
M = M - 1;
S = 60;
}
else
{
if (H > 0)
{
H = H - 1;
M = 59;
S = 60;
}
else
{
//instructions à effectuer lors de l'arrivée à 0. Ici, on passe la broche 3 à l'état haut pour le test
digitalWrite(13,HIGH);
test1 = 7;
H = 0;
M = 0;
S = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PERDU");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
}
}
}
S = S - 1;
// delay(1000);
for (int i=0 ; i <= 100 ; i++)
{
/* lcd.clear();
lcd.setCursor(0, 0);
lcd.print("compteur :");
lcd.setCursor(0, 1);
lcd.print(compteur);*/
//lecture des entrees de codage
val1 = analogRead(code1);
val2 = analogRead(code2);
val3 = analogRead(code3);
val4 = analogRead(code4);
if (val1 >= min1 && val1 <= max1)
{
compteur = compteur + 1;
digitalWrite(led1, HIGH);
}
else
{
digitalWrite(led1, LOW);
}
if (val2 >= min2 && val2 <= max2)
{
compteur = compteur + 1;
digitalWrite(led2, HIGH);
}
else
{
digitalWrite(led2, LOW);
}
if (val3 >= min3 && val3 <= max3)
{
compteur = compteur + 1;
digitalWrite(led3, HIGH);
}
else
{
digitalWrite(led3, LOW);
}
if (val4 >= min4 && val4 <= max4)
{
compteur = compteur + 1;
digitalWrite(led4, HIGH);
}
else
{
digitalWrite(led4, LOW);
}
if (compteur == 4 )
{
digitalWrite(alimboutonarret, LOW);
}
else
{
digitalWrite(alimboutonarret, HIGH);
compteur = 0;
}
if (digitalRead(detectboutonarret) == LOW )
{
arret = 1;
test1 = 7;
}
delay(9);
}
} while (test1 != 7);
//desamorcage
while (arret == 0)
{
if (digitalRead(bouton2) == LOW )
{
arret = 2 ;
}
}
while (arret == 1)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("VICTOIRE");
lcd.setCursor(0, 1);
lcd.print(H);
lcd.setCursor(1, 1);
lcd.print(":");
lcd.setCursor(2, 1);
lcd.print(M);
lcd.setCursor(4, 1);
lcd.print(":");
lcd.setCursor(5, 1);
lcd.print(S);
delay(100);
if (digitalRead(bouton2) == LOW )
{
arret = 0;
}
}
}
Dernière édition par Ariolas le Sam 24 Déc - 18:28, édité 2 fois