Ci-dessous, les différences entre deux révisions de la page.
| 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:35] laurent [OSC] |
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 |
| * Date : 29/01/2020 | * Date : 29/01/2020 | ||
| * Licence : libre ! | * Licence : libre ! | ||
| * Contexte : INIT' | * Contexte : INIT' | ||
| - | * Fichiers | + | * Support |
| - | * Lien : lien vers un site éventuellement | + | * Lien : [[https:// |
| ===== 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:// | 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:// | ||
| - | ++++ UDP.ino| | + | ++++ envoiUDP.ino| |
| <code cpp># | <code cpp># | ||
| #include < | #include < | ||
| 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># | <code python># | ||
| # -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
| Ligne 89: | Ligne 88: | ||
| Pour créer un message OSC, on utilisera la bibliothèque OSC, disponible dans le gestionnaire de bibliothèque d' | Pour créer un message OSC, on utilisera la bibliothèque OSC, disponible dans le gestionnaire de bibliothèque d' | ||
| - | Pour éviter de surcharger le réseau, nous n' | + | Pour éviter de surcharger le réseau, nous n' |
| + | ++++ envoiOSC.ino| | ||
| + | <code cpp># | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | static char* nomDuReseau = " | ||
| + | static char* motDePasse = " | ||
| + | static const int portOSC = 8000; // port auquel les paquets seront envoyés, doit être identique à celui du récepteur | ||
| + | static IPAddress IPcible = IPAddress({10, | ||
| + | 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); | ||
| + | while (true) { // tant que la connection n'est pas établie, on restera coincé ici | ||
| + | Serial.println(" | ||
| + | WiFi.mode(WIFI_STA); | ||
| + | WiFi.begin(nomDuReseau, | ||
| + | ESP.wdtFeed(); | ||
| + | yield(); // rends la main à l' | ||
| + | if ( WiFi.waitForConnectResult() == WL_CONNECTED ) {break;} // si la connection est établie, on sort de la boucle infinie | ||
| + | } | ||
| + | Serial.print(" | ||
| + | Serial.println(WiFi.localIP()); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | int valeurActuelle = analogRead(0); | ||
| + | if (valeurActuelle < valeurPrecedente-tolerance || valeurActuelle > valeurPrecedente+tolerance) { // si la valeur à changée significativement | ||
| + | envoieOSC(valeurActuelle); | ||
| + | valeurPrecedente = valeurActuelle; | ||
| + | } | ||
| + | yield(); // rends la main à l' | ||
| + | delay(2); // une courte sieste lui permettra de travailler plus longtemps | ||
| + | } | ||
| + | |||
| + | void envoieOSC(int valeur) { | ||
| + | Serial.print(" | ||
| + | static char* addresseOSC = "/ | ||
| + | OSCMessage* message = new OSCMessage(addresseOSC); | ||
| + | message-> | ||
| + | UDP.beginPacket(IPcible, | ||
| + | message-> | ||
| + | UDP.endPacket(); | ||
| + | delete(message); | ||
| + | ESP.wdtFeed(); | ||
| + | yield(); | ||
| + | } | ||
| + | </ | ||
| + | ++++ | ||
| + | Un exemple de réception d'OSC est fourni sous forme d'un script python utilisant la bibliothèque [[http:// | ||
| + | ++++ receptionOSC.py| | ||
| + | <code python># | ||
| + | # -*- coding: utf-8 -*- | ||
| + | import liblo, sys | ||
| + | |||
| + | defaultPort=8000 | ||
| + | portNumber = defaultPort | ||
| + | if len(sys.argv) != 2 : print(" | ||
| + | else : | ||
| + | try : | ||
| + | portGiven = int(sys.argv[1]) | ||
| + | if portGiven >= 1025 and portGiven <= 65535 : portNumber = portGiven | ||
| + | except : | ||
| + | print(" | ||
| + | raise SystemExit | ||
| + | |||
| + | try: | ||
| + | server = liblo.Server(portNumber) | ||
| + | print(" | ||
| + | except liblo.ServerError as err: | ||
| + | print(str(err)) | ||
| + | raise SystemExit | ||
| + | |||
| + | def printOSC(path, | ||
| + | print(" | ||
| + | for a, t in zip(args, types): | ||
| + | print (" | ||
| + | print(" | ||
| + | |||
| + | server.add_method(None, | ||
| + | # loop and dispatch messages every 100ms | ||
| + | while True: | ||
| + | try : server.recv(100) | ||
| + | except KeyboardInterrupt : | ||
| + | | ||
| + | raise SystemExit | ||
| + | </ | ||
| + | ++++ | ||
| ==== ARDUINO==== | ==== ARDUINO==== | ||
| * Gestion des preférences arduino pour l' | * Gestion des preférences arduino pour l' | ||