OSC between Arduino and Processing
Aus hyperdramatik
Inhaltsverzeichnis
Libraries
First install these libraries:
http://hyperdramatik.net/mediawiki/index.php?title=OSC_in_Arduino
http://hyperdramatik.net/mediawiki/index.php?title=OSC_in_Processing
Code Example
Here are two code sketches for Arduino and Processing that send OSC messages to eachother.
Processing Code
/////////////////////////////////////////////////////////////////////////////////// // Code for sending and receiving OSC messages to/from an ESP32 /////////////////////////////////////////////////////////////////////////////////// // Example for sending & receiving open sound control (OSC) messages on the ESP32. // Every time you click the mouse in the window you send a '0' or '1' to the ESP. // Every time an analog sensor goes bellow threshold, you receive it's value. /////////////////////////////////////////////////////////////////////////////////// // based on this example: oscP5sendreceive by andreas schlegel // oscP5 website at http://www.sojamo.de/oscP5 /////////////////////////////////////////////////////////////////////////////////// import oscP5.*; import netP5.*; OscP5 oscP5; NetAddress myRemoteLocation; void setup() { size(400, 400); frameRate(25); /* start oscP5, listening for incoming messages at port 12000 */ oscP5 = new OscP5(this, 9999); /* myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters, * an ip address and a port number. myRemoteLocation is used as parameter in * oscP5.send() when sending osc packets to another computer, device, * application. usage see below. for testing purposes the listening port * and the port of the remote location address are the same, hence you will * send messages back to this sketch. */ myRemoteLocation = new NetAddress("192.168.0.11", 8888); } float backgroundShade = 0; void draw() { background(backgroundShade); } int onOff = 0; void mousePressed() { OscMessage myMessage = new OscMessage("/led"); // create osc message if (onOff == 0) { onOff = 1; } else onOff = 0; myMessage.add(onOff); /* add an int to the osc message */ oscP5.send(myMessage, myRemoteLocation); /* send the message */ } /* incoming osc message are forwarded to the oscEvent method. */ void oscEvent(OscMessage theOscMessage) { /* print the address pattern and the typetag of the received OscMessage */ print("### received an osc message."); print(" addrpattern: "+theOscMessage.addrPattern()); print(" typetag: "+theOscMessage.typetag()); /* read the contents of the OSCmessage as float and print it */ float messageValue = theOscMessage.get(0).floatValue(); println(" message: "+messageValue); backgroundShade = map(messageValue, 0, 4000, 0, 255); }
Arduino Code
/////////////////////////////////////////////////////////////////////////////////// // Code for ESP32 DEV MODULE 38pin version /////////////////////////////////////////////////////////////////////////////////// // Example for sending & receiving open sound control (OSC) messages on the ESP32 // Send integers '0' or '1' to the address "/led" to turn on/off an LED on pin14. // Every time the analog sensor value on pin36 goes bellow the "threshold" value // a message is sent to the address "/sensor" with the current sensor value. /////////////////////////////////////////////////////////////////////////////////// // based on this example: ESP8266ReceiveMessage from the OSCuino library /////////////////////////////////////////////////////////////////////////////////// // when uploading code: sometimes necessairy // to presss&hold the "BOOT" button // when you see the following lines: // "Connecting........_____....._____....." ///////////////////////////////////////////////// #include <WiFi.h> #include <WiFiUdp.h> #include <OSCMessage.h> #include <OSCBundle.h> #include <OSCData.h> char ssid[] = "xxx"; // your network SSID (name) char pass[] = "xxx"; // your network password // A UDP instance to let us send and receive packets over UDP WiFiUDP Udp; const IPAddress outIp(192, 168, 0, 5); // remote IP (not needed for receive) const unsigned int outPort = 9999; // remote port (not needed for receive) const unsigned int localPort = 8888; // local port to listen for UDP packets (here's where we send the packets) OSCErrorCode error; #define LED_PIN 27 #define SENSOR_PIN 36 unsigned int ledState = LOW; int sensorValue = 0; int thresholdValue = 4000; void setup() { pinMode(LED_PIN, OUTPUT); pinMode(SENSOR_PIN, INPUT); digitalWrite(LED_PIN, ledState); // turn *on* led Serial.begin(115200); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); Serial.println("Starting UDP"); Udp.begin(localPort); Serial.print("Local port: "); #ifdef ESP32 Serial.println(localPort); #else Serial.println(Udp.localPort()); #endif } // function for turning on/off the LED // depending on if one recives 1/0: void led(OSCMessage &msg) { ledState = msg.getInt(0); digitalWrite(LED_PIN, ledState); Serial.print("/led: "); Serial.println(ledState); } void loop() { /////////////////////////////////////////////////////////// // Receiving OSC message and turning LED on/off: /////////////////////////////////////////////////////////// OSCMessage msg; // create an OSC message object called msg int size = Udp.parsePacket(); // parse incoming OSC packet // if message received, unpack and store in msg if (size > 0) { while (size--) { msg.fill(Udp.read()); } if (!msg.hasError()) { msg.dispatch("/led", led); } else { error = msg.getError(); Serial.print("error: "); Serial.println(error); } } /////////////////////////////////////////////////////////// // Reading sensor value and sending OSC message: /////////////////////////////////////////////////////////// sensorValue = analogRead(SENSOR_PIN); if (sensorValue < thresholdValue) { Serial.println(sensorValue); // publish sensor value over OSC: if (WiFi.status() == WL_CONNECTED) { OSCMessage msg("/sensor"); float toSend = sensorValue; msg.add(toSend); Udp.beginPacket(outIp, outPort); msg.send(Udp); Udp.endPacket(); msg.empty(); } } }