Star Trek version Arduino

Accueil/News/Star Trek version Arduino

Star Trek version Arduino

Si vous fréquentez notre forum, alors vous êtes au courant du projet de Marc, il voulais animer avec des LEDs sa maquette de l’USS voyager. L’USS voyager, est un vaisseau spatial tiré de Star Trek.
La maquette qu’il a réalisée est impressionnante d’une point de vue esthétique. Mais attendez de voir avec l’Arduino… Il a fallu une Arduino mega, des transistors mosfets, des résistances et pleins de petites LEDs pour l’illuminer. Sans compter toute la patience qu’il faut pour réaliser le montage bien sur.
Pour le programme, on a utilisé la librairie timer, qui nous permet de gérer facilement (ou pas d’ailleurs) l’allumage des LEDs. Comme il y avait pleins de secteurs différents, chacun à son temps avant l’allumage, et parfois même une fréquence de clignotement. Je met le code à la fin de l’article pour ceux qui veulent y jeter un coup d’oeil.
Bon je pense que tout est dis, je vous laisse admirer la vidéo qu’il a tournée pour nous, ainsi que les photos de la bête!

#include « Timer.h »

// Définition de tous les pins associés aux secteurs qu’ils controlent

byte Passerelle = 51;
byte Vaisseau = 48;
byte FeuxPosition = 47;
byte FeuxNavigation = 44;
byte Phares = 43;
byte Radar = 8;
byte Hangar = 39;
byte CollecteurBuzzard = 36;
byte MoteurImpulsions = 35;
byte MoteurDistorsion = 30;
byte TorpilleDroite = 29;
byte TorpilleGauche = 26;

byte bouton = 2;

// Variable pour indiquer si le bouton a été appuyé ou non (veille du programme ou non)
boolean veille = true;
long lastT = 0;

// Variable qui a la luminusité du radar
int lumRadar;

// Définition des timers que l’on va utiliser ainsi que des variables pour stocker les ids

Timer allumageSimple; // ce timer s’occupera d’allumer les leds qui doivent simplement s’allumer au bout d’un certain temps
int IDSimple[7] = {
0};

Timer clignotement; // ce timer fera clignoter les leds qui doivent clignoter
int IDClignotement[4] = {
0};

Timer delaiClignotement; // ce timer declenchera le clignotement des leds (elles ne doivent pas clignoter immediatement)
int IDDelai[2] = {
0};

Timer allumageProgressif; // ce timer va gerer l’allumage progressif du radar
int IDProgressif[2] = {
0};

Timer attaque; // ce timer va servir à faire clignoter les torpilles
int IDAttaque[5] = {
0};
// Timers
long delayPasserelle = 2000;
long delayVaisseau = 7000;
long delayHangar = 22000;
long delayBuzzard = 27000;
long delayMoteurImpulsions = 32000;
long delayMoteurDisto = 37000;
long delayPhares = 5000;

long delayBeforeTorpille = 52000;
long delayEntreAttaque = 8000;

long delayBeforeRadar = 25000;
long speedRadar = 30; // En combien de temps le radar s’allume au total

long delayBeforeFeuxPos = 12000;
long delayOnFeuxPos = 100;
long delayOffFeuxPos = 2000;
long delayBeforeFeuxNav = 17500;
long delayOnFeuxNav = 1000;
long delayOffFeuxNav = 100;
// Fonction setup

void setup() {
Serial.begin(9600);
pinMode(Passerelle, OUTPUT);
pinMode(Vaisseau, OUTPUT);
pinMode(FeuxPosition, OUTPUT);
pinMode(FeuxNavigation, OUTPUT);
pinMode(Phares, OUTPUT);
pinMode(Radar, OUTPUT);
pinMode(Hangar, OUTPUT);
pinMode(CollecteurBuzzard, OUTPUT);
pinMode(MoteurImpulsions, OUTPUT);
pinMode(MoteurDistorsion, OUTPUT);
pinMode(TorpilleDroite, OUTPUT);
pinMode(TorpilleGauche, OUTPUT);

digitalWrite(Passerelle, LOW);
digitalWrite(Vaisseau, LOW);
digitalWrite(FeuxPosition, LOW);
digitalWrite(FeuxNavigation, LOW);
digitalWrite(Phares, LOW);
digitalWrite(Hangar, LOW);
digitalWrite(CollecteurBuzzard, LOW);
digitalWrite(MoteurImpulsions, LOW);
digitalWrite(MoteurDistorsion, LOW);
digitalWrite(TorpilleDroite, LOW);
digitalWrite(TorpilleGauche, LOW);
analogWrite(Radar, 0);

attachInterrupt(0, Boutonpresse, RISING);

Boutonpresse();
}

// Fonction principale

void loop(){

// si le programme n’est pas en veille, on actualise l’état des leds
if(!veille) {
allumageSimple.update();
clignotement.update();
delaiClignotement.update();
allumageProgressif.update();
attaque.update();
}

}

// Fonction appellé lorsque le bouton est appuyé

void Boutonpresse(){

if(millis()-lastT > 500){

if(veille){ // si le programme est en veille, alors on programme l’allumage des différentes leds
Serial.println(« Systeme enclenche! »);
// on s’occupe d’abord de programmer l’allumage simple des leds qui doivent seulement s’allumer
IDSimple[0] = allumageSimple.after(delayPasserelle, allumPasserelle); // passe la passerelle de l’état LOW à HIGH dans 2 secondes à conter de maintenant
IDSimple[1] = allumageSimple.after(delayVaisseau, allumVaisseau);
// on passe pour le moment les feux de positions et navigation, car on doit les faire clignoter, on le fera après
IDSimple[2] = allumageSimple.after(delayHangar, allumHangar);
IDSimple[3] = allumageSimple.after(delayBuzzard, allumBuzzard);
IDSimple[4] = allumageSimple.after(delayMoteurImpulsions, allumImpulsions);
IDSimple[5] = allumageSimple.after(delayMoteurDisto, allumDisto);
IDSimple[6] = allumageSimple.after(delayPhares, allumPhares);

// on s’occupe de l’allumage progressif du radar
IDProgressif[0] = allumageProgressif.after(delayBeforeRadar, allumeRadar);

// on s’occupe maintenant de declencher le clignotement des feux et des torpilles après un certain temps
// cette fonction va appeller la fonction ‘allumeFeuxPosition’ dans 12 secondes, et c’est la fonction
// ‘allumeFeuxPosition’ qui va faire clignoter les leds
IDDelai[0] = delaiClignotement.after(delayBeforeFeuxPos, allumeFeuxPosition);
IDDelai[1] = delaiClignotement.after(delayBeforeFeuxNav, allumeFeuxNavigation);

// enfin il reste à faire clignoter les torpilles
IDAttaque[0] = attaque.after(delayBeforeTorpille, allumageAttaque);

veille = false;
}
else{ // sinon on eteint toutes les leds et on stop tous les timers
Serial.println(« Systeme desactive! »);

// on stop d’abord les timers à l’aide des IDs :
for(int i = 0; i < 7; i++){ allumageSimple.stop(IDSimple[i]); } for(int i = 0; i < 2; i++){ delaiClignotement.stop(IDDelai[i]); allumageProgressif.stop(IDProgressif[i]); } for(int i = 0; i < 4; i ++){ clignotement.stop(IDClignotement[i]); } for(int i = 0; i < 5; i++){ attaque.stop(IDAttaque[i]); } // puis on eteind tout : lumRadar = 0; digitalWrite(Passerelle, LOW); digitalWrite(Vaisseau, LOW); digitalWrite(FeuxPosition, LOW); digitalWrite(FeuxNavigation, LOW); digitalWrite(Phares, LOW); digitalWrite(Hangar, LOW); digitalWrite(CollecteurBuzzard, LOW); digitalWrite(MoteurImpulsions, LOW); digitalWrite(MoteurDistorsion, LOW); digitalWrite(TorpilleDroite, LOW); digitalWrite(TorpilleGauche, LOW); analogWrite(Radar, 0); veille = true; } lastT=millis(); } } void allumeFeuxPosition(){ // cette fonction fait clignoter les feux de position indefiniment quand on l'appelle Serial.println("Allumage des feux de position"); if(delayOffFeuxPos > delayOnFeuxPos)
IDClignotement[0] = clignotement.every(delayOffFeuxPos, pulseFeuxPos);
else {
IDClignotement[0] = clignotement.every(delayOnFeuxPos, pulseFeuxPos);
digitalWrite(FeuxPosition, HIGH);
}
}

void allumeFeuxNavigation(){ // cette fonction fait clignoter les feux de navigation indefiniment quand on l’appelle
Serial.println(« Allumage des feux de navigation »);
if(delayOffFeuxNav > delayOnFeuxNav)
IDClignotement[1] = clignotement.every(delayOffFeuxNav, pulseFeuxNav);
else {
IDClignotement[1] = clignotement.every(delayOnFeuxNav, pulseFeuxNav);
digitalWrite(FeuxNavigation, HIGH);
}
}

void allumeRadar(){ // cette fonction declenche l’allumage prograssif du radar quand on l’appelle
Serial.println(« Allumage du radar »);
IDProgressif[1] = allumageProgressif.every(speedRadar, augmenteLumRadar, 255); // toutes les 15millisecondes, on augmente la luminausité du radar, et ce 255 fois (car 255 est le max de luminausité)
}

void augmenteLumRadar() { // cette fonction augmente la luminausité du radar de 1 à chaque fois qu’on l’appelle
lumRadar ++;
analogWrite(Radar, lumRadar);
}

void allumageAttaque() { // cette fonction va provoquer une attaque toute les 8 secondes avec les lasers
Serial.println(« Allumage des torpilles »);
IDAttaque[1] = attaque.every(delayEntreAttaque, debutattaque);
}

void debutattaque() { // cette fonction fait clignoter la torpille droite puis la gauche
IDAttaque[2] = attaque.oscillate(TorpilleDroite, 120, LOW, 3);
IDAttaque[3] = attaque.after(120*6, attaqueGauche);
}

void attaqueGauche() { // cette fonction fait clignoter la torpille gauche pour finir l’attaque
IDAttaque[4] = attaque.oscillate(TorpilleGauche, 120, LOW, 3);
}

void allumPasserelle() {
Serial.println(« Allumage de la passerelle »);
digitalWrite(Passerelle, HIGH);
}

void allumVaisseau() {
Serial.println(« Allumage du Vaisseau »);
digitalWrite(Vaisseau, HIGH);
}

void allumHangar() {
Serial.println(« Allumage du Hangar »);
digitalWrite(Hangar, HIGH);
}

void allumBuzzard() {
Serial.println(« Allumage du collecteur de buzzard »);
digitalWrite(CollecteurBuzzard, HIGH);
}

void allumImpulsions() {
Serial.println(« Allumage du moteur à impulsion »);
digitalWrite(MoteurImpulsions, HIGH);
}

void allumDisto() {
Serial.println(« Allumage du moteur à distorsion »);
digitalWrite(MoteurDistorsion, HIGH);
}

void allumPhares() {
Serial.println(« Allumage des phares »);
digitalWrite(Phares, HIGH);
}

void pulseFeuxPos(){
if(delayOffFeuxPos > delayOnFeuxPos)
IDClignotement[2] = clignotement.pulse(FeuxPosition, delayOnFeuxPos, LOW);
else IDClignotement[2] = clignotement.pulse(FeuxPosition, delayOffFeuxPos, HIGH);

}
void pulseFeuxNav(){
if(delayOffFeuxNav > delayOnFeuxNav)
IDClignotement[3] = clignotement.pulse(FeuxNavigation, delayOnFeuxNav, LOW);
else IDClignotement[3] = clignotement.pulse(FeuxNavigation, delayOffFeuxNav, HIGH);
}

2016-12-20T11:38:04+00:00 13 juin, 2015|Categories: News|

3 Commentaires

  1. TheDaverMan 17 août 2015 à 11 h 18 min␣- Répondre

    Bravo, magnifique réalisation.
    Je suis également occupé sur la réalisation d’une animation pour une vitrine avec un vaisseau Star War.
    Pour une prochaine réalisation jettes un coup d’œil au pixel LED (ex: ws2812).
    https://www.youtube.com/watch?v=Rjqbege1r3Q
    http://fr.aliexpress.com/item/Newest-WS2812B-WS2811-WS2812-built-in-SMD-5050-Led-pixel-module-PCB-Addressable-RGB-modules-Strip/1897830725.html?isOrigTitle=true
    Se sont des LED RGB adressable, elle se connecte en série via un bus ( + ; – ; Signal In ; Signal Out) et les exemples pour arduino ne manques pas.
    Cela facilite la réalisation et te permet de changer tes regroupements à volonté par programmation.
    Tu peux donc allumer, éteindre, changer de luminosité ou de couleurs pour chacune des LED individuellement.

    • arnaud39 24 août 2015 à 11 h 51 min␣- Répondre

      Merci de votre retour, en effet ces Led sont très pratique, c’est Adafruit qui les a mises au point (Neopixel pour les connaisseurs), je suis content de voir qu’il existe des copies moins chère !

  2. Asgard 1 septembre 2015 à 18 h 52 min␣- Répondre

    J’en prend note, ça pourrait être sympa.
    Merci pour l’idée.

Laisser un commentaire