1. Introduction

Qui n'a jamais rêvé de posséder un véritable sabre laser? De parcourir l'humidité des marécages de Dagobah, de jongler avec une aberration totale de la physique ou encore de trancher ardemment la main de son propre fils... Charmant, n'est-ce pas?
Il existe justement une pratique qui permet aux enfants comme aux trentenaires barbus de se prendre pour Luke Skywalker. Le cosplay rassemble toute une communauté de passionnés qui construisent costumes, accessoires et artefacts jusqu'au moindre détail. Sans se limiter aux épopées inter-galactiques, il n'est donc pas étonnant que cet art chevauche l'électronique et le code, puisque ces derniers permettent une grande créativité.

cosexample.jpg

Fig. 1 - Exemples d'applications électroniques dans le cosplay - (de gauche à droite) Nova de Kamui cosplay (3), Casque de Draugr par Bill Doran (4) et Tracer par Axceleration cosplay (2)

C'est en tant que grande fan de la saga de George Lucas et Sith dans l'âme que j'ai donc décidé de me construire mon propre sabre. Mais tout d'abord, néophyte que je suis, il me fallait développer un prototype plus simple afin de prendre mes marques en électronique.

1.1 But

Développer un P.O.C (Proof Of Concept) d'un modèle de sabre laser dont la lame est contrôlée par un Raspberry Pi. Le prototype se concentre sur la gestion des LEDs et du timing requis, ainsi que la base de l'assemblage avec l'interrupteur. Toutes les questions de software plus complexes ainsi que celle du son, des librairies de bruitage requises seront traitées dans la seconde partie de ce travail. Les jalons de cette première partie sont:

  • Allumer et éteindre les 24 LEDs du test
  • Pouvoir changer la couleur parmi celles prédéfinies
  • Animer "l'ouverture" du sabre
  • Assembler et connecter l'accéléromètre au Raspberry

1.2 Démarche

Ce projet semble tout d'abord loin d'être original, il existe une pléthore de sabres laser déjà sur le marché et certains passionnés proposent même la création d'armes personnalisées pour un certain prix. Cependant, la très grande majorité de ces dernier utilisent des microcontrôleurs de type Arduino ou Teensy. Equipés d'extensions, les propshield, ces sabres sont doté d'une large gamme de fonctionnalités, allant de l'animation LED pure et simple à l'affichage du niveau de batterie du sabre sur sa lame, en passant par l'ajout de bibliothèques de bruitages divers (1). De plus, il existe déjà une grande quantité de projets impliquant ce type de technologie. Travailler avec Arduino aurait nécessité d'apprendre en parallèle deux langages (C++ pour le premier et Python dans le cadre du cours), et même si cette technologie aurait été plus appropriée, je n'ai pas voulu me rendre la tâche plus difficile. Le seul projet ressemblant au mien est ce dernier: https://github.com/topshed/Pi-Saber, l'utilisation du Raspberry dans ce genre de circonstances est donc peu référencée.

Pour des raisons de taille, le Raspberry Nano a été choisi pour le projet final. Avec son format de 40x20 mm, il rentre parfaitement dans le profilé alu qui sera utilisé pour le manche. Cependant, afin de rendre le développement plus aisé, les premiers tests LEDs ont été effectués sur un Raspberry B+ standard. Le langage de programmation est Python.

1.3 Raspberry Pi

Le Raspberry Pi est un nano-ordinateur monocarte, composé d'une carte mère et de divers périphériques selon les versions. Le Raspberry Pi B+ est doté de 40 pin GPIO (General Purpose Input Output), 4 ports USB, un port micro-SD, un port jack 3.5 mm ainsi qu'un port Ethernet. Une fois connecté à la console d'un ordinateur via SSH (Secure Shell), il possible de travailler directement dessus et de lancer des scripts python. Durant ce travail, seul les ports USB et Ethernet ainsi que l'interface GPIO ont été utilisés.

Raspberry-Pi-Model-B-overhead-1-1540x1080.jpg

Fig. 2 - Raspberry PI 1 B+, vue globale (15)

1.4 Librairies

Contrairement à son homologue Arduino, le Raspberry est multi-tâche. Il est donc capable d'effectuer plusieurs opérations en parallèle, ce qui implique l'absence de temps réel et complique les applications nécessitant un timing très précis. Le contrôle de LEDs adressables entre donc dans cette catégorie. Les NeoPixel WS2812B nécessitent un signal data très spécifique que malheureusement les pin GPIO ne peuvent fournir par défaut.

Heureusement, après quelques recherches, je suis tombée sur une excellente librairie développée par Jeremy Garff : https://github.com/jgarff/rpi_ws281x. Elle gère les problèmes de temps réel via les technologies PWM et DMA. Le module PWM (Pulse Width Modulation) (10) est capable de générer un signal d'un rapport cyclique spécifique. Le module DMA (Direct Memory Access) (8) permet de transférer des octets entre les différentes parties du Raspberry en outrepassant le CPU (7)__et les tâches de fond. La structure de la librairie est "wrappée", elle ne requiert pas de connaissances bas-niveau et est donc relativement accessible à des amateurs.

De plus, une autre librairie spécifique a été nécessaire afin d'utiliser l'accéléromètre trois-axes https://github.com/pimoroni/adxl345....

1.5 Communication I2C

I2C (Inter-Integrated Circuit) (13) est un bus informatique qui permet le transfert de données au sein d'un circuit imprimé ou entre un microcontrôleur et des composants externes. Suivant une structure maître-esclave bidirectionnelle (le "maître" envoie le signal en premier, mais les composants peuvent échanger leurs rôles), la connexion est faite par l'intermédiaire de deux lignes: SDA (Serial Data Line) et SCL (Serial Clock Line). La première fait passer les données et la seconde l'horloge de synchronisation. Le choix d'utiliser I2C pour connecter l'ADXL345 et le Raspberry vient principalement du fait que le protocole I2C est standardisé et il existe donc beaucoup d'exemples. De plus, il n'est basé que sur deux lignes, contrairement à SPI (Serial Peripheral Interface) qui en requiert quatre.

2. Matériel et méthodes

2.1 Matériel

  • 1x Raspberry Pi B+
  • 1x Breadboard
  • 15x Fil jumper (male-to-male)
  • 3x 8 LEDs adressables WS2812B NeoPixel
  • 2x Résistances 10k Ohm
  • 1x Câble micro-USB
  • 1x Câble ruban GPIO-compatible
  • 1x Câble Ethernet
  • 1x Interrupteur switch
  • 1x Pi Wedge B+



2.2 Outils et autres

  • 1x Fer à souder
  • 1x Fil d'étain
  • 1x Voltmètre
  • 1x Ordinateur avec connexion internet

2.3 Méthode

2.3.1 Assemblage

Une fois le matériel rassemblé, les plaques de LEDs ont été soudées ensemble et fixées sur un support plastique non-conducteur. Suivant un branchement logique, 5v sur 5v, GND sur GND et DIN (Data In) sur DOUT (Data Out).

soudureh.png

Fig. 2 - Soudure très grossière des LEDs

L'accéléromètre a ensuite été soudé aux pin. Et enfin les soudures ont été testées en lançant un script Arduino.

strandtestuuu.png

Fig. 5 - Test du LEDs strip avec Arduino

2.3.2 Connection

uglywire1.png

Fig. 3 - Photo du montage

Comme illustré dans la figure 3, les branchements ont été effectués de la façon suivante:

  • Pour les LEDs, GND sur GND, 5v su 5v et DIN sur le pin GPIO 18 (PWM).
  • Pour l'interrupteur, 5v et une première résistance 10k Ohm sur la patte de gauche ainsi qu'une seconde reliée vers le pin G17 et GND relié à la patte de droite.
  • Pour l'accéléromètre, GND sur GND, 3.3v sur 3.3v, SDA sur SDA et SCL sur SCL.

GPIOB+_pinout.png

Fig. 4 - Pinout GPIO du Raspberry B+ (14)

2.3.3 Code

La librairie rpi_ws281x a été installée en suivant le tutoriel issu du site www.adafruit.com (5). Des extensions nécessaires ont été installées via les commandes sudo apt-get update et sudo apt-get install build-essential python-dev git scons swig. La source de la librairie a été ensuite téléchargée depuis le GitHub du concepteur git clone https://github.com/jgarff/rpi_ws281x.git puis installée avec la commande scons après être entré dans le clone. Toujours dans le clone de la librairie, dans le répertoire "python", sudo python setup.py install permet l'installation du wrapper python, la fonction qui fait appel a l'API (Application Programming Interface) bas-niveau de la librairie. Le wrapper python présente des similarités avec la librairie NeoPixel Arduino.
La librairie ADXL345 a ensuite été installée suivant un processus similaire (16).

En se basant sur le fichier strandtest.py donné en exemple dans la librairie, un petit algorithme d'ouverture a été développé. Lorsque l'interrupteur est pressé, la fonction def colorWipe() est appelée et la variable icolor se voit ajouter 1. La couleur affichée par les LEDs (R, G, B) dépend de l'intensité de chaque LED (0 ; 255) et de la valeur de la variable icolor. L'interrupteur requiert, afin d'éviter une activation multiple, une variable (ici input). Une valeur est prélevée du pin G17 et attribuée à input, si elle diffère de la valeur de départ, "Button pressed" s'affiche sur la console et l'algorithme d'allumage est lancé. À à chaque fois que l'interrupteur est pressé, la couleur change.

Pour ce qui est du test de l'accéléromètre, une fois la librairie ADXL345 importée import ADXL345 , il a juste fallu faire une boucle while True: et d'attribuer à la variable axes les entrées de l'objet adxl345 adxl345.getAxes(True) (True donne le résultat en g) et de print les valeurs obtenues pour les axes x, y et z. Une fois lancé, le script rafraîchit les valeurs environ toutes les secondes et on peut observer sur la console les variations.








3. Résultats

Illustration de l'ouverture de la "lame" et la sélection des couleurs dans un array prédéfini.

Illustration de l'utilisation de l'accéléromètre en temps réel, les valeurs données en g.

accelerometer.3gp

4. Discussion

Globalement, une majorité des jalons ont été atteints. Cependant, le projet a grandement évolué par rapport à son pré-projet. Décider de changer de technologie a impliqué de chercher des solutions annexes. Une action qui aurait nécessité cinq lignes de code en Arduino a parfois demandé le double ici. L'utilisation de la librairie requiert d'appeler différentes fonctions, ce qui alourdit le code. Par ailleurs, ajouter l'interrupteur et implémenter le programme requis pour éviter le "bouncing" s'est avéré difficile. Parvenir à situer l'erreur entre le code et le hardware est quelque chose que j'ai dû apprendre en tâtonnant. J'ai encore divers problèmes à régler, notamment trouver une batterie suffisamment puissante pour alimenter les deux mètres de LEDs strip de la lame et qui soit relativement petite. La question de la sortie audio doit aussi être soulevée, le Raspberry Nano n'en possédant pas. Il faudra aussi développer les animations de choc sur la lame et pouvoir lancer le script sans passer par le terminal.

5. Conclusion

La partie la plus limitante de ce projet, la gestion des LEDs, étant assurée, cela garantit du moins l'existence d'un sabre laser basique fonctionnel. Certes la configuration actuelle est spartiate pour rester euphémistique, mais a au moins permis d'expérimenter avec les composants principaux de l'objet final. Enfin, les exemples de script python ont introduit les bases du langage, comme les notions de classe et d'objets. Le projet pourra donc continuer son développement durant le travail de printemps.

6. Glossaire

  • API : L'interface de programmation applicative est un ensemble normalisé de fonctions qui servent de façade via lesquels un logiciel (fournisseur) fournit des services à d'autres logiciels (consommateurs).
  • CPU : Central Processing Unit ou processeur est des composants électroniques principaux de l'ordinateur. Il se charge d'exécuter les instructions machine des programmes informatiques.
  • DMA : L'accès direct à la mémoire est un procédé où les données circulant entre les périphériques sont transférées directement à la mémoire, sans passer par le CPU.
  • PWM : Modulation de Largeur d'Impulsion (MLI) est une technique de modulation qui permet d'encoder un message en un signal précis.
  • Rapport cyclique : Le rapport cyclique, ou duty cycle désigne une fraction de la longueur d'ondes sur la période de temps durant lequel un signal est actif.
  • SSH : Désigne un protocole de communication réseau crypté, couramment utilisé pour joindre des servers ou des dispositifs tels que le Raspberry.
  • wrapper : Une fonction wrapper est une sous-routine dont le but est d'appeler une suite d'autres fonctions au sein d'une librairie ou d'un programme.

Références

Sources images