Wiki

Reso-nance numérique | Arts et cultures libres

Outils du site


projets:olo_220v:accueil

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
projets:olo_220v:accueil [2020/03/12 17:47]
laurent [Interface web]
projets:olo_220v:accueil [2020/05/26 08:50] (Version actuelle)
resonance [Jeu]
Ligne 3: Ligne 3:
   * Date : 2020   * Date : 2020
   * Licence : libre !   * Licence : libre !
-  * Contexte : +  * Contexte : Invitation à Bergen by BEK : postponed for coronavirus...
   * Fichiers : lien   * Fichiers : lien
   * Lien : lien vers un site éventuellement   * Lien : lien vers un site éventuellement
Ligne 10: Ligne 10:
 {{tag>esp8266 lumieres}} {{tag>esp8266 lumieres}}
 ===== Description ===== ===== Description =====
- +{{ :projets:olo_220v:olowiring.png?direct&600 |}}
-{{ :projets:olo_220v:screen_shot_01-16-20_at_11.11_am.png?nolink&900 |}}+
 Olo en version 220v.... Olo en version 220v....
  
  
 ===== Jeu ===== ===== Jeu =====
 +
 Sur une interface representant les differentes lumieres. Sur une interface representant les differentes lumieres.
  
 On peut enregistrer une sequence en appuyant sur des boutons (ou interface photoresitance) On peut enregistrer une sequence en appuyant sur des boutons (ou interface photoresitance)
-  * Si une premiere sequence de 10secondes a été enregistré elle joue en boucle... et progressivement le niveau lumineux decroit pour s'eteindre au bout d'un moment...+ 
-  * Si une deuxieme sequence de 3s est ajouté , elle s'additionne a la premiere et joue en boucle toutes les 3secondes.... et decroit aussi avec le temps... +  * Si une premiere sequence de 10secondes a été enregistré elle joue en boucle… et progressivement le niveau lumineux decroit pour s'eteindre au bout d'un moment
-  * etc...+  * Si une deuxieme sequence de 3s est ajouté , elle s'additionne a la premiere et joue en boucle toutes les 3secondes. et decroit aussi avec le temps 
  
  
Ligne 30: Ligne 31:
   * douille E27 + ampoule halogene   (4€)   * douille E27 + ampoule halogene   (4€)
   * prise 220v male   (1€)   * prise 220v male   (1€)
 +  * potentiomètre (1€)
   * jumpers divers   * jumpers divers
   * fils electriques 220v 0.75  (2€)   * fils electriques 220v 0.75  (2€)
Ligne 41: Ligne 43:
 Ca clignote un peu quand on est pres du zero... il faut plutot se ballader entre 5% et 100% pour eviter ces clignotements... Ca clignote un peu quand on est pres du zero... il faut plutot se ballader entre 5% et 100% pour eviter ces clignotements...
  
-===== Code source  ===== +===== Fonctionnement  ===== 
-[[https://github.com/reso-nance/thisIsNotOLO]|repo du projet] +Le code source est consultable sur le [[https://github.com/reso-nance/thisIsNotOLO|git du projet]]. Il est composé de **C/Arduino** pour les ESP8266, de **python** pour le serveur/backend et de **javascript** pour l'interface web.
  
 ==== ESP8266 ==== ==== ESP8266 ====
-Les ESP se connectent sur un routeur dédié et attendent de recevoir en OSC +===câblage=== 
-/[hostname]/light [valeur] : où [hostname] est **light_** suivi d'un numéro (ex: //light_10//) [valuela valeur d'éclairage de 0 à 100 +Les ESP8266 sont alimentés en 5v via un petit convertisseur 230VAC -> 5VDC dédié. Ils alimentent à leur tour un [[ https://robotdyn.com/ac-light-dimmer-module-1-channel-3-3v-5v-logic-ac-50-60hz-220v-110v.html | module dimmer avec détection du point zéro]] qui alimentera en PWM l'ampoule halogèneUn potentiomètre permet de contrôler manuellement l'ampoule et de désactiver la réception OSC
-Ils répondent /ACK avec en premier argument leur nom d'hôte et en second la valeur changéeÇa permet de leur renvoyer automatiquement une valeur qui n'aurait pas été reçue en cas de wifi pas tip top+^ ESP8266 ^ dimmer ^ Potentiomètre  ^ convertisseur 220VAC->5VDC          ^ 
-Par défaut les ESP envoient en broadcast, sauf s'il reçoivent l'OSC "/whoIsThere" : ils enverront alors à la dernière IP qui leur aura envoyé ce message et répondent en se présentant (/myID  avec leur hostname)+| G       | GND    | patte externe  | -v                                  |    
 +| 5v      |        |                | +v                                  |  
 +| 3v3     | VCC    | patte externe  |                                     |  
 +| A0      |        | patte centrale |                                     |  
 +| D1      | PWM    |                |                                     | 
 +| D2      | ZC                    |                                      
  
-==== Interface web ====+=== réseau === 
 +Les ESP8266 se connectent sur un routeur dédié dont le SSID et éventuellement mot de passe est défini dans le code : 
 +<code cpp> 
 +static char* PSK = NULL; 
 +static char* SSID = "bergen.olo"; 
 +</code> 
 +Un //nom d'hôte// unique les identifie au sein du réseau. Celui-ci permettra de faire correspondre chaque ESP à une fenêtre donnée de l'interface web. Ce nom d'hôte est composé de **light** immédiatement suivi d'un chiffre entre 0 et 11 (ex : **light2**). Il est également défini dans le code : 
 +<code cpp>#define FIXED_HOSTNAME "light0"</code> 
 +Dès leur connexion au réseau, ils se présenterons en donnant leur nom d'hôte et leur IP au serveur (par défaut en broadcast). Si celui-ci leur répond, ils stockeront l’adresse IP d'où provient la réponse qu'ils utiliseront pour toute communication ultérieure. 
 +Si nécessaire, il est possible de flasher les ESP //Over The Air// par le port 8266. 
 +<==== Interface web ====
 Un Raspberry Pi est utilisé pour servir une interface web via un script python3 utilisant //flask// et //socketIO//. L'interface présente 12 fenêtres sous forme de deux rangées de six cases. Si les ESP8266 représentant une fenêtre ne sont pas branchés, la case reste inactive. Un Raspberry Pi est utilisé pour servir une interface web via un script python3 utilisant //flask// et //socketIO//. L'interface présente 12 fenêtres sous forme de deux rangées de six cases. Si les ESP8266 représentant une fenêtre ne sont pas branchés, la case reste inactive.
-La déclaration des ESP8266 attendus se fait dans le fichier config.py où il est possible d'entrer sous forme de liste les identifiants des ESP8266 connectés : ''%%activeWindows = [0, 1, 2, 4, 5, 6, 7, 8, 10, 11]%%'' les numéros de 0 à 11 correspondant aux identifiants donnés aux lampes.+La déclaration des ESP8266 attendus se fait dans le fichier **config.py** où il est possible d'entrer sous forme de liste les identifiants des ESP8266 connectés : ''%%activeWindows = [0, 1, 2, 4, 5, 6, 7, 8, 10, 11]%%'' les numéros de 0 à 11 correspondant aux identifiants donnés aux lampes.
  
-La génération de son côté client se fait par la librairie **Tone.js** qui permet de créer un oscillateur multiple et d'y ajouter de la réverb. Les réglages de l'oscillateur (ADSR, nombre d'oscillateurs, déphasage, forme d'onde) sont stockés dans le fichier **static/js/index.js** :+La génération de son côté client se fait par la librairie [[https://tonejs.github.io/Tone.js]] qui permet de créer un oscillateur multiple et d'y ajouter de la réverb. Les réglages de l'oscillateur (ADSR, nombre d'oscillateurs, déphasage, forme d'onde) sont stockés dans le fichier **static/js/index.js** :
 <code javascript> var synth = new Tone.PolySynth(3, Tone.Synth, { <code javascript> var synth = new Tone.PolySynth(3, Tone.Synth, {
         "oscillator" : {         "oscillator" : {
Ligne 83: Ligne 100:
 L'enregistrement d'une séquence débute avec le bouton **startRec**. L'utilisateur peut alors cliquer sur les icônes correspondant aux fenêtres qu'il veut allumer. Une pression maintenue correspondra à une lumière continue. Une fois la séquence voulue enregistrée, un appui sur le bouton **stopRec** clôturera l'enregistrement. La durée maximale d'enregistrement est réglable en ms dans le fichier config.py : ''%%sequenceMaxLength = 30000%%'' Une fois atteinte, l'enregistrement est automatiquement clôturé, comme si l'utilisateur avait cliqué sur **stopRec** Le bouton **play** envoie la séquence au serveur qui commencera immédiatement à la lire en boucle. Le bouton **remove** uniquement la dernière séquence jouée depuis cet appareil tandis que le bouton **clear** effacera toutes les séquences en cours de lecture. L'enregistrement d'une séquence débute avec le bouton **startRec**. L'utilisateur peut alors cliquer sur les icônes correspondant aux fenêtres qu'il veut allumer. Une pression maintenue correspondra à une lumière continue. Une fois la séquence voulue enregistrée, un appui sur le bouton **stopRec** clôturera l'enregistrement. La durée maximale d'enregistrement est réglable en ms dans le fichier config.py : ''%%sequenceMaxLength = 30000%%'' Une fois atteinte, l'enregistrement est automatiquement clôturé, comme si l'utilisateur avait cliqué sur **stopRec** Le bouton **play** envoie la séquence au serveur qui commencera immédiatement à la lire en boucle. Le bouton **remove** uniquement la dernière séquence jouée depuis cet appareil tandis que le bouton **clear** effacera toutes les séquences en cours de lecture.
  
 +==== lecture des séquences ====
 +Chaque séquence est lue en boucle, atténuée à chaque itération. L'atténuation est réglable (en pourcent par itération) dans le fichier config.py :''%%dampeningPerLoop = 10%%''. Cette atténuation peut être renforcée par une atténuation additionnelle dépendant du nombre de séquences utilisant les mêmes lampes : si une séquence est la seule à utiliser certaines lampes, elle mettra plus de temps à disparaître. Ce paramètre est réglable dans config.py ''%%dampeningPerUser%%'' (0 = désactivé)
 +
 +==== communication lampes/serveur ====
 +Serveur et lampes communiquent en OSC par UDP, le serveur écoute sur le **port 9000** et transmet sur le **port 8000** (donc l'inverse pour les ESP8266).
 +
 +Liste des messages OSC implémentés :
 +  * **/light** : fixe l'intensité de la lumière (si l'ESP est en mode OSC)
 +    * //(int) valeur// en pourcent 
 +    * ex : ///light3/light 50// allumera la lumière de la lampe 3 à 50%)
 +  * **/ACK** : réponse de l'ESP à ///light//, ce message permet au serveur de vérifier qu'un ordre a bien été reçu par la lampe
 +    * //(int) valeur// en pourcent
 +  * **/fade** : débute un fondu qui s'exécutera entièrement sur l'ESP (pour éviter un effet d'escalier dû à une perte de connection wifi)
 +    * //(int) start// : valeur de début du fondu
 +    * //(int) stop// : valeur attendue en fin de fondu.
 +    * //(int) durée// : durée du fondu en millisecondes.
 +    * ex : ///light2/fade 0 100 1000// allume graduellement la lumière au maximum en une seconde
 +    * ex2 : ///light1/fade 80 0 500// éteint la lumière de 80% à 0% en une demi-seconde.
 +  * **/fadeACK** : confirmation de la réception d'un ///fade//
 +    * //(int) start// : valeur de début du fondu
 +    * //(int) stop// : valeur attendue en fin de fondu.
 +    * //(int) durée// : durée du fondu en millisecondes.
 +  * **/whoIsThere** : envoyé en broadcast par le serveur, ce message déclenche la réponse des ESP :
 +  * **/myID** : répond au serveur qui enregistrera l'IP de la réponse
 +     * //(str) hostname// nom d'hôte de la lampe
 +  * **/beginOTA** : suspends l'activité de l'ESP (fondus en cours, réponse à l'OSC) durant 10s pour garantir le bon fonctionnement de l'OTA en toutes circonstances.
 +
 +
 +==== communication serveur/client ====
 +Pour créer un portail captif, on utilise un routeur flashé sous [[https://dd-wrt.com|DD-WRT]] qui permet d'utiliser //dnsmasq// pour router tout le trafic entrant vers le raspberry pi. Celui-ci se voit donc assigner une IP fixe (10.0.0.100) et on ajoutera l'option ''%%address=/#/10.0.0.100%%'' dans la configuration dnsmasq du routeur. Enfin, puisque le réseau Wifi sera public, on désactive l'interface de gestion du routeur en wifi, qui restera accessible depuis ses prises ethernet.
 +
 +Côté Pi, la communication serveur/client est gérée par //flask// qui redirigera toutes les requêtes vers la page d'accueil de l'interface web. Le SSL n'étant pas implémenté, les requêtes SSL ne pourront aboutir. Les websockets via //flask-socketio// assurent une communication fluide entre front-end et backend (envoi de séquences vers le serveur, déclenchement de sons sur l'interface des clients...). Le serveur web écoute sur le port 8080 mais une redirection d'//iptables// redirige le port 80 sur le port 8080.
 ===== Idées design  ===== ===== Idées design  =====
 Idée design tasseau + conserve.. :{{ :projets:olo_220v:ololamp.blend |}} Idée design tasseau + conserve.. :{{ :projets:olo_220v:ololamp.blend |}}
/home/resonancg/www/wiki/data/attic/projets/olo_220v/accueil.1584031673.txt.gz · Dernière modification: 2020/03/12 17:47 de laurent