Salve a tutti. Con l’intenzione di comandare Arduino tramite TouchOSC del mio iPhone mi sono messo a scrivere un programma
(ispirato dallo sketch di Mauro Alfieri http://www.mauroalfieri.it/elettronica/arduino-osc-iphone-e-sei-led-lo-sketch.html) tramite il quale potevo accendere sei led con l’applicazione OSC di iPhone.
Ho adattato lo sketch prima citato alle funzioni della nuova libreria OSC (ArdOSC.h di Recotana) ma nonostante abbia ricontrollato più e più volte, non riesco ancora a trovare l’errore per cui io non riesca a comandare la Ethernet Board. Su Arduino noto che le luci Tx e Rx si accendono alla pressione dei tasti su iPhone ma i led rimangono spenti.
Il programma è:
#include <Ethernet.h>
#include <ArdOSC.h>
#include <SPI.h>
int ledA=2;
int ledB=3;
int ledC=4;
int ledD=5;
int ledE=6;
int ledF=7;
OSCMessage recMes; //ricezione dell'app OSC
OSCServer server; //istanza server per associare il dispositivo
byte serverMac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x44, 0x91 }; //MAC arduino
byte serverIp[] = { 192, 168, 1, 200 }; //IP arduino
int serverPort = 10000; //porta arduino
char *topAddress="/bott";
char *subAddress[6]={"/oledA" , "/oledB" , "/oledC" , "/oledD" , "/oledE" , "/oledF"};
void setup() {
Ethernet.begin(serverMac,serverIp);
server.begin(serverPort);
pinMode(ledA,OUTPUT);
pinMode(ledB,OUTPUT);
pinMode(ledC,OUTPUT);
pinMode(ledD,OUTPUT);
pinMode(ledE,OUTPUT);
pinMode(ledF,OUTPUT);
digitalWrite(ledA, LOW);
digitalWrite(ledB, LOW);
digitalWrite(ledC, LOW);
digitalWrite(ledD, LOW);
digitalWrite(ledE, LOW);
digitalWrite(ledF, LOW);
}
void loop() {
if ( server.aviableCheck() ) {
if ( strcmp( recMes.getOSCAddress() , "/bott") ) {
if (strcmp( recMes.getOSCAddress() ,"/bott/oledA" )== 0 ) {
digitalWrite(ledA,getIntValue(&recMes)); }
if (strcmp( recMes.getOSCAddress() , "/bott/oledB" )== 0 ) {
digitalWrite(ledB,getIntValue(&recMes)); }
if (strcmp( recMes.getOSCAddress() , "/bott/oledC" )== 0 ) {
digitalWrite(ledC,getIntValue(&recMes)); }
if (strcmp( recMes.getOSCAddress() , "/bott/oledD" )== 0 ) {
digitalWrite(ledD,getIntValue(&recMes)); }
if (strcmp( recMes.getOSCAddress() , "/bott/oledE" )== 0 ) {
digitalWrite(ledE,getIntValue(&recMes)); }
if (strcmp( recMes.getOSCAddress() , "/bott/oledF" )== 0 ) {
digitalWrite(ledF,getIntValue(&recMes)); }
}
}
}
// --------------------------UTILITY----------------------------
int getIntValue(OSCMessage *mes){
switch( mes->getArgTypeTag(0) ){
case 'i': { return mes->getArgInt32(0); }
break;
case 'f': { return int(mes->getArgFloat(0)); }
break;
}
}
Se gentilmente potete dirmi come risolvere questo problema ve ne sarei grato visto che sono due giorni che batto la testa sul muro senza trovare soluzioni. XD