init
This commit is contained in:
commit
9ab40052eb
4 changed files with 1231 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
.DS_Store
|
||||
*/.DS_Store
|
||||
466
ESPOscuinoBundle/ESPOscuinoBundle.ino
Normal file
466
ESPOscuinoBundle/ESPOscuinoBundle.ino
Normal file
|
|
@ -0,0 +1,466 @@
|
|||
|
||||
// UDP OSCuino over WIFI w/ ESP32 (or ESP8266? - NOT TESTED)
|
||||
// system, analog and digital pin control and monitoring for Arduino
|
||||
// Yotam Mann and Adrian Freed
|
||||
|
||||
//
|
||||
#ifdef ESP8266
|
||||
#include <ESP8266WiFi.h>
|
||||
#else
|
||||
#include <WiFi.h>
|
||||
#endif
|
||||
#include <WiFiUdp.h>
|
||||
|
||||
//
|
||||
#include <SPI.h>
|
||||
#include <OSCBoards.h>
|
||||
#define BOARD_HAS_ANALOG_PULLUP
|
||||
#define BOARD_HAS_CAPACITANCE_SENSING
|
||||
#include <OSCBundle.h>
|
||||
|
||||
char ssid[] = "TEEPOT"; // your network SSID (name)
|
||||
char pass[] = "3333388888"; // your network password
|
||||
|
||||
// A UDP instance to let us send and receive packets over UDP
|
||||
WiFiUDP Udp;
|
||||
const IPAddress outIp(192,168,43,13); // 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)
|
||||
|
||||
//outgoing messages
|
||||
OSCBundle bundleOUT;
|
||||
|
||||
//converts the pin to an osc address
|
||||
char * numToOSCAddress (int pin) {
|
||||
static char s[10];
|
||||
int i = 9;
|
||||
|
||||
s[i--]= '\0';
|
||||
|
||||
do
|
||||
{
|
||||
s[i] = "0123456789"[pin % 10];
|
||||
--i;
|
||||
pin /= 10;
|
||||
}
|
||||
while (pin && i);
|
||||
|
||||
s[i] = '/';
|
||||
|
||||
return &s[i];
|
||||
}
|
||||
|
||||
/**
|
||||
* ROUTES
|
||||
*
|
||||
* these are where the routing functions go
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* DIGITAL
|
||||
*
|
||||
* called when address matched "/d"
|
||||
* expected format:
|
||||
* /d/(pin)
|
||||
* /u = digitalRead with pullup
|
||||
* (no value) = digitalRead without pullup
|
||||
* (value) = digital write on that pin
|
||||
*
|
||||
*/
|
||||
|
||||
void routeDigital (OSCMessage &msg, int addrOffset) {
|
||||
//match input or output
|
||||
for(byte pin = 0; pin < NUM_DIGITAL_PINS; pin++){
|
||||
//match against the pin number strings
|
||||
int pinMatched = msg.match(numToOSCAddress(pin), addrOffset);
|
||||
if(pinMatched){
|
||||
//if it has an int, then it's a digital write
|
||||
if (msg.isInt(0)) {
|
||||
pinMode(pin, OUTPUT);
|
||||
digitalWrite(pin, (msg.getInt(0) > 0) ? HIGH : LOW);
|
||||
}
|
||||
//if it has an float, then it's an analog write
|
||||
else if (msg.isFloat(0)) {
|
||||
//TODO: only for ESP8266 - ESP32 doesn't support analogWrite in this way.
|
||||
#ifdef ESP8266
|
||||
analogWrite(pin, (int)(msg.getFloat(0)*255.0f));
|
||||
#endif
|
||||
}
|
||||
//otherwise it's an digital read
|
||||
//with a pullup?
|
||||
else if (msg.fullMatch("/u", pinMatched + addrOffset)) {
|
||||
//set the pullup
|
||||
pinMode(pin, INPUT_PULLUP);
|
||||
//setup the output address which should be /d/(pin)/u
|
||||
char outputAddress[9];
|
||||
strcpy(outputAddress, "/d");
|
||||
strcat(outputAddress, numToOSCAddress(pin));
|
||||
strcat(outputAddress, "/u");
|
||||
//do the digital read and send the results
|
||||
bundleOUT.add(outputAddress).add(digitalRead(pin));
|
||||
}
|
||||
//else without a pullup
|
||||
else {
|
||||
//set the pinmode
|
||||
pinMode(pin, INPUT);
|
||||
//setup the output address which should be /d/(pin)
|
||||
char outputAddress[6];
|
||||
strcpy(outputAddress, "/d");
|
||||
strcat(outputAddress, numToOSCAddress(pin));
|
||||
//do the digital read and send the results
|
||||
bundleOUT.add(outputAddress).add(digitalRead(pin));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ANALOG
|
||||
*
|
||||
* called when the address matches "/a"
|
||||
*
|
||||
* format:
|
||||
* /a/(pin)
|
||||
* /u = analogRead with pullup
|
||||
* (no value) = analogRead without pullup
|
||||
* (digital value) = digital write on that pin
|
||||
* (float value) = analogWrite on that pin
|
||||
*
|
||||
**/
|
||||
|
||||
void routeAnalog (OSCMessage &msg, int addrOffset) {
|
||||
//iterate through all the analog pins
|
||||
for (byte pin = 0; pin < NUM_ANALOG_INPUTS; pin++) {
|
||||
//match against the pin number strings
|
||||
int pinMatched = msg.match(numToOSCAddress(pin), addrOffset);
|
||||
if (pinMatched) {
|
||||
//if it has an int, then it's a digital write
|
||||
if (msg.isInt(0)) {
|
||||
pinMode(analogInputToDigitalPin(pin), OUTPUT);
|
||||
digitalWrite(analogInputToDigitalPin(pin), (msg.getInt(0) > 0)? HIGH: LOW);
|
||||
}
|
||||
//if it has an float, then it's an analog write
|
||||
else if(msg.isFloat(0)) {
|
||||
//TODO: only for ESP8266 - ESP32 doesn't support analogWrite in this way.
|
||||
#ifdef ESP8266
|
||||
analogWrite(pin, (int)(msg.getFloat(0)*255.0f));
|
||||
#endif
|
||||
}
|
||||
#ifdef BOARD_HAS_ANALOG_PULLUP
|
||||
//with a pullup?
|
||||
else if (msg.fullMatch("/u", pinMatched + addrOffset)){
|
||||
//set the pullup
|
||||
pinMode(analogInputToDigitalPin(pin), INPUT_PULLUP);
|
||||
|
||||
//setup the output address which should be /a/(pin)/u
|
||||
char outputAddress[9];
|
||||
strcpy(outputAddress, "/a");
|
||||
strcat(outputAddress, numToOSCAddress(pin));
|
||||
strcat(outputAddress,"/u");
|
||||
// strcat(outputAddress,"/u");
|
||||
//do the analog read and send the results
|
||||
bundleOUT.add(outputAddress).add((int32_t)analogRead(pin));
|
||||
}
|
||||
#endif
|
||||
//else without a pullup
|
||||
else {
|
||||
//set the pinmode
|
||||
pinMode(analogInputToDigitalPin(pin), INPUT);
|
||||
|
||||
//setup the output address which should be /a/(pin)
|
||||
char outputAddress[6];
|
||||
strcpy(outputAddress, "/a");
|
||||
strcat(outputAddress, numToOSCAddress(pin));
|
||||
//do the analog read and send the results
|
||||
bundleOUT.add(outputAddress).add((int32_t)analogRead(pin));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef BOARD_HAS_TONE
|
||||
|
||||
/**
|
||||
* TONE
|
||||
*
|
||||
* square wave output "/tone"
|
||||
*
|
||||
* format:
|
||||
* /tone/pin
|
||||
*
|
||||
* (digital value) (float value) = freqency in Hz
|
||||
* (no value) disable tone
|
||||
*
|
||||
**/
|
||||
|
||||
void routeTone (OSCMessage &msg, int addrOffset)
|
||||
{
|
||||
//iterate through all the analog pins
|
||||
for (byte pin = 0; pin < NUM_DIGITAL_PINS; pin++) {
|
||||
//match against the pin number strings
|
||||
int pinMatched = msg.match(numToOSCAddress(pin), addrOffset);
|
||||
if (pinMatched) {
|
||||
unsigned int frequency = 0;
|
||||
//if it has an int, then it's an integers frequency in Hz
|
||||
if (msg.isInt(0)) {
|
||||
frequency = msg.getInt(0);
|
||||
}
|
||||
//otherwise it's a floating point frequency in Hz
|
||||
else if(msg.isFloat(0)) {
|
||||
frequency = msg.getFloat(0);
|
||||
}
|
||||
else {
|
||||
noTone(pin);
|
||||
}
|
||||
if (frequency > 0) {
|
||||
if(msg.isInt(1)) {
|
||||
tone(pin, frequency, msg.getInt(1));
|
||||
}
|
||||
else {
|
||||
tone(pin, frequency);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef BOARD_HAS_CAPACITANCE_SENSING
|
||||
#define NTPINS 2
|
||||
const int cpins[NTPINS] = { 4, 15 };
|
||||
void routeTouch (OSCMessage &msg, int addrOffset)
|
||||
{
|
||||
for (int i = 0; i < NTPINS; ++i)
|
||||
{
|
||||
const char *name = numToOSCAddress(cpins[i]);
|
||||
int pinMatched = msg.match(name, addrOffset);
|
||||
if (pinMatched)
|
||||
{
|
||||
char outputAddress[9];
|
||||
strcpy(outputAddress, "/c");
|
||||
strcat(outputAddress, name);
|
||||
bundleOUT.add(outputAddress).add(touchRead(cpins[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef BOARD_HAS_DIE_POWER_SUPPLY_MEASUREMENT
|
||||
|
||||
#if defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MKL26Z64__)
|
||||
float getSupplyVoltage()
|
||||
{
|
||||
int val = analogRead(39);
|
||||
return val>0? (1.20f*1023/val):0.0f;
|
||||
}
|
||||
#else
|
||||
// power supply measurement on some Arduinos
|
||||
float getSupplyVoltage(){
|
||||
// powersupply
|
||||
int result;
|
||||
// Read 1.1V reference against AVcc
|
||||
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
|
||||
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
|
||||
ADMUX = _BV(MUX5) | _BV(MUX0);
|
||||
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
|
||||
ADMUX = _BV(MUX3) | _BV(MUX2);
|
||||
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega1280__)
|
||||
ADMUX = 0x40| _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) ;
|
||||
ADCSRB = 0;
|
||||
#else
|
||||
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
|
||||
#endif
|
||||
delayMicroseconds(300); // wait for Vref to settle
|
||||
ADCSRA |= _BV(ADSC); // Convert
|
||||
while (bit_is_set(ADCSRA,ADSC));
|
||||
result = ADCL;
|
||||
result |= ADCH<<8;
|
||||
|
||||
float supplyvoltage = 1.1264f *1023 / result;
|
||||
return supplyvoltage;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef BOARD_HAS_DIE_TEMPERATURE_SENSOR
|
||||
|
||||
#if defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MKL26Z64__)
|
||||
float getTemperature()
|
||||
{
|
||||
analogReference(INTERNAL);
|
||||
delay(1);
|
||||
int val = analogRead(38); // seems to be flakey
|
||||
analogReference(DEFAULT);
|
||||
|
||||
return val; //need to compute something here to get to degrees C
|
||||
}
|
||||
#else
|
||||
// temperature
|
||||
float getTemperature() {
|
||||
int result;
|
||||
#if defined(__AVR_ATmega32U4__)
|
||||
ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0);
|
||||
ADCSRB = _BV(MUX5);
|
||||
#else
|
||||
ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3);
|
||||
#endif
|
||||
delayMicroseconds(200); // wait for Vref to settle
|
||||
ADCSRA |= _BV(ADSC); // Convert
|
||||
while (bit_is_set(ADCSRA,ADSC));
|
||||
result = ADCL;
|
||||
result |= ADCH<<8;
|
||||
|
||||
analogReference(DEFAULT);
|
||||
|
||||
return result/1023.0f;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* SYSTEM MESSAGES
|
||||
*
|
||||
* expected format:
|
||||
* /s
|
||||
* /m = microseconds
|
||||
* /d = number of digital pins
|
||||
* /a = number of analog pins
|
||||
* /l integer = set the led
|
||||
* /t = temperature
|
||||
* /s = power supply voltage
|
||||
*/
|
||||
//
|
||||
void routeSystem (OSCMessage &msg, int addrOffset) {
|
||||
|
||||
#ifdef BOARD_HAS_DIE_TEMPERATURE_SENSOR
|
||||
if (msg.fullMatch("/t", addrOffset)){
|
||||
bundleOUT.add("/s/t").add(getTemperature());
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BOARD_HAS_DIE_POWER_SUPPLY_MEASUREMENT
|
||||
if (msg.fullMatch("/s", addrOffset)){
|
||||
bundleOUT.add("/s/s").add(getSupplyVoltage());
|
||||
}
|
||||
#endif
|
||||
|
||||
if (msg.fullMatch("/m", addrOffset)){
|
||||
bundleOUT.add("/s/m").add((int32_t)micros());
|
||||
}
|
||||
|
||||
if (msg.fullMatch("/d", addrOffset)){
|
||||
bundleOUT.add("/s/d").add(NUM_DIGITAL_PINS);
|
||||
}
|
||||
|
||||
if (msg.fullMatch("/a", addrOffset)){
|
||||
bundleOUT.add("/s/a").add(NUM_ANALOG_INPUTS);
|
||||
}
|
||||
|
||||
if (msg.fullMatch("/l", addrOffset)){
|
||||
if (msg.isInt(0)) {
|
||||
int i = msg.getInt(0);
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
digitalWrite(LED_BUILTIN, (i > 0) ? HIGH: LOW);
|
||||
bundleOUT.add("/s/l").add(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* MAIN METHODS
|
||||
*
|
||||
* setup and loop, bundle receiving/sending, initial routing
|
||||
*/
|
||||
void setup() {
|
||||
|
||||
//
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
|
||||
//
|
||||
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
|
||||
|
||||
#ifdef BOARD_HAS_ANALOG_PULLUP
|
||||
Serial.println("=== BOARD_HAS_ANALOG_PULLUP ===");
|
||||
#endif
|
||||
#ifdef BOARD_HAS_TONE
|
||||
Serial.println("=== BOARD_HAS_TONE ===");
|
||||
#endif
|
||||
#ifdef BOARD_HAS_CAPACITANCE_SENSING
|
||||
Serial.println("=== BOARD_HAS_CAPACITANCE_SENSING ===");
|
||||
#endif
|
||||
#ifdef BOARD_HAS_DIE_POWER_SUPPLY_MEASUREMENT
|
||||
Serial.println("=== BOARD_HAS_DIE_POWER_SUPPLY_MEASUREMENT ===");
|
||||
#endif
|
||||
#ifdef BOARD_HAS_DIE_TEMPERATURE_SENSOR
|
||||
Serial.println("=== BOARD_HAS_DIE_TEMPERATURE_SENSOR ===");
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
//reads and routes the incoming messages
|
||||
void loop(){
|
||||
OSCBundle bundleIN;
|
||||
int size;
|
||||
|
||||
if( (size = Udp.parsePacket()) > 0)
|
||||
{
|
||||
while(size--) {
|
||||
bundleIN.fill(Udp.read());
|
||||
}
|
||||
if(!bundleIN.hasError())
|
||||
{
|
||||
bundleIN.route("/s", routeSystem);
|
||||
bundleIN.route("/a", routeAnalog);
|
||||
bundleIN.route("/d", routeDigital);
|
||||
#ifdef BOARD_HAS_TONE
|
||||
bundleIN.route("/tone", routeTone);
|
||||
#endif
|
||||
|
||||
#ifdef BOARD_HAS_CAPACITANCE_SENSING
|
||||
bundleIN.route("/c", routeTouch);
|
||||
#endif
|
||||
}
|
||||
|
||||
// send the response bundle back to where the request came from
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort);
|
||||
bundleOUT.send(Udp);
|
||||
Udp.endPacket();
|
||||
|
||||
// empty the bundle ready to use for new messages
|
||||
bundleOUT.empty();
|
||||
}
|
||||
}
|
||||
479
ESPOscuinoMessage/ESPOscuinoMessage.ino
Normal file
479
ESPOscuinoMessage/ESPOscuinoMessage.ino
Normal file
|
|
@ -0,0 +1,479 @@
|
|||
|
||||
// UDP OSCuino over WIFI w/ ESP32 (or ESP8266? - NOT TESTED)
|
||||
// system, analog and digital pin control and monitoring for Arduino
|
||||
// Yotam Mann and Adrian Freed
|
||||
|
||||
//
|
||||
#ifdef ESP8266
|
||||
#include <ESP8266WiFi.h>
|
||||
#else
|
||||
#include <WiFi.h>
|
||||
#endif
|
||||
#include <WiFiUdp.h>
|
||||
|
||||
//
|
||||
#include <SPI.h>
|
||||
#include <OSCBoards.h>
|
||||
#define BOARD_HAS_ANALOG_PULLUP
|
||||
#define BOARD_HAS_CAPACITANCE_SENSING
|
||||
#include <OSCMessage.h>
|
||||
#include <OSCBundle.h>
|
||||
|
||||
char ssid[] = "TEEPOT"; // your network SSID (name)
|
||||
char pass[] = "3333388888"; // your network password
|
||||
|
||||
// A UDP instance to let us send and receive packets over UDP
|
||||
WiFiUDP Udp;
|
||||
const IPAddress outIp(192,168,43,13); // 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)
|
||||
|
||||
//converts the pin to an osc address
|
||||
char * numToOSCAddress (int pin) {
|
||||
static char s[10];
|
||||
int i = 9;
|
||||
|
||||
s[i--]= '\0';
|
||||
|
||||
do
|
||||
{
|
||||
s[i] = "0123456789"[pin % 10];
|
||||
--i;
|
||||
pin /= 10;
|
||||
}
|
||||
while (pin && i);
|
||||
|
||||
s[i] = '/';
|
||||
|
||||
return &s[i];
|
||||
}
|
||||
|
||||
/**
|
||||
* ROUTES
|
||||
*
|
||||
* these are where the routing functions go
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* DIGITAL
|
||||
*
|
||||
* called when address matched "/d"
|
||||
* expected format:
|
||||
* /d/(pin)
|
||||
* /u = digitalRead with pullup
|
||||
* (no value) = digitalRead without pullup
|
||||
* (value) = digital write on that pin
|
||||
*
|
||||
*/
|
||||
|
||||
void routeDigital (OSCMessage &msg, int addrOffset) {
|
||||
//match input or output
|
||||
for(byte pin = 0; pin < NUM_DIGITAL_PINS; pin++){
|
||||
//match against the pin number strings
|
||||
int pinMatched = msg.match(numToOSCAddress(pin), addrOffset);
|
||||
if(pinMatched){
|
||||
//if it has an int, then it's a digital write
|
||||
if (msg.isInt(0)) {
|
||||
pinMode(pin, OUTPUT);
|
||||
digitalWrite(pin, (msg.getInt(0) > 0) ? HIGH : LOW);
|
||||
}
|
||||
//if it has an float, then it's an analog write
|
||||
else if (msg.isFloat(0)) {
|
||||
//TODO: only for ESP8266 - ESP32 doesn't support analogWrite in this way.
|
||||
#ifdef ESP8266
|
||||
analogWrite(pin, (int)(msg.getFloat(0)*255.0f));
|
||||
#endif
|
||||
}
|
||||
//otherwise it's an digital read
|
||||
//with a pullup?
|
||||
else if (msg.fullMatch("/u", pinMatched + addrOffset)) {
|
||||
//set the pullup
|
||||
pinMode(pin, INPUT_PULLUP);
|
||||
//setup the output address which should be /d/(pin)/u
|
||||
char outputAddress[9];
|
||||
strcpy(outputAddress, "/d");
|
||||
strcat(outputAddress, numToOSCAddress(pin));
|
||||
strcat(outputAddress, "/u");
|
||||
//do the digital read and send the results
|
||||
{
|
||||
OSCMessage msgOut(outputAddress); msgOut.add(digitalRead(pin));
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort); msgOut.send(Udp); Udp.endPacket();
|
||||
}
|
||||
}
|
||||
//else without a pullup
|
||||
else {
|
||||
//set the pinmode
|
||||
pinMode(pin, INPUT);
|
||||
//setup the output address which should be /d/(pin)
|
||||
char outputAddress[6];
|
||||
strcpy(outputAddress, "/d");
|
||||
strcat(outputAddress, numToOSCAddress(pin));
|
||||
//do the digital read and send the results
|
||||
{
|
||||
OSCMessage msgOut(outputAddress); msgOut.add(digitalRead(pin));
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort); msgOut.send(Udp); Udp.endPacket();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ANALOG
|
||||
*
|
||||
* called when the address matches "/a"
|
||||
*
|
||||
* format:
|
||||
* /a/(pin)
|
||||
* /u = analogRead with pullup
|
||||
* (no value) = analogRead without pullup
|
||||
* (digital value) = digital write on that pin
|
||||
* (float value) = analogWrite on that pin
|
||||
*
|
||||
**/
|
||||
|
||||
void routeAnalog (OSCMessage &msg, int addrOffset) {
|
||||
//iterate through all the analog pins
|
||||
for (byte pin = 0; pin < NUM_ANALOG_INPUTS; pin++) {
|
||||
//match against the pin number strings
|
||||
int pinMatched = msg.match(numToOSCAddress(pin), addrOffset);
|
||||
if (pinMatched) {
|
||||
//if it has an int, then it's a digital write
|
||||
if (msg.isInt(0)) {
|
||||
pinMode(analogInputToDigitalPin(pin), OUTPUT);
|
||||
digitalWrite(analogInputToDigitalPin(pin), (msg.getInt(0) > 0)? HIGH: LOW);
|
||||
}
|
||||
//if it has an float, then it's an analog write
|
||||
else if(msg.isFloat(0)) {
|
||||
//TODO: only for ESP8266 - ESP32 doesn't support analogWrite in this way.
|
||||
#ifdef ESP8266
|
||||
analogWrite(pin, (int)(msg.getFloat(0)*255.0f));
|
||||
#endif
|
||||
}
|
||||
#ifdef BOARD_HAS_ANALOG_PULLUP
|
||||
//with a pullup?
|
||||
else if (msg.fullMatch("/u", pinMatched + addrOffset)){
|
||||
//set the pullup
|
||||
pinMode(analogInputToDigitalPin(pin), INPUT_PULLUP);
|
||||
|
||||
//setup the output address which should be /a/(pin)/u
|
||||
char outputAddress[9];
|
||||
strcpy(outputAddress, "/a");
|
||||
strcat(outputAddress, numToOSCAddress(pin));
|
||||
strcat(outputAddress,"/u");
|
||||
// strcat(outputAddress,"/u");
|
||||
//do the analog read and send the results
|
||||
{
|
||||
OSCMessage msgOut(outputAddress); msgOut.add((int32_t)analogRead(pin));
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort); msgOut.send(Udp); Udp.endPacket();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
//else without a pullup
|
||||
else {
|
||||
//set the pinmode
|
||||
pinMode(analogInputToDigitalPin(pin), INPUT);
|
||||
|
||||
//setup the output address which should be /a/(pin)
|
||||
char outputAddress[6];
|
||||
strcpy(outputAddress, "/a");
|
||||
strcat(outputAddress, numToOSCAddress(pin));
|
||||
//do the analog read and send the results
|
||||
{
|
||||
OSCMessage msgOut(outputAddress); msgOut.add((int32_t)analogRead(pin));
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort); msgOut.send(Udp); Udp.endPacket();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef BOARD_HAS_TONE
|
||||
|
||||
/**
|
||||
* TONE
|
||||
*
|
||||
* square wave output "/tone"
|
||||
*
|
||||
* format:
|
||||
* /tone/pin
|
||||
*
|
||||
* (digital value) (float value) = freqency in Hz
|
||||
* (no value) disable tone
|
||||
*
|
||||
**/
|
||||
|
||||
void routeTone (OSCMessage &msg, int addrOffset)
|
||||
{
|
||||
//iterate through all the analog pins
|
||||
for (byte pin = 0; pin < NUM_DIGITAL_PINS; pin++) {
|
||||
//match against the pin number strings
|
||||
int pinMatched = msg.match(numToOSCAddress(pin), addrOffset);
|
||||
if (pinMatched) {
|
||||
unsigned int frequency = 0;
|
||||
//if it has an int, then it's an integers frequency in Hz
|
||||
if (msg.isInt(0)) {
|
||||
frequency = msg.getInt(0);
|
||||
}
|
||||
//otherwise it's a floating point frequency in Hz
|
||||
else if(msg.isFloat(0)) {
|
||||
frequency = msg.getFloat(0);
|
||||
}
|
||||
else {
|
||||
noTone(pin);
|
||||
}
|
||||
if (frequency > 0) {
|
||||
if(msg.isInt(1)) {
|
||||
tone(pin, frequency, msg.getInt(1));
|
||||
}
|
||||
else {
|
||||
tone(pin, frequency);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef BOARD_HAS_CAPACITANCE_SENSING
|
||||
#define NTPINS 2
|
||||
const int cpins[NTPINS] = { 4, 15 };
|
||||
void routeTouch (OSCMessage &msg, int addrOffset)
|
||||
{
|
||||
for (int i = 0; i < NTPINS; ++i)
|
||||
{
|
||||
const char *name = numToOSCAddress(cpins[i]);
|
||||
int pinMatched = msg.match(name, addrOffset);
|
||||
if (pinMatched)
|
||||
{
|
||||
char outputAddress[9];
|
||||
strcpy(outputAddress, "/c");
|
||||
strcat(outputAddress, name);
|
||||
{
|
||||
OSCMessage msgOut(outputAddress); msgOut.add(touchRead(cpins[i]));
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort); msgOut.send(Udp); Udp.endPacket();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef BOARD_HAS_DIE_POWER_SUPPLY_MEASUREMENT
|
||||
|
||||
#if defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MKL26Z64__)
|
||||
float getSupplyVoltage()
|
||||
{
|
||||
int val = analogRead(39);
|
||||
return val>0? (1.20f*1023/val):0.0f;
|
||||
}
|
||||
#else
|
||||
// power supply measurement on some Arduinos
|
||||
float getSupplyVoltage(){
|
||||
// powersupply
|
||||
int result;
|
||||
// Read 1.1V reference against AVcc
|
||||
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
|
||||
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
|
||||
ADMUX = _BV(MUX5) | _BV(MUX0);
|
||||
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
|
||||
ADMUX = _BV(MUX3) | _BV(MUX2);
|
||||
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega1280__)
|
||||
ADMUX = 0x40| _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) ;
|
||||
ADCSRB = 0;
|
||||
#else
|
||||
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
|
||||
#endif
|
||||
delayMicroseconds(300); // wait for Vref to settle
|
||||
ADCSRA |= _BV(ADSC); // Convert
|
||||
while (bit_is_set(ADCSRA,ADSC));
|
||||
result = ADCL;
|
||||
result |= ADCH<<8;
|
||||
|
||||
float supplyvoltage = 1.1264f *1023 / result;
|
||||
return supplyvoltage;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef BOARD_HAS_DIE_TEMPERATURE_SENSOR
|
||||
|
||||
#if defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MKL26Z64__)
|
||||
float getTemperature()
|
||||
{
|
||||
analogReference(INTERNAL);
|
||||
delay(1);
|
||||
int val = analogRead(38); // seems to be flakey
|
||||
analogReference(DEFAULT);
|
||||
|
||||
return val; //need to compute something here to get to degrees C
|
||||
}
|
||||
#else
|
||||
// temperature
|
||||
float getTemperature() {
|
||||
int result;
|
||||
#if defined(__AVR_ATmega32U4__)
|
||||
ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0);
|
||||
ADCSRB = _BV(MUX5);
|
||||
#else
|
||||
ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3);
|
||||
#endif
|
||||
delayMicroseconds(200); // wait for Vref to settle
|
||||
ADCSRA |= _BV(ADSC); // Convert
|
||||
while (bit_is_set(ADCSRA,ADSC));
|
||||
result = ADCL;
|
||||
result |= ADCH<<8;
|
||||
|
||||
analogReference(DEFAULT);
|
||||
|
||||
return result/1023.0f;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* SYSTEM MESSAGES
|
||||
*
|
||||
* expected format:
|
||||
* /s
|
||||
* /m = microseconds
|
||||
* /d = number of digital pins
|
||||
* /a = number of analog pins
|
||||
* /l integer = set the led
|
||||
* /t = temperature
|
||||
* /s = power supply voltage
|
||||
*/
|
||||
//
|
||||
void routeSystem (OSCMessage &msg, int addrOffset) {
|
||||
|
||||
#ifdef BOARD_HAS_DIE_TEMPERATURE_SENSOR
|
||||
if (msg.fullMatch("/t", addrOffset)) {
|
||||
OSCMessage msgOut("/s/t"); msgOut.add(getTemperature());
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort); msgOut.send(Udp); Udp.endPacket();
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BOARD_HAS_DIE_POWER_SUPPLY_MEASUREMENT
|
||||
if (msg.fullMatch("/s", addrOffset)){
|
||||
OSCMessage msgOut("/s/s"); msgOut.add(getSupplyVoltage());
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort); msgOut.send(Udp); Udp.endPacket();
|
||||
}
|
||||
#endif
|
||||
|
||||
if (msg.fullMatch("/m", addrOffset)){
|
||||
OSCMessage msgOut("/s/m"); msgOut.add((int32_t)micros());
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort); msgOut.send(Udp); Udp.endPacket();
|
||||
}
|
||||
|
||||
if (msg.fullMatch("/d", addrOffset)){
|
||||
OSCMessage msgOut("/s/d"); msgOut.add(NUM_DIGITAL_PINS);
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort); msgOut.send(Udp); Udp.endPacket();
|
||||
}
|
||||
|
||||
if (msg.fullMatch("/a", addrOffset)){
|
||||
OSCMessage msgOut("/s/a"); msgOut.add(NUM_ANALOG_INPUTS);
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort); msgOut.send(Udp); Udp.endPacket();
|
||||
}
|
||||
|
||||
if (msg.fullMatch("/l", addrOffset)){
|
||||
if (msg.isInt(0)) {
|
||||
int i = msg.getInt(0);
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
digitalWrite(LED_BUILTIN, (i > 0) ? HIGH: LOW);
|
||||
{
|
||||
OSCMessage msgOut("/s/l"); msgOut.add(i);
|
||||
Udp.beginPacket(Udp.remoteIP(),outPort); msgOut.send(Udp); Udp.endPacket();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* MAIN METHODS
|
||||
*
|
||||
* setup and loop, bundle receiving/sending, initial routing
|
||||
*/
|
||||
void setup() {
|
||||
|
||||
//
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
|
||||
//
|
||||
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
|
||||
|
||||
#ifdef BOARD_HAS_ANALOG_PULLUP
|
||||
Serial.println("=== BOARD_HAS_ANALOG_PULLUP ===");
|
||||
#endif
|
||||
#ifdef BOARD_HAS_TONE
|
||||
Serial.println("=== BOARD_HAS_TONE ===");
|
||||
#endif
|
||||
#ifdef BOARD_HAS_CAPACITANCE_SENSING
|
||||
Serial.println("=== BOARD_HAS_CAPACITANCE_SENSING ===");
|
||||
#endif
|
||||
#ifdef BOARD_HAS_DIE_POWER_SUPPLY_MEASUREMENT
|
||||
Serial.println("=== BOARD_HAS_DIE_POWER_SUPPLY_MEASUREMENT ===");
|
||||
#endif
|
||||
#ifdef BOARD_HAS_DIE_TEMPERATURE_SENSOR
|
||||
Serial.println("=== BOARD_HAS_DIE_TEMPERATURE_SENSOR ===");
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
//reads and routes the incoming messages
|
||||
void loop(){
|
||||
OSCMessage msg;
|
||||
int size;
|
||||
|
||||
if( (size = Udp.parsePacket()) > 0)
|
||||
{
|
||||
while(size--) {
|
||||
msg.fill(Udp.read());
|
||||
}
|
||||
if(!msg.hasError())
|
||||
{
|
||||
msg.route("/s", routeSystem);
|
||||
msg.route("/a", routeAnalog);
|
||||
msg.route("/d", routeDigital);
|
||||
#ifdef BOARD_HAS_TONE
|
||||
msg.route("/tone", routeTone);
|
||||
#endif
|
||||
|
||||
#ifdef BOARD_HAS_CAPACITANCE_SENSING
|
||||
msg.route("/c", routeTouch);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
284
pd/piano_access_radio_comm_wifi.pd
Normal file
284
pd/piano_access_radio_comm_wifi.pd
Normal file
|
|
@ -0,0 +1,284 @@
|
|||
#N canvas 656 158 711 192 10;
|
||||
#X obj 117 100 packOSC;
|
||||
#X obj 117 75 r OSC;
|
||||
#X obj 420 102 unpackOSC;
|
||||
#X obj 420 123 routeOSC /hello;
|
||||
#X obj 420 144 s HELLO;
|
||||
#X obj 34 140 print OSC;
|
||||
#X obj 34 113 spigot;
|
||||
#X obj 67 87 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000
|
||||
0 1;
|
||||
#X obj 337 117 spigot;
|
||||
#X obj 386 102 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 337 144 print HELLO;
|
||||
#X obj 117 142 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 420 81 udpreceive 9999;
|
||||
#X obj 117 121 udpsend;
|
||||
#X obj 545 19 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 545 60 s OSC;
|
||||
#X text 103 24 * a wireless "field synth" - based on 'udp' protocol
|
||||
over wifi, f 63;
|
||||
#N canvas 564 340 874 489 oscuino 0;
|
||||
#X obj 163 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 183 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 204 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 225 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 246 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 267 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 288 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 308 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 329 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 350 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 371 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 392 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 413 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 434 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 454 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 475 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 496 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 517 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 538 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 559 258 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 708 321 vsl 15 128 0 100 0 0 empty empty empty 0 -9 0 10 #fcfcfc
|
||||
#000000 #000000 0 1;
|
||||
#X obj 766 321 vsl 15 128 0 100 0 0 empty empty empty 0 -9 0 10 #fcfcfc
|
||||
#000000 #000000 0 1;
|
||||
#X text 689 122 System message responses;
|
||||
#X text 350 289 Analog Values;
|
||||
#X text 21 288 Analog Values with Pullups Enabled;
|
||||
#N canvas 0 50 450 278 (subpatch) 0;
|
||||
#X array AnalogArray 16 float 2;
|
||||
#X coords 0 1023 16 0 200 140 1 0 0;
|
||||
#X restore 18 20 graph;
|
||||
#X obj 327 78 mrpeach/routeOSC /a /d /s /c;
|
||||
#X obj 163 216 mrpeach/routeOSC /1 /2 /3 /4 /5 /6 /7 /8 /9 /10 /11
|
||||
/12 /13 /14 /15 /16 /17 /18 /19 /20, f 70;
|
||||
#X obj 694 140 cyclone/prepend set;
|
||||
#X obj 742 13 cyclone/prepend set;
|
||||
#N canvas 0 94 450 300 fillArray 0;
|
||||
#X obj 60 223 send AnalogArray;
|
||||
#X obj 60 194 cyclone/funnel 16;
|
||||
#X obj 60 120 inlet;
|
||||
#X obj 60 142 routeOSC /1 /2 /3 /4 /5 /6 /7 /8 /9 /10 /11 /12 /13 /14
|
||||
/15 /16, f 54;
|
||||
#X connect 1 0 0 0;
|
||||
#X connect 2 0 3 0;
|
||||
#X connect 3 0 1 0;
|
||||
#X connect 3 1 1 1;
|
||||
#X connect 3 2 1 2;
|
||||
#X connect 3 3 1 3;
|
||||
#X connect 3 4 1 4;
|
||||
#X connect 3 5 1 5;
|
||||
#X connect 3 6 1 6;
|
||||
#X connect 3 7 1 7;
|
||||
#X connect 3 8 1 8;
|
||||
#X connect 3 9 1 9;
|
||||
#X connect 3 10 1 10;
|
||||
#X connect 3 11 1 11;
|
||||
#X connect 3 12 1 12;
|
||||
#X connect 3 13 1 13;
|
||||
#X connect 3 14 1 14;
|
||||
#X connect 3 15 1 15;
|
||||
#X restore 342 422 pd fillArray;
|
||||
#X msg 742 33;
|
||||
#X text 205 198 Digital pins state;
|
||||
#X obj 327 23 inlet;
|
||||
#X msg 694 163 /m 8.45495e+08;
|
||||
#X text 707 242 Touch Pins on ESP32;
|
||||
#X obj 21 306 routeOSC /0/u /1/u /2/u /3/u /4/u /5/u /6/u /7/u /8/u
|
||||
/9/u /10/u /11/u /12/u /13/u /14/u /15/u, f 54;
|
||||
#X obj 353 306 routeOSC /1 /2 /3 /4 /5 /6 /7 /8 /9 /10 /11 /12 /13
|
||||
/14 /15 /16, f 54;
|
||||
#X floatatom 21 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 41 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 61 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 81 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 101 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 121 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 141 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 161 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 181 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 201 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 221 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 241 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 261 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 281 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 301 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 321 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 353 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 373 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 393 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 413 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 433 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 453 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 473 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 493 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 513 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 533 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 553 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 573 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 593 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 613 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 633 344 5 0 0 0 - - - 0;
|
||||
#X floatatom 653 370 5 0 0 0 - - - 0;
|
||||
#X floatatom 708 293 5 0 0 0 - - - 0;
|
||||
#X obj 708 266 routeOSC /4 /15, f 20;
|
||||
#X floatatom 766 293 5 0 0 0 - - - 0;
|
||||
#X connect 26 0 36 0;
|
||||
#X connect 26 1 27 0;
|
||||
#X connect 26 2 28 0;
|
||||
#X connect 26 3 71 0;
|
||||
#X connect 26 4 29 0;
|
||||
#X connect 27 0 0 0;
|
||||
#X connect 27 1 1 0;
|
||||
#X connect 27 2 2 0;
|
||||
#X connect 27 3 3 0;
|
||||
#X connect 27 4 4 0;
|
||||
#X connect 27 5 5 0;
|
||||
#X connect 27 6 6 0;
|
||||
#X connect 27 7 7 0;
|
||||
#X connect 27 8 8 0;
|
||||
#X connect 27 9 9 0;
|
||||
#X connect 27 10 10 0;
|
||||
#X connect 27 11 11 0;
|
||||
#X connect 27 12 12 0;
|
||||
#X connect 27 13 13 0;
|
||||
#X connect 27 14 14 0;
|
||||
#X connect 27 15 15 0;
|
||||
#X connect 27 16 16 0;
|
||||
#X connect 27 17 17 0;
|
||||
#X connect 27 18 18 0;
|
||||
#X connect 27 19 19 0;
|
||||
#X connect 28 0 34 0;
|
||||
#X connect 29 0 31 0;
|
||||
#X connect 33 0 26 0;
|
||||
#X connect 36 0 38 0;
|
||||
#X connect 36 1 39 0;
|
||||
#X connect 36 2 40 0;
|
||||
#X connect 36 3 41 0;
|
||||
#X connect 36 4 42 0;
|
||||
#X connect 36 5 43 0;
|
||||
#X connect 36 6 44 0;
|
||||
#X connect 36 7 45 0;
|
||||
#X connect 36 8 46 0;
|
||||
#X connect 36 9 47 0;
|
||||
#X connect 36 10 48 0;
|
||||
#X connect 36 11 49 0;
|
||||
#X connect 36 12 50 0;
|
||||
#X connect 36 13 51 0;
|
||||
#X connect 36 14 52 0;
|
||||
#X connect 36 15 53 0;
|
||||
#X connect 36 16 30 0;
|
||||
#X connect 36 16 37 0;
|
||||
#X connect 37 0 54 0;
|
||||
#X connect 37 1 55 0;
|
||||
#X connect 37 2 56 0;
|
||||
#X connect 37 3 57 0;
|
||||
#X connect 37 4 58 0;
|
||||
#X connect 37 5 59 0;
|
||||
#X connect 37 6 60 0;
|
||||
#X connect 37 7 61 0;
|
||||
#X connect 37 8 62 0;
|
||||
#X connect 37 9 63 0;
|
||||
#X connect 37 10 64 0;
|
||||
#X connect 37 11 65 0;
|
||||
#X connect 37 12 66 0;
|
||||
#X connect 37 13 67 0;
|
||||
#X connect 37 14 68 0;
|
||||
#X connect 37 15 69 0;
|
||||
#X connect 70 0 20 0;
|
||||
#X connect 71 0 70 0;
|
||||
#X connect 71 1 72 0;
|
||||
#X connect 72 0 21 0;
|
||||
#X restore 505 154 pd oscuino;
|
||||
#N canvas 625 25 810 190 oscuino 0;
|
||||
#X msg 512 30 /s/a;
|
||||
#X msg 469 30 /s/d;
|
||||
#X msg 575 30 /s/m;
|
||||
#X msg 359 65 /d/[1-3];
|
||||
#X obj 146 36 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X msg 679 115 /c/*;
|
||||
#X msg 283 64 /a/*/u;
|
||||
#X text 290 48 Pull up;
|
||||
#X text 467 10 How many pins?;
|
||||
#X text 575 9 How many milliseconds ?;
|
||||
#X text 65 32 LED;
|
||||
#X obj 146 61 metro 60;
|
||||
#X obj 679 74 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 679 94 metro 60;
|
||||
#X text 165 34 Retrieve analog value each 60ms, f 15;
|
||||
#X text 356 22 get digital pins 1 to 3 status, f 11;
|
||||
#X obj 381 146 outlet;
|
||||
#X msg 62 84 /s/l \$1;
|
||||
#X obj 62 58 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000
|
||||
0 1;
|
||||
#X text 634 60 get ESP32 Touch each 60ms;
|
||||
#X msg 146 84 /a/*;
|
||||
#X connect 0 0 16 0;
|
||||
#X connect 1 0 16 0;
|
||||
#X connect 2 0 16 0;
|
||||
#X connect 3 0 16 0;
|
||||
#X connect 4 0 11 0;
|
||||
#X connect 5 0 16 0;
|
||||
#X connect 6 0 16 0;
|
||||
#X connect 11 0 20 0;
|
||||
#X connect 12 0 13 0;
|
||||
#X connect 13 0 5 0;
|
||||
#X connect 17 0 16 0;
|
||||
#X connect 18 0 17 0;
|
||||
#X connect 20 0 16 0;
|
||||
#X restore 21 28 pd oscuino;
|
||||
#X msg 216 114 disconnect;
|
||||
#X msg 167 75 connect 192.168.43.85 8888;
|
||||
#X msg 545 39 /s/l \$1;
|
||||
#X obj 637 83 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000
|
||||
#000000 0 1;
|
||||
#X obj 637 103 metro 60;
|
||||
#X obj 637 145 s OSC;
|
||||
#X msg 637 124 /c/*;
|
||||
#X connect 0 0 13 0;
|
||||
#X connect 1 0 0 0;
|
||||
#X connect 1 0 6 0;
|
||||
#X connect 2 0 3 0;
|
||||
#X connect 2 0 17 0;
|
||||
#X connect 3 0 4 0;
|
||||
#X connect 3 0 8 0;
|
||||
#X connect 6 0 5 0;
|
||||
#X connect 7 0 6 1;
|
||||
#X connect 8 0 10 0;
|
||||
#X connect 9 0 8 1;
|
||||
#X connect 12 0 2 0;
|
||||
#X connect 13 0 11 0;
|
||||
#X connect 14 0 21 0;
|
||||
#X connect 18 0 0 0;
|
||||
#X connect 19 0 13 0;
|
||||
#X connect 20 0 13 0;
|
||||
#X connect 21 0 15 0;
|
||||
#X connect 22 0 23 0;
|
||||
#X connect 23 0 25 0;
|
||||
#X connect 25 0 24 0;
|
||||
Loading…
Reference in a new issue