Wiki

Reso-nance numérique | Arts et cultures libres

Outils du site


ateliers:esp-osc: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
Prochaine révision Les deux révisions suivantes
ateliers:esp-osc:accueil [2020/01/30 10:35]
laurent [OSC]
ateliers:esp-osc:accueil [2020/01/30 10:44]
laurent [OSC]
Ligne 20: Ligne 20:
  
 Pour envoyer des données en UDP depuis un ESP8266, on peut utiliser le code suivant, commenté ligne par ligne. Il est également disponible sur le [[https://github.com/reso-nance/INIT-ESP8266-OSC | repo github de l'init]] Pour envoyer des données en UDP depuis un ESP8266, on peut utiliser le code suivant, commenté ligne par ligne. Il est également disponible sur le [[https://github.com/reso-nance/INIT-ESP8266-OSC | repo github de l'init]]
-++++ UDP.ino|+++++ envoiUDP.ino|
 <code cpp>#include <ESP8266WiFi.h> // fonctions wifi : connection en station ou point d'accès, addresses IP ... <code cpp>#include <ESP8266WiFi.h> // fonctions wifi : connection en station ou point d'accès, addresses IP ...
 #include <WiFiUdp.h> // création de paquets UDP et envoi sur le réseau #include <WiFiUdp.h> // création de paquets UDP et envoi sur le réseau
Ligne 57: Ligne 57:
  
 Pour afficher l'UDP reçu, un script python écoutant l'UDP entrant est également fourni Pour afficher l'UDP reçu, un script python écoutant l'UDP entrant est également fourni
-++++ UDP.py|+++++ receptionUDP.py|
 <code python>#!/usr/bin/env python <code python>#!/usr/bin/env python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
Ligne 89: Ligne 89:
  
 Pour créer un message OSC, on utilisera la bibliothèque OSC, disponible dans le gestionnaire de bibliothèque d'Arduino ou sur le [[https://github.com/reso-nance/INIT-ESP8266-OSC | repo de cet INIT]] Dans cet exemple, nous lirons la valeur d'un potentiomètre câblé sur l'entrée analogique de l'ESP8266 {{ :ateliers:esp-osc:montage.png?direct&400 |}} Pour créer un message OSC, on utilisera la bibliothèque OSC, disponible dans le gestionnaire de bibliothèque d'Arduino ou sur le [[https://github.com/reso-nance/INIT-ESP8266-OSC | repo de cet INIT]] Dans cet exemple, nous lirons la valeur d'un potentiomètre câblé sur l'entrée analogique de l'ESP8266 {{ :ateliers:esp-osc:montage.png?direct&400 |}}
-Pour éviter de surcharger le réseau, nous n'enverrons cette valeur que si elle à changée de plus de 2. Pour s'en assurer, on stocke dans une variable sa valeur précédente (au tour de boucle précédente) et on la compare à la valeur actuelle. Si la différence est supérieure à la tolérance, un message OSC est envoyé. Ce message aura pour addresse "/monOSCet un seul argument, la valeur du potentiomètre. On peut ajouter d'autres arguments au même message en répétant la ligne <code c++> message->add(VALEUR_A_AJOUTER)</code> avant l'envoi du message.+Pour éviter de surcharger le réseau, nous n'enverrons cette valeur que si elle à changée de plus de 2. Pour s'en assurer, on stocke dans une variable sa valeur précédente (au tour de boucle précédente) et on la compare à la valeur actuelle. Si la différence est supérieure à la tolérance, un message OSC est envoyé. Ce message aura pour addresse ///monOSC// et un seul argument, la valeur du potentiomètre. On peut ajouter d'autres arguments au même message en répétant la ligne <code c++> message->add(VALEUR_A_AJOUTER)</code> avant l'envoi du message. Le reste du code est commenté ligne par ligne. 
 +++++ envoiOSC.ino| 
 +<code cpp>#include <ESP8266WiFi.h> // fonctions wifi : connection en station ou point d'accès, addresses IP ... 
 +#include <WiFiUdp.h> // création de paquets UDP et envoi sur le réseau 
 +#include <OSCMessage.h> // gestion du protocol OSC en envoi et réception 
 + 
 +static char* nomDuReseau = "malinette"; // attention, sensible à la casse 
 +static char* motDePasse = "malinette666"; // idem 
 +static const int portOSC = 8000; // port auquel les paquets seront envoyés, doit être identique à celui du récepteur 
 +static IPAddress IPcible = IPAddress({10,0,0,255});// addresse à laquelle les messages sont envoyés, ici en broadcast 
 +static int tolerance = 2; // différence minimale entre la la valeur actuelle et la précédente à partir de laquelle les messages seront envoyés 
 +int valeurPrecedente = 0; // stockera la valeur précédente 
 +WiFiUDP UDP; 
 + 
 +void setup() { 
 +  Serial.begin(115200); // ouverture du port série 
 +  while (true) { // tant que la connection n'est pas établie, on restera coincé ici 
 +    Serial.println("\n\nConnection à " + String(nomDuReseau) + " ..."); 
 +    WiFi.mode(WIFI_STA); // mode station : se connecte à un point d'accès existant 
 +    WiFi.begin(nomDuReseau, motDePasse); // tentative de connection 
 +    ESP.wdtFeed(); // évite de rebooter l'ESP si l'opération le bloque trop longtemps 
 +    yield(); // rends la main à l'ESP 
 +    if ( WiFi.waitForConnectResult() == WL_CONNECTED ) {break;} // si la connection est établie, on sort de la boucle infinie 
 +  } 
 +  Serial.print("connecté, addresse IP : "); 
 +  Serial.println(WiFi.localIP()); // addresse IP attribuée à l'ESP par le routeur wifi auquel il se connecte 
 +
 + 
 +void loop() { 
 +  int valeurActuelle = analogRead(0); // lecture du port analogique 
 +  if (valeurActuelle < valeurPrecedente-tolerance || valeurActuelle > valeurPrecedente+tolerance) { // si la valeur à changée significativement 
 +    envoieOSC(valeurActuelle); 
 +    valeurPrecedente = valeurActuelle; // la tendance d'hier est le vintage d'aujourd'hui 
 +  } 
 +  yield(); // rends la main à l'ESP 
 +  delay(2); // une courte sieste lui permettra de travailler plus longtemps 
 +
 + 
 +void envoieOSC(int valeur) { 
 +  Serial.print("envoie la valeur "); Serial.println(valeur); 
 +  static char* addresseOSC = "/monOSC"; // l'addresse OSC doit correspondre à ce que le destinataire attends 
 +  OSCMessage* message = new OSCMessage(addresseOSC); // création d'un nouveau message vide 
 +  message->add((float) valeur/1024.0f);// on ajoute la valeur sous forme d'un float entre 0 et 1 
 +  UDP.beginPacket(IPcible, portOSC); // création d'un paquet UDP vide 
 +  message->send(UDP); // envoi du message OSC en UDP 
 +  UDP.endPacket(); // le paquet est refermé (sans ruban) 
 +  delete(message); // on nettoie derrière soi pour éviter de mauvaises surprises 
 +  ESP.wdtFeed(); 
 +  yield(); 
 +
 +</code> 
 +++++ 
 +Un exemple de réception d'OSC est fourni sous forme d'un script python utilisant la bibliothèque [[http://das.nasophon.de/pyliblo/ | pyliblo]] Un script d'installation de cette bibliothèque et de ses dépendances pour debian/ubuntu/raspbian est également disponible sur le [[https://github.com/reso-nance/INIT-ESP8266-OSC | repo de cet INIT]] 
 +++++ receptionOSC.py| 
 +<code python>#!/usr/bin/env python 
 +# -*- coding: utf-8 -*- 
 +import liblo, sys 
 + 
 +defaultPort=8000 
 +portNumber = defaultPort 
 +if len(sys.argv) != 2 : print("on utilise le port par défaut "+str(defaultPort)) 
 +else : 
 +    try : 
 +        portGiven = int(sys.argv[1]) 
 +        if portGiven >= 1025 and portGiven <= 65535 : portNumber = portGiven 
 +    except : 
 +        print("le premier argument doit être le numéro de port (1025~65535)"
 +        raise SystemExit 
 + 
 +try: 
 +    server = liblo.Server(portNumber) 
 +    print("écoute l'OSC entrant sur "+server.url) 
 +except liblo.ServerError as err: 
 +    print(str(err)) 
 +    raise SystemExit 
 + 
 +def printOSC(path, args, types, src): 
 +    print("reçu le message OSC '%s' de '%s'" % (path, src.url)) 
 +    for a, t in zip(args, types): 
 +        print ("  argument de type '%s': %s" % (t, a)) 
 +    print("\n"
 + 
 +server.add_method(None, None, printOSC) 
 +# loop and dispatch messages every 100ms 
 +while True: 
 +    try : server.recv(100) 
 +    except KeyboardInterrupt : 
 +       print("\n  bye !") 
 +       raise SystemExit 
 +</code> 
 +++++
 ==== ARDUINO==== ==== ARDUINO====
   * Gestion des preférences arduino pour l'[[materiel:esp8266:accueil|ESP8266]]   * Gestion des preférences arduino pour l'[[materiel:esp8266:accueil|ESP8266]]
/home/resonancg/www/wiki/data/pages/ateliers/esp-osc/accueil.txt · Dernière modification: 2020/02/07 09:59 de laurent