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
ateliers:esp-osc:accueil [2020/01/30 10:18]
laurent [UDP & BROADCAST]
ateliers:esp-osc:accueil [2020/02/07 09:59] (Version actuelle)
laurent [ESP-OSC]
Ligne 1: Ligne 1:
 ====== ESP-OSC ====== ====== ESP-OSC ======
-  * Porteur du projet : reso-nance+  * Porteur du projet : reso-nance Laurent
   * Date : 29/01/2020   * Date : 29/01/2020
   * Licence : libre !   * Licence : libre !
   * Contexte : INIT'   * Contexte : INIT'
-  * Fichiers lien +  * Support [[http://reso-nance.org/revealJS/INIT_ESP_OSC.html#/ | présentation]] 
-  * Lien : lien vers un site éventuellement +  * Lien : [[https://github.com/reso-nance/INITs/tree/master/ESP8266-OSC | repo github]]
 ===== Description ===== ===== Description =====
 Réalisation d'un contrôleur analogique basé sur un ESP8266 communicant en OSC via wifi avec un ordinateur Réalisation d'un contrôleur analogique basé sur un ESP8266 communicant en OSC via wifi avec un ordinateur
Ligne 20: Ligne 19:
  
 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 56:
  
 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 88: Ligne 87:
 Les **arguments** peuvent être aussi nombreux que nécessaire et contenir des entiers, des chaînes de caractères, des nombres à virgule flottantes ou tout autre type de données (appelées //blob//). Cette souplesse d'utilisation est la raison du succès de l'OSC qui s'adaptera aisément à tout type d'utilisation. Les **arguments** peuvent être aussi nombreux que nécessaire et contenir des entiers, des chaînes de caractères, des nombres à virgule flottantes ou tout autre type de données (appelées //blob//). Cette souplesse d'utilisation est la raison du succès de l'OSC qui s'adaptera aisément à tout type d'utilisation.
  
-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]] +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 ///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/attic/ateliers/esp-osc/accueil.1580375886.txt.gz · Dernière modification: 2020/01/30 10:18 de laurent