Tourelle Nerf motorisée à base d’Arduino (v1)
Description :
Le projet consiste à réaliser une tourelle Nerf automatisée et orientable, contrôlée par une carte Arduino.
La tourelle est montée sur une base motorisée utilisant deux servomoteurs MG90, permettant une orientation précise sur deux axes :
- Servo 1 : rotation horizontale (pan)
- Servo 2 : inclinaison verticale (tilt)
Sur cette tourelle est fixé un système de tir composé de deux moteurs DC Micro 130 Gear Motor. Ces moteurs agissent comme des flywheels et permettent de propulser les projectiles Nerf à grande vitesse.
Le tir est activé via une gâchette contrôlée par un servomoteur SG90 supplémentaire, qui presse mécaniquement la détente.
Pour améliorer la précision, le montage est équipé d’un viseur laser permettant d’aligner plus facilement la tourelle sur la cible.
L’ensemble forme ainsi une tourelle Nerf motorisée, orientable et contrôlable, combinant précision, puissance et polyvalence grâce à l’utilisation de plusieurs servomoteurs et moteurs DC pilotés par Arduino.
Prérequis :
- 1 x Carte Arduino Uno
- 2 x Servomoteur MG995
- 1 x Servomoteur SG90
- 1 x HG7881CP – Contrôleur double moteur (L9110S)
- 1 x Laser DC 3-5V 650nm 5mW Red Point
- 2 x DC Micro 130 Gear motor
- 1 x Joystick KY-023
- 2 x Bouton
- 1 x Condensateur 1000μf 16v (optionnel)
- Fils de connexion
- Batterie 5v
Vidéo de démonstration :
Schéma de câblage :





Code :
Code Arduino :
//Driver L9110
const int A1A = 8;
const int A1B = 9;
const int B1A = 10;
const int B1B = 11;
//Boutons
const int PinboutonVert = A2; //Numéro de la broche du bouton rouge
const int PinboutonRouge = A3; //Numéro de la broche du bouton vert
//Servo
const int Pin_servo1 = 5; //MG995 vertical
const int Pin_servo2 = 6; //MG995 horizontal
const int Pin_servo3 = 3; //Servo gachette
#include <Servo.h>
Servo myservo1; // Créer un objet Servo pour contrôler un servo
Servo myservo2; // Créer un objet Servo pour contrôler un servo
Servo myservo3; // Créer un objet Servo pour contrôler un servo
#define VRX_PIN A0 // Broche Arduino connectée à la broche VRX
#define VRY_PIN A1 // Broche Arduino connectée à la broche VRY
int xValue = 0; // Pour stocker la valeur de l'axe X
int xValueCentre = 0;
int yValue = 0; // Pour stocker la valeur de l'axe Y
int yValueCentre = 0;
int Poservo1 = 25;
int Poservo2 = 90;
unsigned long previousMillis = 0;
int interval = 1000;
int EtatboutonVert = 0; // variable for reading the pushbutton status
int EtatboutonRouge = 0; // variable for reading the pushbutton status
void setup() {
Serial.begin(9600);
myservo1.attach(Pin_servo1); // attache le servo sur la broche 5 à l'objet Servo
myservo2.attach(Pin_servo2); // attache le servo sur la broche 6 à l'objet Servo
myservo3.attach(Pin_servo3); // attache le servo sur la broche 3 à l'objet Servo
myservo1.write(Poservo1);
myservo2.write(Poservo2);
myservo3.write(5);
pinMode(PinboutonVert, INPUT_PULLUP);
pinMode(PinboutonRouge, INPUT_PULLUP);
pinMode(A1A, OUTPUT);
pinMode(A1B, OUTPUT);
pinMode(B1A, OUTPUT);
pinMode(B1B, OUTPUT);
digitalWrite(A1A, LOW);
digitalWrite(A1B, LOW);
digitalWrite(B1A, LOW);
digitalWrite(B1B, LOW);
//On lance une procédure pour enregistrer la valeur des joysticks au repos.
Serial.println("Ne pas toucher le Joystick initialisation");
int var = 0;
while (var < 6) {
delay(500);
var++;
Serial.print(".");
}
xValue = analogRead(VRX_PIN);
yValue = analogRead(VRY_PIN);
xValueCentre = xValue;
yValueCentre = yValue;
Serial.println("Initialisation terminer");
Serial.print("xValueCentre = ");
Serial.println(xValueCentre);
Serial.print("yValueCentre = ");
Serial.println(yValueCentre);
delay(1000);
}
void loop() {
EtatboutonVert = digitalRead(PinboutonVert);
EtatboutonRouge = digitalRead(PinboutonRouge);
if (EtatboutonVert == LOW) {
digitalWrite(A1A, LOW);
digitalWrite(A1B, HIGH);
digitalWrite(B1A, LOW);
digitalWrite(B1B, HIGH);
} else {
digitalWrite(A1A, LOW);
digitalWrite(A1B, LOW);
digitalWrite(B1A, LOW);
digitalWrite(B1B, LOW);
}
if (EtatboutonRouge == LOW) {
myservo3.write(90);
} else {
myservo3.write(0);
}
unsigned long currentMillis = millis();
// lire les valeurs analogiques X et Y
xValue = analogRead(VRX_PIN);
yValue = analogRead(VRY_PIN);
if (xValue > xValueCentre + 20) {
interval = map(xValue, xValueCentre + 10, 1024, 200, 5);
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Poservo1 = Poservo1 + 1;
}
}
if (xValue < xValueCentre - 20) {
interval = map(xValue, xValueCentre - 10, 0, 200, 5);
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Poservo1 = Poservo1 - 1;
}
}
Poservo1 = constrain(Poservo1, 0, 60);
if (yValue > yValueCentre + 20) {
interval = map(yValue, yValueCentre + 10, 1024, 200, 5);
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Poservo2 = Poservo2 + 1;
}
}
if (yValue < yValueCentre - 20) {
interval = map(yValue, yValueCentre - 10, 0, 200, 5);
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Poservo2 = Poservo2 - 1;
}
}
Poservo2 = constrain(Poservo2, 5, 180);
myservo1.write(Poservo1); // définit la position du servo en fonction de la valeur mise à l'échelle
myservo2.write(Poservo2); // définit la position du servo en fonction de la valeur mise à l'échelle
}
