Wiki

Reso-nance numérique | Arts et cultures libres

Outils du site


Panneau latéral

projets:brutbox:dev:wireless:accueil

Brutbow wifi wireless

dev

puredata

  • Création d'un objet [bbw-in] et [bbw-in-help] sur la base de [bb-in].
  • Solution temporaire pour la gestion des etats avec un fichier text local [text -k] car pb avec le systeme actuel et la malinette.
  • Le patch “all-bbb-in.pd” est a ouvir en plus des patchs de jeu, qui ne contiennent pas d'objets [bbw-in].
  • Le patch “all-bbb-in.pd” ne rappelle que l'etat dans lequel le patch a été enregistré. remet en question la presence des objects [bb-in] au sein de chaque patch, (pour ne pas multiplier les objects osc-in)… fonctionne avec des objects [s bbw1],[s bbw2] etc.

===proposition d'id a implémenter ds le code arduino :===

b-bleu
b-jaune
b-rouge
b-vert

rot-1
rot-2
pres-1
pres-2

dist-1
dist-2
lum-1
lum-2

!! actuellement id pressure2= idpressure1

ESP8266

code original

Le  code original écrit par Guillaume Bertrand regroupe tous les types de capteurs brutbox en un seul fichier. Chaque capteur peut être personnalisé via des define placé en début de fichier. Ce code permet l'utilisation de capteurs analogiques comme numérique et prévoit une implémentation inachevée d'un gyroscope/accéleromètre à base de MPU5060. Pour en faciliter le développement et la maintenance, nous l'avons totalement refondu en une implémentation différente.

code v2

Cette nouvelle implémentation comporte trois codes distincts : un pour les capteurs analogiques (potentiomètre, pression, distance, lumière…), un pour les numériques (bouton poussoir, capteurs capacitifs…) et un pour le gyroscope/accéléromètre. Chacun de ces codes est paramétrable via des define en en-tête de fichier. Cette implémentation intègre de nouvelles fonctionnalitées :

  • gestion du MPU5060 en différents modes (accéléro, gyro, choc) incorporant les fonctions du Digital Motion Processor intégré
  • activation du flash en OTA (possibilité de flasher le firmware des brutbox sans les démonter, par le wifi)
  • filtrage basique des données pour les capteurs analogiques
  • mode “choc” pour les capteurs analogiques détectant un changement rapide de valeur (permettant par exemple de déclencher des effets différents selon le type d'appui sur le capteur de pression)
  • possibilité d'ajouter simplement autant d'entrées que nécessaires sur les capteurs numériques (exemple du puzzle crèche)
  • limitation du nombre de messages envoyés par seconde pour éviter une congestion des messages sous puredata
  • attribution automatique pour chaque brutbox d'un nom unique comprenant son adresse MAC

communication ESP8266 -> puredata

À plusieurs occasions il a été constaté un dysfonctionnement important du système amenant une latence de plus en plus importante entre la manipulation du capteur à son effet audible, pouvant aller jusqu'au crash de pd. Des essais ont été menés pour en déterminer la cause.

latence ESP8266

Pour mesurer le temps nécessaire à l'ESP8266 pour empaqueter un message OSC et l'envoyer, un firmware spécifique a mesuré le temps écoulé entre le début de l'empaquetage et la fin de l'envoi, après la suppression du message en RAM via la fonction micros(). La durée moyenne mesurée est de 600µs +- 100µs. Cette durée est extrêmement stable dans le temps et ne dépend pas du message à envoyer. La latence observée ne vient donc pas de l'ESP8266

latence routeur/broadcast/carte wifi/ OS

Puisque la latence ne provient pas de l'ESP8266, elle peut être imputable :

  • au routeur qui met du temps à dispatcher les messages en broadcast
  • à la carte wifi de l'ordinateur sur lequel tourne pd qui met ces messages en mémoire tampon
  • à la qualité de la connection wifi lorsque beaucoup d'appareils sont connectés (perte de paquets UDP)

Pour tester l'ensemble, un script python envoie régulièrement sur le port série un nombre aléatoire. L'ESP8266 flashé avec un firmware spécifique reçoit ce nombre et le renvoie en OSC via le broadcast. Ce message arrive donc au routeur qui le distribue à l'ordinateur qui mesure alors le temps écoulé entre l'envoi de ce nombre sur le port série et sa réception en OSC. Il tient également le compte des messages envoyés en série mais jamais reçus en OSC (paquets perdus). La réception OSC est gérée par liblo, une implémentation en C légère et performante du protocole OSC. Ce test à été effectué sur de longues durées de fonctionnement (plusieurs heures) avec toutes les brutbox connectées. Les paquets série ont étés envoyés le plus rapidement possible soit toutes les 8ms.

Résultats : l'aller-retour des messages prends en moyenne 9ms (90% des messages ont un délai compris entre 8ms et 17ms) et la perte de paquet est minimale (inférieure à 0.6%). La latence observée (>50ms) ne peut donc être liée ni au routeur, ni à la qualité de la connection, ni au système d'exploitation. Le problème se situe donc en aval de cette chaine, dans puredata. Pour comprendre si le dépaquetage de l'OSC en était à l'origine, d'autres méthodes de communication entre les brutbox et puredata ont été essayées.

osc2pd

Un script python reçoit les messages OSC, utilisant toujours liblo. Il utilise ensuite l'utilitaire pdsend pour en envoyer le contenu en UDP local à puredata. Par exemple, un message /monOSC contenant le flottant 0.12 sera traduit en la commande echo /monOSC 0.12 | pdsend 10000 localhost udp qui passera l'addresse OSC ainsi que la valeur à puredata en UDP sur le port 10000. On pourra la récupérer dans un patch via [netreceive -u 10000] et éventuellement utiliser [route /monOSC] pour trier les messages entrant. Cette méthode ne nécessite donc aucun paramétrage particulier puisqu'elle traduit directement tout message entrant en un message du même nom, permettant d'utiliser les mêmes [route] qu'on utiliserait pour un message OSC. Elle s'appuie toujours sur la couche réseau de puredata mais permet d'éviter le dépaquetage de l'OSC dans pd.

À ce jour, cette méthode montre encore une latence trop importante pour être dûe au seul traitement de l'OSC à l'intérieur de puredata. Pour vérifier le rôle de la couche réseau de PD, il est nécessaire de l'éviter en utilisant une autre voie de communication.

Le gain en vitesse de calcul comparé à la réception OSC interne à puredata n'a pas été évalué et il peut être tout de même bénéfique d'externaliser ce traitement en utilisant liblo à la place d'une abstraction pd. Un script d'installation pour debian et ses dérivés (ubuntu, raspbian…) ainsi qu'un exemple puredata sont disponibles sur le git. L'installation se fait en téléchargeant le dossier osc2pd sur le disque dur puis en exécutant sudo bash ./setup. Une connection à Internet est nécessaire pour télécharger les dépendances. Le script peut alors être lancé par la commande python3 osc2pd.py. Il écoutera sur le port 8000 et renverra à pd sur le port 10000.

osc2alsa-midi

Pour essayer une autre voie de communication, un troisième script python retranscrit les messages OSC reçus sous forme de control change MIDI sur l'entrée MIDI ALSA de puredata. Comme pour osc2pd, la transcription des données en alsa-midi n'a pas fait disparaître le problème de latence mais n'a pas été testée contre la gestion de l'OSC par pd. Cette méthode n'est pas conseillée puisqu'elle demande un adressage OSC → numéro de CC et réduit la précision des données qui passent d'un float a un entier 7bit.

installation

Un script d'installation pour debian et dérivés (ubuntu, raspbian…) permet d'installer les dépendances requises. Une fois connecté à Internet, exécuter sudo bash ./setup pour lancer l'installation. Le script se lance par la commande python3 osc2alsa-midi.py

utilisation

Par défaut, le script tente de se connecter au port ALSA-midi de puredata quand on le lance. Si puredata n'est pas lançé ou pas configuré pour utiliser ALSA-MIDI avec au moins un port en entrée, une erreur sera affichée et le script s'arrêtera. Pour lancer automatiquement puredata avec la bonne configuration midi, ajouter les arguments -alsamidi -midiaddindev "ALSA MIDI device #1" au lancement de pd. Il est également possible de demander au script de lancer puredata en indiquant son chemin ligne 29 ( pdCommand = "pd" ou pdCommand = "/home/monUser/pd-0.xx/bin/pd" par exemple)

La réception des données depuis le patch s'effectue comme n'importe quelle interface midi avec l'objet [ctlin]. Un patch d'exemple est fourni.

adressage

Le script tient une liste des adresses OSC reçues dans le fichier OSCaddresses.txt qu'il génère si nécessaire. À tout nouveau message reçu sera attribué un numéro de control change entre 0 et 127. Il est possible d'ajouter ou modifier manuellement les attributions en modifiant ce fichier texte. Pour assigner le CC#5 à l'adresse /monOSC, il suffit d'ajouter une ligne : /monOsc -> 5. Les lignes commençant par le symbole # seront ignorées. Si deux adresses sont assignées au même CC, le script affichera un message d'erreur et la seconde sera ignorée. Pour chaque message, la valeur attendue est un float entre 0 et 1 qui sera transformé en une valeur entière entre 0 et 127

la solution ?

Comme nous l'avons vu, le problème de congestion observé provient bien de la façon dont les données sont gérée à l'intérieur de pd. Mes connaissances du fonctionnement interne de pd ne permettant pas d'en déterminer la cause plus avant, j'ai cherché une solution plus simple mais fiable. En limitant la quantité de messages émis par les capteurs à ~30 à 40 messages par secondes, ce phénomène ne se produit plus. Cette limitation n'étant pas liée à un delay() dans le code de l'ESP8266, elle n'induit aucune latence additionnelle. Le délai minimal entre deux messages émis par le même capteur est ajustable en en-tête des firmwares par la ligne #define MAX_RATE 30 où il est renseigné en millisecondes. La valeur de 30ms (soit ~33 messages/seconde max) semble sûre mais réactive. Des tests additionnels en situation réelle doivent être poursuivis avant de considérer ce problème comme définitivement clos.

Photos

Materiel

Liste de matériel et composants a faire

Autres photos, galerie, …

/home/resonancg/www/wiki/data/pages/projets/brutbox/dev/wireless/accueil.txt · Dernière modification: 2020/04/10 15:07 de laurent