Protocolo OSC

Bom dia galera, alguém que sacas de protocolo OSC? estou usando o TouchOSC num ATmega 2560 com um ehternet shield para ativar 8 reles separadamente, ele já chegou a funcionar, mas com dois apenas, alterei o código para que pudesse usar para rele 8 canais, agora quando mando comando do TouchOSC eu vejo no Arduino que ele recebe, pelos leds RX TX, mas não aciona os reles nem manda resposta de volta pro OSC, meu android no caso, a única coisa que mudei foi o código mesmo, antes de parar de funcionar... alguém? Obrigado.

E o código?

Desculpe, estava no trabalho, não consegui mandar devido a outras tarefas, coloquei o código em anexo por ele ser muito grande para mandar escrito, só pra tirar duvida dei upload no código que já havia funcionado e nada, ta enviando o comando pelo OSC sendo recebido pelo Arduino, mas não interpreta e não desliga o rele. Obrigado.

Arduino_ethernetshield_modulorele_android.ino (10 KB)

À primeira vista, o seu programa não faz muito sentido. Dá a impressão que misturou 2 exemplos, mas sem saber muito bem o que estava a fazer.

void func1(OSCMessage *_mes){  //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
  int value=(int)_mes->getArgFloat(0);  //armazena em "value" o argumento do comando OSC "/ard/led2"
  digitalWrite(relePin,value);   //muda estado da porta digital 8 (ledPin2) conforme argumento OSC recebido
  
  //create new osc message
  OSCMessage txMes;    //cria uma nova menssagem OSC
  
  //set destination ip address & port no
  txMes.setAddress(_mes->getIpAddress(),destPort);  //define o endereço e porta do destino da mensagem OSC
  txMes.beginMessage("/ard/relePin");   //define comando OSC
  txMes.addArgFloat(flag);  //define no estado do led 2 que será enviado no argumento OSC para ANDROID
  
  if(flag==1){
    flag=0;
    digitalWrite(relePin, LOW);
  }
  else{
    flag=1;
    digitalWrite(relePin, HIGH);
  }
  
  txMes.addArgInt32(flag); 
  
  //send osc message
  client.send(&txMes);   //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID
  
}

Pegando neste callback, nas duas primeiras linhas, lê o valor do argumento e altera o estado do relé, conforme o argumento que vem na mensagem. Depois cria a mensagem que envia de volta para informar da operação. Até aqui, parece-me que tudo faz sentido. Depois disto faz qualquer coisa que não percebo:

 if(flag==1){
    flag=0;
    digitalWrite(relePin, LOW);
  }
  else{
    flag=1;
    digitalWrite(relePin, HIGH);
  }

Aparentemente, volta a alterar o estado do relé. Depois disto:

 txMes.addArgInt32(flag);

volta a alterar o parametro da mensagem, que ainda por cima, é diferente do que foi criado inicialmente:

 txMes.addArgFloat(flag);  //define no estado do led 2 que será enviado no argumento OSC para ANDROID

Após isto, envia a mensagem:

 client.send(&txMes);   //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID

Esta parte também me parece bem.

Sendo assim, eu tentaria, uma coisa assim:

void func1(OSCMessage *_mes){  //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
  int value=(int)_mes->getArgFloat(0);  //armazena em "value" o argumento do comando OSC "/ard/led2"
  digitalWrite(relePin,value);   //muda estado da porta digital 8 (ledPin2) conforme argumento OSC recebido
  
  //create new osc message
  OSCMessage txMes;    //cria uma nova menssagem OSC
  
  //set destination ip address & port no
  txMes.setAddress(_mes->getIpAddress(),destPort);  //define o endereço e porta do destino da mensagem OSC
  txMes.beginMessage("/ard/relePin");   //define comando OSC
  txMes.addArgFloat(value);  //define no estado do led 2 que será enviado no argumento OSC para ANDROID

  //send osc message
  client.send(&txMes);   //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID
}

Outra opção seria fazer:

void func1(OSCMessage *_mes){  //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
  int value=(int)_mes->getArgInt32(0);  //armazena em "value" o argumento do comando OSC "/ard/led2"
  if(value!=1) return;
  
  //create new osc message
  OSCMessage txMes;    //cria uma nova menssagem OSC
  
  //set destination ip address & port no
  txMes.setAddress(_mes->getIpAddress(),destPort);  //define o endereço e porta do destino da mensagem OSC
  txMes.beginMessage("/ard/relePin");   //define comando OSC
  
  if(flag==1){
    flag=0;
    digitalWrite(relePin, LOW);
  }
  else{
    flag=1;
    digitalWrite(relePin, HIGH);
  }
  
  txMes.getArgInt32(flag);
  
  //send osc message
  client.send(&txMes);   //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID
  
}

Isto é uma cópia mais fiel do exemplo "SImpleRecieveLEDToggle".