Kit Bâton de Sorcier Interactif – Arduino 101, Bandeau LED, Régulateur de Tension
Composants et Fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Arduino 101 | 1 | |
| Régulateur de tension Pololu 4 $ | 1 | |
| Support 3 piles AA avec interrupteur | 1 | |
| Piles AA | 3 | Tout type convient |
| Adaptateur Jack Barrel Mâle | 1 | 1,95 $ - Connexion/déconnexion facile |
| Adaptateur Jack Barrel Femelle | 1 | 1,95 $ - Connexion/déconnexion facile |
| Bandeau LED adressable (NeoPixel compatible) | 1 | 60 LEDs, code compatible tout NeoPixel |
| Ruban adhésif sport (toile) | 1 | Maintient l'électronique et fait poignées |
| Élastiques | 1 | Maintien temporaire avant ruban |
| Bâton (manche à balai, tube arrosage, branche naturelle...) | 1 |
Applications et Services en Ligne
- Arduino IDE
À Propos de ce Projet
Ce projet utilise un Arduino 101, une batterie et un bandeau LED pour créer un bâton de sorcier à contrôle gestuel. Trois "sorts" (affichages lumineux) sont invoqués par trois gestes distincts.
Technologie
Le code utilise l'IMU (Unité de Mesure Inertielle) de l'Arduino 101 pour lire les forces G, sans utiliser le Moteur de Reconnaissance de Motifs (PME - pour un exemple avec PME, voir le projet de Kitty Yeung). À la place, le code compte les impulsions rapides sur les axes X, Y, Z et déclenche les sorts lors de combinaisons spécifiques dans un court laps de temps.
Lancer des Sorts
Deux tapes verticales rapides démarrent un sort, puis vous choisissez : mouvement brusque avant/arrière (Sort 1), inclinaison gauche/droite (Sort 2), ou troisième tape verticale (Sort 3). Une tape verticale finale lance le sort.
Retour Visuel
Pour guider l'utilisateur dans sa gestuelle, le bandeau LED donne un retour visuel à chaque étape. Double-tape initial : flash blanc rapide = sort démarré. Chaque étape suivante donne un retour visuel indiquant quel sort sera sélectionné.
Lancer des Sorts (En Détail)
Tenez le bâton avec l'Arduino 101 face à vous. Double-tapez doucement au sol (ou deux impulsions verticales rapides dans l'air). Au flash blanc :
- Mouvement brusque avant/arrière → Sort 1 (lumière verte fixe)
- Inclinaison gauche/droite → Sort 2 (lumière bleue fixe)
- Troisième impulsion verticale → Sort 3 (lumière rouge fixe)
Une fois la couleur fixe, tapez verticalement une dernière fois pour lancer le sort. Les LEDs scintillent et flashent dans la couleur choisie.
Les gestes sont chronométrés ! Vous avez seulement 1 seconde entre chaque étape, sinon le sort s'annule. Si vous ratez ou choisissez mal, attendez une seconde et recommencez. La maîtrise demande un peu de pratique, mais l'avantage est qu'aucun sort ne se déclenche accidentellement en marchant simplement avec le bâton.
Construction de l'Électronique
L'essentiel : Arduino 101, batterie, bandeau NeoPixel.
Options d'alimentation :
- Pile 9V directe sur Arduino 101 → autonomie très courte.
- Batterie LiPo → meilleur rapport puissance/poids mais nécessite chargeur sécurisé.
- Choix retenu : 3 piles AA + régulateur 4 $ = bon compromis autonomie/simplicité. Même montage que les projets Shadow Theater et Kaleidoscope Infinity Mirror.
Étape 1 : Récupérer le Connecteur du Bandeau LED
Coupez ~1 cm depuis l'extrémité du bandeau. Dénudez les fils.
Étape 2 : Préparer le Régulateur
Séparez les broches coudées fournies avec le régulateur. Soudez-en deux sur les fils vert et jaune pour les brancher facilement sur l'Arduino 101.
Étape 3 : Câbler le Régulateur
Soudez le fil rouge sur l'entrée VIN du régulateur. Soudez deux broches droites sur GND et VOUT.
Étape 4 : Connecteurs Jack Barrel
Dénudez les fils du boîtier piles, montez-les sur le jack mâle (ROUGE = +, NOIR = -). Serrez les vis.
Connectez le jack femelle sur les fils libres du début du bandeau LED. JAUNE = (-), ROUGE = (+).
Étape 5 : Brancher sur Arduino 101
FIL VERT → PIN 6 | FIL JAUNE → GND (près pin 13) | Régulateur : GND → GND, VOUT → VIN sur Arduino 101.
ATTENTION : Ne pas inverser ! Branchement inverse = odeur de brûlé et composants grillés. J'en ai fait l'expérience.
Téléversement du Code Exemple
Étape 1
Boîtier piles ÉTEINT. Connectez Arduino 101 en USB à l'ordinateur. Téléversez le code exemple via Arduino IDE.
Première fois avec Arduino 101 ? Guide officiel : arduino.cc/en/Guide/Arduino101
Une fois le code chargé, débranchez l'USB. Testez en allumant le boîtier piles et en essayant les gestes (port USB vers le bas, broches face à vous). Quatre mouvements verticaux déclenchent le Sort Rouge.
Discussion sur le Code (optionnel)
Si vous voulez juste utiliser le code tel quel, passez à "Construction du Bâton".
Le code utilise la détection de chocs de l'Arduino 101 pour compter les impulsions, avec un minuteur qui remet le compte à zéro après un court délai sans nouvelles impulsions. Si la bonne combinaison survient avant expiration, une fonction "sort" est appelée.
Une tape ferme au sol génère le choc initial + plusieurs "bruit" dus aux vibrations. Le début de loop() identifie l'impulsion dominante de chaque série et la catégorise simplement : 1 = verticale, 2 = avant/arrière, 3 = gauche/droite (variable gesture).
Un switch suit les combinaisons, style "livre dont vous êtes le héros" : "si prochaine impulsion = gauche/droite → étape 2, si minuteur expiré → retour à zéro".
Les Sorts (Personnalisables)
Ici vous changez facilement ce que fait chaque sort. Actuellement : code "theater-chase" Adafruit en différentes couleurs. Ajoutez-en, changez couleurs, écrivez vos propres fonctions. Les 3 premières variables de theaterChase = R, G, B. La dernière = vitesse (plus grand = plus lent).
void tapspell() { // Sort Rouge
theaterChase(strip.Color(127, 20, 0), 20);
theaterChase(strip.Color(127, 20, 50), 55);
strip.show();
}
void leftspell() { // Sort Bleu
theaterChase(strip.Color(0, 0, 100), 20);
theaterChase(strip.Color(0, 30, 120), 75);
strip.show();
}
void forwardspell() { // Sort Vert
theaterChase(strip.Color(0, 127, 0), 30);
theaterChase(strip.Color(0, 127, 90), 55);
strip.show();
}
Construction du Bâton
Place à la créativité ! Voici la base technique, amusez-vous à personnaliser. Diffuseurs (tulle, papier de soie, bouteille plastique sur les LEDs) créent de superbes effets.
Étape 1 : Trouver un Bâton/Canne
Manche à balai, tube arrosage, branche naturelle. Magasins de loisirs créatifs (Michaels, etc.) en vendent aussi. J'enroule une section de ruban sport pour zone de travail nette (optionnel).
Quelques élastiques pour faciliter la fixation.
Étape 2 : Placer Arduino 101 (Port USB vers le Bas)
Maintenez avec un élastique.
Étape 3 : Enrouler les LEDs (Élastiques aux Deux Extrémités)
Étape 4 : Fixer Arduino 101 et Boîtier Piles au Ruban Sport
Laissez l'accès à l'interrupteur du boîtier piles. Fixez solidement pour résister aux secousses/tapes, mais gardez à l'esprit le changement de piles.
Étape 5 : Diffuser les LEDs et Décorer
Code
Code Exemple Bâton de Sorcier (Arduino)
Compte les impulsions sur axes X, Y, Z. Certaines combinaisons invoquent des "sorts" (affichages lumineux) sur bandeau NeoPixel.
/* Copyright (c) 2016 Intel Corporation. Tous droits réservés. Voir licence fin de fichier. */
/* Arduino 101 "Wizard's Walking Staff." Utilise bibliothèque Adafruit Neopixel.
Installation : https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-installation
Assurez-vous d'avoir le dernier noyau Intel Curie. Info : https://www.arduino.cc/en/Guide/Arduino101 */
#include "CurieIMU.h"
#include <Adafruit_NeoPixel.h>
#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
int tr = 0, tg = 0, tb = 0; // Couleur cible pour lissage
int r = 0, g = 0, b = 0; // Couleur courante
long int globaltimer = 0;
long int gesturetimer = 0;
long int ledtimer = 0;
int fade = 10; // Vitesse fondu (lissage)
int tap = 0; // Compteur impulsions verticales
int lr = 0; // Compteur impulsions gauche/droite
int fb = 0; // Compteur impulsions avant/arrière
int gesture = 0; // 1=verticale, 2=gauche/droite, 3=avant/arrière
int state = 0; // Machine à états pour séquences gestuelles
void setup() {
globaltimer = millis();
gesturetimer = millis();
ledtimer = millis();
CurieIMU.begin();
CurieIMU.attachInterrupt(eventCallback);
CurieIMU.setDetectionThreshold(CURIE_IMU_SHOCK, 1500); // 1.5g = 1500 mg
CurieIMU.setDetectionDuration(CURIE_IMU_SHOCK, 50); // ms de pic pour interruption
CurieIMU.interrupts(CURIE_IMU_SHOCK);
strip.begin();
strip.show(); // Tout éteint
}
void loop() {
// Classification impulsion dominante (toutes les 170ms)
if (millis() - globaltimer > 170) {
if ((tap > lr) && (tap > fb)) { gesture = 1; } // Verticale
else if ((lr > fb) && (lr > tap)) { gesture = 2; } // Gauche/Droite
else if ((fb > lr) || (fb > tap)) { gesture = 3; } // Avant/Arrière
tap = 0; lr = 0; fb = 0; // Reset après classification
}
// Timeout global (1s)
if (millis() - globaltimer > 1000) {
globaltimer = millis() - 170;
tr = tg = tb = 0;
state = 0;
}
// Timeout geste (1s)
if (millis() - gesturetimer > 1000) {
gesturetimer = millis() - 350;
tr = tg = tb = 0;
state = 0;
}
// Machine à états des gestes
switch (state) {
case 0: // Attente première tape
if (millis() - gesturetimer > 350 && gesture == 1) {
state = 1; gesture = 0; gesturetimer = millis();
}
break;
case 1: // Une tape enregistrée, attend seconde
if (millis() - gesturetimer > 350 && gesture == 1) {
r = g = b = 10; // Flash blanc feedback
state = 2; gesture = 0; gesturetimer = millis();
}
break;
case 2: // Deux tapes - point de branchement vers 3 sorts
if (millis() - gesturetimer > 350) {
if (gesture == 1) { state = 3; gesture = 0; gesturetimer = millis(); } // Tap → Sort 3
if (gesture == 2) { state = 4; gesture = 0; gesturetimer = millis(); } // L/R → Sort 2
if (gesture == 3) { state = 5; gesture = 0; gesturetimer = millis(); } // F/B → Sort 1
}
break;
case 3: // Trois tapes - Sort 3 (Rouge), attend tape finale
tr = 20; tg = 0; tb = 0; globaltimer = millis() - 250;
if (millis() - gesturetimer > 350 && gesture == 1) {
state = 0; Serial.println("tapspell!"); tapspell();
}
break;
case 4: // 2 tapes + L/R - Sort 2 (Bleu), attend tape finale
tr = 0; tg = 0; tb = 20; globaltimer = millis() - 250;
if (millis() - gesturetimer > 350 && gesture == 1) {
state = 0; Serial.println("leftspell!"); leftspell();
}
break;
case 5: // 2 tapes + F/B - Sort 1 (Vert), attend tape finale
tr = 0; tg = 20; tb = 0; globaltimer = millis() - 250;
if (millis() - gesturetimer > 350 && gesture == 1) {
state = 0; Serial.println("forwardspell!"); forwardspell();
}
break;
}
// Lissage couleurs (toutes les 'fade' ms)
if (millis() - ledtimer > fade) {
if (tr > r + 1) r++; if (tg > g + 1) g++; if (tb > b + 1) b++;
if (tr < r) r--; if (tg < g) g--; if (tb < b) b--;
for (int i = 0; i < strip.numPixels(); i++) strip.setPixelColor(i, r, g, b);
strip.show();
ledtimer = millis();
}
}
// Interruption détection choc
static void eventCallback(void) {
if (CurieIMU.getInterruptStatus(CURIE_IMU_SHOCK)) {
if (CurieIMU.shockDetected(X_AXIS, POSITIVE) || CurieIMU.shockDetected(X_AXIS, NEGATIVE)) { tap++; globaltimer = millis(); }
if (CurieIMU.shockDetected(Y_AXIS, POSITIVE) || CurieIMU.shockDetected(Y_AXIS, NEGATIVE)) { lr++; globaltimer = millis(); }
if (CurieIMU.shockDetected(Z_AXIS, POSITIVE) || CurieIMU.shockDetected(Z_AXIS, NEGATIVE)) { fb++; globaltimer = millis(); }
}
}
// Fonctions sorts (exemple Adafruit theaterChase)
void tapspell() { theaterChase(strip.Color(127, 20, 0), 20); theaterChase(strip.Color(127, 20, 50), 55); strip.show(); }
void leftspell() { theaterChase(strip.Color(0, 0, 100), 20); theaterChase(strip.Color(0, 30, 120), 75); strip.show(); }
void forwardspell() { theaterChase(strip.Color(0, 127, 0), 30); theaterChase(strip.Color(0, 127, 90), 55); strip.show(); }
void theaterChase(uint32_t c, uint8_t wait) {
for (int j = 0; j < 10; j++) {
for (int q = 0; q < 3; q++) {
for (uint16_t i = 0; i < strip.numPixels(); i += 3) strip.setPixelColor(i + q, c);
strip.show(); delay(wait);
for (uint16_t i = 0; i < strip.numPixels(); i += 3) strip.setPixelColor(i + q, 0);
}
}
}
/* Licence GNU LGPL v2.1 ou ultérieure - Voir fin fichier original */
Processus de fabrication
- Détection des champs électriques AC : Guide pratique sur le couplage capacitif et le blindage
- Calculer la dissipation de puissance dans les circuits résistifs
- Sept conseils éprouvés pour sécuriser votre post-traitement en fabrication additive
- Couleur alimentaire : comment les teintes vibrantes stimulent l'appétit et la présentation
- Construire un Google Voice HAT DIY pour votre Raspberry Pi
- Construire un robot Arduino piloté par Raspberry Pi – Guide pas à pas
- Le Guide Complet de la Production de Fibre de Verre
- Célébrez l'excellence manufacturière — Choisissez votre propre jour pour la Journée de la fabrication
- Créer une animation de coupe progressive dans SolidWorks – Tutoriel Étape par Étape