Nuage interactif : Différence entre versions
(→Outils et Matériaux) |
|||
(34 révisions intermédiaires par 3 utilisateurs non affichées) | |||
Ligne 4 : | Ligne 4 : | ||
− | == | + | == Auteurs == |
− | + | * [[Utilisateur:XBapt|XBapt]] (Baptiste Manach) | |
+ | * [[Utilisateur:abdel|abdel]] (Abdelhafid Adid) | ||
+ | * [[Utilisateur:Sarah|Sarah]] (Sarah Solaiman) | ||
− | + | [[Catégorie:GroupeA]] | |
− | |||
− | |||
== Outils et Matériaux == | == Outils et Matériaux == | ||
Ligne 18 : | Ligne 18 : | ||
Arduino | Arduino | ||
+ | [[Fichier:16251094_1436799666330878_916463850_o.jpg|400px|]] | ||
LEDs : 3R 3V 3J | LEDs : 3R 3V 3J | ||
Plusieurs fils | Plusieurs fils | ||
− | + | 9 résistances de 33kohm | |
Infrared sensor = Kit IR snootlab 5€ | Infrared sensor = Kit IR snootlab 5€ | ||
Led jaune | Led jaune | ||
Récepteur infrarouge : TSOP32138 | Récepteur infrarouge : TSOP32138 | ||
Battery or power source for arduino = cable usb / arduino | Battery or power source for arduino = cable usb / arduino | ||
− | Breadboard or blank circuit board | + | Breadboard or blank circuit board |
+ | |||
Autres : | Autres : | ||
− | vieille télécommande | + | Une vieille télécommande |
− | |||
Flocon air fibre : polyester | Flocon air fibre : polyester | ||
+ | Colle forte | ||
+ | Une boule chinoise | ||
+ | [[Fichier:16129261_10208080972648247_40449221_o.jpg|400px|]] | ||
Outils : | Outils : | ||
Ligne 38 : | Ligne 42 : | ||
== Réalisation du projet == | == Réalisation du projet == | ||
− | Première étape : Le codage | + | ''Première étape : Le codage'' |
- Tout se fait sur Arduino (langage C) | - Tout se fait sur Arduino (langage C) | ||
+ | - Pour comprendre cette étape il faut regarder le code. Nous avons rajouté des commentaires pour faciliter la compréhension. | ||
− | |||
− | + | /* | |
+ | NUAGE INTERACTIF | ||
+ | Projet Petits Debrouillard Intersemestre 3 2017 | ||
+ | Auteur : Manach Baptiste | ||
+ | Solaiman Sarah | ||
+ | Khalid Abdelhafid | ||
+ | Date : 16 Janvier 2017 | ||
+ | */ | ||
+ | |||
+ | |||
+ | #include <IRremote.h> | ||
+ | |||
+ | int RECV_PIN = 11; //Entree du capteur IR | ||
+ | int IRconf_PIN = 12; //confirme la reception du signal | ||
+ | IRrecv irrecv(RECV_PIN); | ||
+ | decode_results results; | ||
+ | |||
+ | int tricolor = 3; //Nombre de groupe de 3 led | ||
+ | int dOn = 200;//temps d'allumage | ||
+ | int dOff = 20;//temps de pause d'allumage | ||
+ | char key;//key correspond à la dernière touche pressee sur la telecomande | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | irrecv.enableIRIn(); // Initialise le recepteur | ||
+ | pinMode(RECV_PIN, INPUT); | ||
+ | pinMode(IRconf_PIN, OUTPUT);//Sortie du temoin de reception de signal | ||
+ | for (int i = 0; i < tricolor * 3; i++) { | ||
+ | //Initialise le nombre de sortie necessaire pour le nombre de groupe de diodes cablees | ||
+ | pinMode(2 + i, OUTPUT); | ||
+ | } | ||
+ | } | ||
+ | //Remet a l'etat de base l'arduino | ||
+ | void resetLed() { | ||
+ | dOn = 200; | ||
+ | dOff = 20; | ||
+ | for (int i = 0; i < tricolor * 3; i++) { | ||
+ | digitalWrite(2 + i, LOW); | ||
+ | } | ||
+ | } | ||
+ | //////////////////////////////////// | ||
+ | |||
+ | void loop() { | ||
+ | //Boucle infinie principale du programe | ||
+ | isInfra(); | ||
+ | disp(); | ||
+ | } | ||
+ | |||
+ | void disp() { | ||
+ | //Affiche l'animation en fonction de la dernière touche pressée | ||
+ | if (key == 1) diag(); | ||
+ | if (key == 2) highToLow(); | ||
+ | if (key == 'P') resetLed(); | ||
+ | if (key == 3) lowToHigh(); | ||
+ | if (key == 4) turn(0); | ||
+ | if (key == 5) turn(1); | ||
+ | if (key == 6) blink(); | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | bool isInfra() { | ||
+ | //Test si un signal est reçu et gère en concéquence | ||
+ | if (irrecv.decode(&results)) { | ||
+ | Serial.println(results.value, HEX); | ||
+ | |||
+ | digitalWrite(IRconf_PIN, HIGH); delay(10);//Allume le témoin de reception de signal | ||
+ | digitalWrite(IRconf_PIN, LOW); | ||
+ | |||
+ | getKey(&results); | ||
+ | irrecv.resume(); // Recoit la valeur suivante | ||
+ | return 1; | ||
+ | } | ||
+ | else return 0; | ||
+ | } | ||
+ | char getKey(decode_results * results) { | ||
+ | //Transforme la valeur du signal reçu en sa valeur écrite sur la télécomande | ||
+ | //results contient la valeur en hexadecimal du signal infra-rouge reçu | ||
+ | resetLed(); | ||
+ | if (results->value == 0x8C2FB266 || results->value == 0x6604CFE0) key = 1; | ||
+ | if (results->value == 0x8E7CE7D0 || results->value == 0x6604CFD0) key = 2; | ||
+ | if (results->value == 0x8A4077AA || results->value == 0x6604CFE2) key = 'P'; | ||
+ | if (results->value == 0x7B985D02 || results->value == 0x6604CFF0) key = 3; | ||
+ | if (results->value == 0x6604CFC8 || results->value == 0x2C5793EA) key = 4; | ||
+ | if (results->value == 0xCE408870 || results->value == 0x6604CFE8) key = 5; | ||
+ | if (results->value == 0xF003D14A || results->value == 0x6604CFFA) decreaseSpeed(); | ||
+ | if (results->value == 0x6604CFC6 || results->value == 0xB9F72F4C) increaseSpeed(); | ||
+ | if (results->value == 0x7BEDD20C || results->value == 0x6604CFD8) { | ||
+ | key = 6; | ||
+ | dOn = 500; | ||
+ | dOff = 500; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | void increaseSpeed() { | ||
+ | //Augmente la vitesse des animations | ||
+ | if (dOn < 1500) { | ||
+ | dOn *= 1.1; | ||
+ | dOff *= 1.1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | void decreaseSpeed() { | ||
+ | //Diminue la vitesse des animations | ||
+ | if (dOn > 50) { | ||
+ | dOn *= 0.9; | ||
+ | dOff *= 0.9; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void turnOn(int groupe, int led) { | ||
+ | //Allume la diode "led" du groupe "groupe" | ||
+ | digitalWrite(2 + led + groupe * 3, HIGH); | ||
+ | } | ||
+ | |||
+ | |||
+ | void turnOff(int groupe, int led) { | ||
+ | //Eteint la diode "led" du groupe "groupe" | ||
+ | digitalWrite(2 + led + groupe * 3, LOW); | ||
+ | } | ||
+ | |||
+ | |||
+ | void offLine(int j) { | ||
+ | //Allume la diode "led" du groupe "groupe" | ||
+ | for (int i = 0; i < tricolor; i++) { | ||
+ | turnOff(i, j); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void onLine(int j) { | ||
+ | //allume une ligne composée de leds | ||
+ | for (int i = 0; i < tricolor; i++) { | ||
+ | turnOn(i, j); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void offColumn(int i) { | ||
+ | //éteind une colonne composée de leds | ||
+ | for (int j = 0; j < 3; j++) { | ||
+ | turnOff(i, j); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void onColumn(int i) { | ||
+ | //allume une colonne composée de leds | ||
+ | for (int j = 0; j < 3; j++) { | ||
+ | turnOn(i, j); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | void highToLow() { | ||
+ | //allume les leds du haut vers le bas | ||
+ | for (int j = 0; j < 3; j++) { | ||
+ | onLine(j); delay(dOn); | ||
+ | offLine(j); delay(dOff); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void lowToHigh() { | ||
+ | //allume les leds du bas vers le haut | ||
+ | for (int j = 0; j < 3; j++) { | ||
+ | onLine(2 - j); delay(dOn); | ||
+ | offLine(2 - j); delay(dOff); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void turn(bool b) { | ||
+ | //Rotation des leds | ||
+ | if (b == 1) { | ||
+ | for (int i = 0 ; i < tricolor; i++){ | ||
+ | onColumn(i); delay(dOn); | ||
+ | offColumn(i); delay(dOff); | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | for (int i = 0 ; i < tricolor; i++) { | ||
+ | onColumn(tricolor - 1 - i); delay(dOn); | ||
+ | offColumn(tricolor - 1 - i); delay(dOff); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void d iag() { | ||
+ | //balayage diagonale d'une led | ||
+ | char x = 0; | ||
+ | char y = 0; | ||
+ | char increment = 1; | ||
+ | while (isInfra() == 0) { | ||
+ | turnOn(x, y); delay(dOn); | ||
+ | turnOff(x, y); delay(dOff); | ||
+ | if (y == 2) increment = -1; | ||
+ | if (y == 0) increment = 1; | ||
+ | if (x == tricolor - 1) x = 0; | ||
+ | else x += 1; | ||
+ | y += increment; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void blink() { | ||
+ | // clignotement des leds | ||
+ | for (int i = 0 ; i < tricolor; i++){ | ||
+ | onColumn(i); | ||
+ | } delay(dOn); | ||
+ | for (int i = 0 ; i < tricolor; i++){ | ||
+ | offColumn(i); | ||
+ | } delay(dOff); | ||
+ | } | ||
+ | |||
+ | [[Fichier:16251228_10208163446830050_1530526705_o.jpg|400px|]] | ||
+ | |||
+ | |||
+ | ''Deuxième étape : L'assemblage des composants'' | ||
+ | |||
+ | |||
+ | Premièrement, il faut souder a chaque diode une résistance de 33kOhms. | ||
+ | Puis on soude un fil de 10-15 cm de longueur de chaque coté. | ||
+ | |||
+ | [[Fichier:16251420_10208163445630020_512191910_o.jpg|400px|]] | ||
+ | |||
+ | [[Fichier:16231418_1436799659664212_1867776002_o.jpg|400px|]] | ||
+ | |||
+ | On soude sur une même plaque toute les masses de chaque résistance afin de les lier. | ||
+ | On pourra y souder la masse du capteur infrarouge. | ||
+ | Par la suite on soude sur cette même plaque un dernier fil qui viendra sur la borne GND de l'Arduino. | ||
+ | |||
+ | Les fils libres viendront dans ce sens sur les bornes de l'arduino : | ||
+ | |||
+ | Patte 2 : vert | ||
+ | Patte 3 :jaune | ||
+ | Patte 4 : rouge | ||
+ | Patte 5 : vert | ||
+ | Patte 6 : jaune | ||
+ | Patte 7 : rouge | ||
+ | Patte 8 : vert | ||
+ | Patte 9 : jaune | ||
+ | Patte 10 : rouge | ||
+ | Patte 11 : Out Capteur infrarouge | ||
+ | Patte 12 : Jaune | ||
+ | |||
+ | |||
+ | |||
+ | ''Troisième partie : Le Nuage'' | ||
+ | |||
+ | Après avoir fini l'assemblage des composants, on fait tout rentrer dans la boule chinoise. | ||
+ | On fait ressortir les leds dans cet assemblage : (De façon circulaire) | ||
+ | 2 5 8 | ||
+ | 3 6 9 | ||
+ | 4 7 10 | ||
+ | La douzième correspond a la confirmation de réception du capteur infrarouge, vous pourrez donc la placer ou bon vous semble. | ||
+ | Enfin, on met de la colle forte sur la boule chinoise et on colle tout le polyester autour pour obtenir une forme de nuage. | ||
+ | |||
+ | [[Fichier:16251478_10208163444669996_1359296161_o.jpg|400px|]] | ||
== Comment ça marche ? == | == Comment ça marche ? == | ||
+ | |||
+ | |||
+ | ''Observation'' | ||
+ | |||
+ | Grâce au capteur infrarouge, on peut contrôler le nuage interactif facilement qui est connecté à l'ordinateur avec le câble USB. Il ne faut surtout pas oublier de televerser le code dans l'arduino. On peut utiliser le mode que l'on désire pour gérer les leds. | ||
+ | |||
+ | ''Explication'' | ||
+ | |||
+ | Pour comprendre toute cette manœuvre, il faut bien analyser le code. | ||
+ | Il existe 7 modes pour gérer les leds comme nous pouvons le voir dans le code... | ||
+ | |||
+ | |||
+ | [[Fichier:16251103_10208163444349988_433943472_o.jpg|400px|]] | ||
+ | |||
+ | == Et dans la vie de tous les jours? == | ||
+ | |||
+ | Ce si beau projet est une très belle décoration d'intérieur. | ||
+ | Il donne une ambiance "cosy" et ainsi on peut le placer n'importe où. | ||
+ | |||
+ | |||
+ | [[Fichier:16196438_10208131241544938_77279664_o.jpg|400px|]] | ||
+ | |||
+ | == Vous aimerez aussi == | ||
+ | |||
+ | Vous pouvez choisir la conception du nuage que vous voulez. On trouve beaucoup d'exemple de conception de nuage sur internet. | ||
+ | |||
+ | |||
+ | == Sources et liens utiles == | ||
+ | |||
+ | Aide pour arduino : [http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.DebuterPresentationLogiciel] | ||
+ | |||
+ | Conception du nuage : [https://www.youtube.com/watch?v=GYI-UBBNKY8] | ||
+ | |||
+ | [[Catégorie:ENIB2017]] |
Version actuelle datée du 26 janvier 2017 à 17:33
Quoi de mieux que de créer un nuage interactif de ses propres mains! Mais comment s'y prendre ? Ce projet, simple à réaliser, permet d'obtenir un bon résultat au final et surtout d'utiliser arduino!
Sommaire
Auteurs
Outils et Matériaux
Électronique :
ArduinoLEDs : 3R 3V 3J Plusieurs fils 9 résistances de 33kohm Infrared sensor = Kit IR snootlab 5€ Led jaune Récepteur infrarouge : TSOP32138 Battery or power source for arduino = cable usb / arduino Breadboard or blank circuit board
Autres :
Une vieille télécommande Flocon air fibre : polyester Colle forte Une boule chinoise
Outils :
Station de soudure
Réalisation du projet
Première étape : Le codage
- Tout se fait sur Arduino (langage C) - Pour comprendre cette étape il faut regarder le code. Nous avons rajouté des commentaires pour faciliter la compréhension.
/* NUAGE INTERACTIF Projet Petits Debrouillard Intersemestre 3 2017
Auteur : Manach Baptiste Solaiman Sarah Khalid Abdelhafid
Date : 16 Janvier 2017 */
#include <IRremote.h>
int RECV_PIN = 11; //Entree du capteur IR int IRconf_PIN = 12; //confirme la reception du signal IRrecv irrecv(RECV_PIN); decode_results results;
int tricolor = 3; //Nombre de groupe de 3 led int dOn = 200;//temps d'allumage int dOff = 20;//temps de pause d'allumage char key;//key correspond à la dernière touche pressee sur la telecomande
void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Initialise le recepteur pinMode(RECV_PIN, INPUT); pinMode(IRconf_PIN, OUTPUT);//Sortie du temoin de reception de signal for (int i = 0; i < tricolor * 3; i++) { //Initialise le nombre de sortie necessaire pour le nombre de groupe de diodes cablees pinMode(2 + i, OUTPUT); } } //Remet a l'etat de base l'arduino void resetLed() { dOn = 200; dOff = 20; for (int i = 0; i < tricolor * 3; i++) { digitalWrite(2 + i, LOW); } } ////////////////////////////////////
void loop() { //Boucle infinie principale du programe isInfra(); disp(); }
void disp() { //Affiche l'animation en fonction de la dernière touche pressée if (key == 1) diag(); if (key == 2) highToLow(); if (key == 'P') resetLed(); if (key == 3) lowToHigh(); if (key == 4) turn(0); if (key == 5) turn(1); if (key == 6) blink();
}
bool isInfra() { //Test si un signal est reçu et gère en concéquence if (irrecv.decode(&results)) { Serial.println(results.value, HEX);
digitalWrite(IRconf_PIN, HIGH); delay(10);//Allume le témoin de reception de signal digitalWrite(IRconf_PIN, LOW);
getKey(&results); irrecv.resume(); // Recoit la valeur suivante return 1; } else return 0; } char getKey(decode_results * results) { //Transforme la valeur du signal reçu en sa valeur écrite sur la télécomande //results contient la valeur en hexadecimal du signal infra-rouge reçu resetLed(); if (results->value == 0x8C2FB266 || results->value == 0x6604CFE0) key = 1; if (results->value == 0x8E7CE7D0 || results->value == 0x6604CFD0) key = 2; if (results->value == 0x8A4077AA || results->value == 0x6604CFE2) key = 'P'; if (results->value == 0x7B985D02 || results->value == 0x6604CFF0) key = 3; if (results->value == 0x6604CFC8 || results->value == 0x2C5793EA) key = 4; if (results->value == 0xCE408870 || results->value == 0x6604CFE8) key = 5; if (results->value == 0xF003D14A || results->value == 0x6604CFFA) decreaseSpeed(); if (results->value == 0x6604CFC6 || results->value == 0xB9F72F4C) increaseSpeed(); if (results->value == 0x7BEDD20C || results->value == 0x6604CFD8) { key = 6; dOn = 500; dOff = 500; } }
void increaseSpeed() { //Augmente la vitesse des animations if (dOn < 1500) { dOn *= 1.1; dOff *= 1.1; } }
void decreaseSpeed() { //Diminue la vitesse des animations if (dOn > 50) { dOn *= 0.9; dOff *= 0.9; } }
void turnOn(int groupe, int led) { //Allume la diode "led" du groupe "groupe" digitalWrite(2 + led + groupe * 3, HIGH); }
void turnOff(int groupe, int led) { //Eteint la diode "led" du groupe "groupe" digitalWrite(2 + led + groupe * 3, LOW); }
void offLine(int j) { //Allume la diode "led" du groupe "groupe" for (int i = 0; i < tricolor; i++) { turnOff(i, j); } }
void onLine(int j) { //allume une ligne composée de leds for (int i = 0; i < tricolor; i++) { turnOn(i, j); } }
void offColumn(int i) { //éteind une colonne composée de leds for (int j = 0; j < 3; j++) { turnOff(i, j); } }
void onColumn(int i) { //allume une colonne composée de leds for (int j = 0; j < 3; j++) { turnOn(i, j); } }
void highToLow() { //allume les leds du haut vers le bas for (int j = 0; j < 3; j++) { onLine(j); delay(dOn); offLine(j); delay(dOff); } }
void lowToHigh() { //allume les leds du bas vers le haut for (int j = 0; j < 3; j++) { onLine(2 - j); delay(dOn); offLine(2 - j); delay(dOff); } }
void turn(bool b) { //Rotation des leds if (b == 1) { for (int i = 0 ; i < tricolor; i++){ onColumn(i); delay(dOn); offColumn(i); delay(dOff); } } else { for (int i = 0 ; i < tricolor; i++) { onColumn(tricolor - 1 - i); delay(dOn); offColumn(tricolor - 1 - i); delay(dOff); } } }
void d iag() { //balayage diagonale d'une led char x = 0; char y = 0; char increment = 1; while (isInfra() == 0) { turnOn(x, y); delay(dOn); turnOff(x, y); delay(dOff); if (y == 2) increment = -1; if (y == 0) increment = 1; if (x == tricolor - 1) x = 0; else x += 1; y += increment; } }
void blink() { // clignotement des leds for (int i = 0 ; i < tricolor; i++){ onColumn(i); } delay(dOn); for (int i = 0 ; i < tricolor; i++){ offColumn(i); } delay(dOff); }
Deuxième étape : L'assemblage des composants
Premièrement, il faut souder a chaque diode une résistance de 33kOhms.
Puis on soude un fil de 10-15 cm de longueur de chaque coté.
On soude sur une même plaque toute les masses de chaque résistance afin de les lier. On pourra y souder la masse du capteur infrarouge. Par la suite on soude sur cette même plaque un dernier fil qui viendra sur la borne GND de l'Arduino.
Les fils libres viendront dans ce sens sur les bornes de l'arduino :
Patte 2 : vert Patte 3 :jaune Patte 4 : rouge Patte 5 : vert Patte 6 : jaune Patte 7 : rouge Patte 8 : vert Patte 9 : jaune Patte 10 : rouge Patte 11 : Out Capteur infrarouge Patte 12 : Jaune
Troisième partie : Le Nuage
Après avoir fini l'assemblage des composants, on fait tout rentrer dans la boule chinoise. On fait ressortir les leds dans cet assemblage : (De façon circulaire)
2 5 8 3 6 9 4 7 10
La douzième correspond a la confirmation de réception du capteur infrarouge, vous pourrez donc la placer ou bon vous semble. Enfin, on met de la colle forte sur la boule chinoise et on colle tout le polyester autour pour obtenir une forme de nuage.
Comment ça marche ?
Observation
Grâce au capteur infrarouge, on peut contrôler le nuage interactif facilement qui est connecté à l'ordinateur avec le câble USB. Il ne faut surtout pas oublier de televerser le code dans l'arduino. On peut utiliser le mode que l'on désire pour gérer les leds.
Explication
Pour comprendre toute cette manœuvre, il faut bien analyser le code. Il existe 7 modes pour gérer les leds comme nous pouvons le voir dans le code...
Et dans la vie de tous les jours?
Ce si beau projet est une très belle décoration d'intérieur. Il donne une ambiance "cosy" et ainsi on peut le placer n'importe où.
Vous aimerez aussi
Vous pouvez choisir la conception du nuage que vous voulez. On trouve beaucoup d'exemple de conception de nuage sur internet.
Sources et liens utiles
Aide pour arduino : [1]
Conception du nuage : [2]