Buonasera, sto lavorando da mesi ad un progetto e mi sono arenato sulla letture dell'osc...
Praticamente io leggo messaggi osc da un software esterno (gia perfettamente funzionante e testato) con arduino e in base a cosa leggo attuo dei comportamenti, ad esempio sto leggendo dei led e dei fader, i led sono riuscito a leggerli e riesco a capire se sono accesi o spenti (con questo codice).
#include <Ethernet.h>
#include <EthernetUdp.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 177);
unsigned int localPort = 8888;
EthernetUDP Udp;
const int ledPin7 = 14;
const int ledPin8 = 15;
void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip);
Udp.begin(localPort);
pinMode(ledPin7, OUTPUT);
pinMode(ledPin8, OUTPUT);
Serial.println("Arduino è pronto e in ascolto...");
}
void loop() {
int packetSize = Udp.parsePacket();
if (packetSize) {
byte incomingPacket[packetSize];
Udp.read(incomingPacket, packetSize);
int i = 0;
while (i < packetSize) {
if (incomingPacket[i] == '/') {
int start = i;
while (incomingPacket[i] != 0) i++;
String address = String((char *)&incomingPacket[start]);
Serial.print("Indirizzo OSC: ");
Serial.println(address);
i += 2;
if (address.endsWith("flash/7")) {
float value;
memcpy(&value, &incomingPacket[i], sizeof(float));
i += sizeof(float);
Serial.print("Valore per flash/7: ");
Serial.println(value);
digitalWrite(ledPin7, value > 0.01 ? HIGH : LOW);
} else if (address.endsWith("flash/8")) {
float value;
memcpy(&value, &incomingPacket[i], sizeof(float));
i += sizeof(float);
Serial.print("Valore per flash/8: ");
Serial.println(value);
digitalWrite(ledPin8, value > 0.01 ? HIGH : LOW);
}
} else {
i++;
}
}
}
}
ma per quanto riguarda la letture dei fader non riesco a trovare una soluzione, non riesco a leggere i valori che vanno da 0-255... purtroppo non posso usare la libreria BundleOSC perche non mi funziona con il software con cui sto lavorando, tramite wireshark e protokoll mi sono accertato che il software in questione mandasse effettivamente segnali osc. nonostante cio non riesco a leggere questi dannati fader...
questo e' il codice (in continuo cambiamento) per la lettura dei fader
#include <Ethernet.h>
#include <EthernetUdp.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 177);
unsigned int localPort = 8888;
EthernetUDP Udp;
void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip);
Udp.begin(localPort);
Serial.println("Arduino è pronto e in ascolto...");
}
void loop() {
int packetSize = Udp.parsePacket();
if (packetSize) {
byte incomingPacket[packetSize];
Udp.read(incomingPacket, packetSize);
// Print the entire packet in hex for debugging
Serial.print("Pacchetto ricevuto: ");
for (int i = 0; i < packetSize; i++) {
if (incomingPacket[i] < 16) Serial.print("0");
Serial.print(incomingPacket[i], HEX);
Serial.print(" ");
}
Serial.println();
int i = 0;
while (i < packetSize) {
if (incomingPacket[i] == '/') {
int start = i;
while (incomingPacket[i] != 0) i++;
String address = String((char *)&incomingPacket[start]);
Serial.print("Indirizzo OSC: ");
Serial.println(address);
i += 1;
if (address.endsWith("/hardware/fader/1")) {
// Skip the ",f"
i += 4;
// Read the next 4 bytes as a float
byte floatBytes[4];
for (int j = 0; j < 4; j++) {
floatBytes[j] = incomingPacket[i++];
}
// Convert the byte array to a float using union
union {
byte b[4];
float f;
} u;
for (int j = 0; j < 4; j++) {
u.b[j] = floatBytes[j];
}
Serial.print("Bytes: ");
for (int j = 0; j < 4; j++) {
Serial.print(floatBytes[j], HEX);
Serial.print(" ");
}
Serial.println();
float faderPosition = u.f;
Serial.print("Valore per fader/1: ");
Serial.println(faderPosition);
}
} else {
i++;
}
}
}
}
mi sto aiutando anche con chat GPT, neanche a dirlo non riesco ad andare avanti comunque, mi dice "Sembra che i valori letti dal pacchetto OSC non siano interpretati correttamente. L'errore potrebbe risiedere nel modo in cui i byte vengono letti e convertiti in un valore float. Proviamo a fare un'ulteriore analisi dei byte letti per verificare se ci sono differenze rispetto alle aspettative.
Ecco un approccio alternativo per interpretare i byte e convertirli in un valore float:" senza trovare mai una soluzione, per ora diciamo che la mia soluzione al problema e' di mappare ogni singolo parametro (letto da wireshark) e creare una sorta di mappatura, solo che la trovo una soluzione quantomeno rozza e poco efficiente, per non parlare che dovrei stare li a leggere chissà quanti dati per chissà quanti giorni....
Per Info sto usando un arduino mega con shield ethernet W5100 collegato al pc tramite hub di rete per comunicare con il software che faccio girare sul pc.
Grazie mille in anticipo!