Arduino - Processing - TouchOSC - LampadineRGB IR

Ciao ragazzi, è da un paio di giorni che sto smanettando con un led ir e un TSOP34836 (http://www.vishay.com/docs/81732/tsop348.pdf) è bastato includere IRremote.h e tutto ha funzionato immediatamente Oggi sono andato da Leroy Merlin e ho visto che vendevano delle lampadine con telecomando ir, non ci ho pensato due volte e ne ho presa una, è LED, si chiama lexman, 1-5W, attacco E27, ma ce ne sono di tutti i tipi..comunque, il telecomando viene riconosciuto come NEC quindi basterà digitare l'istruzione: irsend.sendNEC(0xFFF807, 32); e si vedrà la lampadina accendersi!! questa cosa a mio avviso è stupefacente!!

Ho scritto due sketch per attivare le varie funzioni della lampadina con TouchOSC via Wifi utilizzando un led IR sul pin 3 di Arduino. questi sono i codici:

#define SAVE     0xFF6897
#define NEXT     0xFFE817
#define AUTO     0xFFA857
#define ON       0xFFF807
#define OFF      0xFF7887
#define bianco   0xFF28D7
#define rosso    0xFF18E7
#define verde    0xFF9867
#define blu      0xFF58A7
#define arancio1 0xFF10EF
#define arancio2 0xFF20DF
#define giallo1  0xFF08F7
#define giallo2  0xFF30CF
#define celeste1 0xFF906F 
#define celeste2 0xFFA05F
#define azzurro1 0xFFB04F
#define azzurro2 0xFF8877
#define viola1   0xFF50AF
#define viola2   0xFF609F
#define fucsia1  0xFF708F
#define fucsia2  0xFF48B7
#define lum1     0xFFC837
#define lum2     0xFFF00F
#define lum3     0xFFD02F
#define lum4     0xFFE01F
#define lum5     0xFFD827

Processing

// 
import oscP5.*; 
import netP5.*;      
import processing.serial.*;
Serial USBSerialPort;
OscP5 oscP5;

void setup() {
//  size(100,100);
    oscP5 = new OscP5(this,8000);
    USBSerialPort = new Serial(this, Serial.list()[0], 9600);
}

void oscEvent(OscMessage theOscMessage) {   
    String addr = theOscMessage.addrPattern();
       if(addr.indexOf("/ON") == 0){     
       USBSerialPort.write("+");
        }
       if(addr.indexOf("/OFF") == 0){   
       USBSerialPort.write("0");
        }
       if(addr.indexOf("/rosso") == 0){  
       USBSerialPort.write("R");
       USBSerialPort.write("+");
        }   
       if(addr.indexOf("/blu") == 0){   
       USBSerialPort.write("B");
       USBSerialPort.write("+");
        }
       if(addr.indexOf("/verde") == 0){    
       USBSerialPort.write("G");
       USBSerialPort.write("+");
        }
       if(addr.indexOf("/viola1") == 0){   
       USBSerialPort.write("v");
       USBSerialPort.write("+"); 
        }
       if(addr.indexOf("/viola2") == 0){   
       USBSerialPort.write("V");
       USBSerialPort.write("+");       
        }
        if(addr.indexOf("/fucsia1") == 0){   
       USBSerialPort.write("f");
       USBSerialPort.write("+"); 
        }
       if(addr.indexOf("/fucsia2") == 0){   
       USBSerialPort.write("F");
       USBSerialPort.write("+");       
        }
       if(addr.indexOf("/giallo1") == 0){    
       USBSerialPort.write("y");  
       USBSerialPort.write("+");
        }
       if(addr.indexOf("/giallo2") == 0){    
       USBSerialPort.write("Y");  
       USBSerialPort.write("+");      
        }
       if(addr.indexOf("/arancio1") == 0){    
       USBSerialPort.write("o");  
       USBSerialPort.write("+");
        }
      if(addr.indexOf("/arancio2") == 0){    
      USBSerialPort.write("O");
      USBSerialPort.write("+");       
        }
      if(addr.indexOf("/celeste1") == 0){     
      USBSerialPort.write("c"); 
      USBSerialPort.write("+"); 
        }
         if(addr.indexOf("/celeste2") == 0){     
      USBSerialPort.write("C"); 
      USBSerialPort.write("+"); 
        }
        if(addr.indexOf("/azzurro1") == 0){       
      USBSerialPort.write("m");       
      USBSerialPort.write("+"); 
        }
      if(addr.indexOf("/azzurro2") == 0){       
      USBSerialPort.write("M");       
      USBSerialPort.write("+"); 
        }
      if(addr.indexOf("/AUTO") == 0){       
      USBSerialPort.write("A");    
    }
    if(addr.indexOf("/lum1") == 0){       
      USBSerialPort.write("1");    
    }
    if(addr.indexOf("/lum2") == 0){       
      USBSerialPort.write("2");    
    }
       if(addr.indexOf("/lum3") == 0){       
      USBSerialPort.write("3");    
    }
    if(addr.indexOf("/lum4") == 0){       
      USBSerialPort.write("4");    
    }
       if(addr.indexOf("/lum5") == 0){       
      USBSerialPort.write("5");    
    }
    if(addr.indexOf("/bianco") == 0){       
      USBSerialPort.write("W");    
    }
       if(addr.indexOf("/SAVE") == 0){       
      USBSerialPort.write("S");    
    }
    if(addr.indexOf("/NEXT") == 0){       
      USBSerialPort.write("N");    
    }
 }
 
void draw() { }

Arduino.

 #include <IRremote.h>

#define SAVE     0xFF6897 // S
#define NEXT     0xFFE817 // N
#define AUTO     0xFFA857 // A
#define ON       0xFFF807 // +
#define OFF      0xFF7887 // -
#define bianco   0xFF28D7 // W
#define rosso    0xFF18E7 // R
#define verde    0xFF9867 // G
#define blu      0xFF58A7 // B
#define arancio1 0xFF10EF // o
#define arancio2 0xFF20DF // O
#define giallo1  0xFF08F7 // y
#define giallo2  0xFF30CF // Y
#define celeste1 0xFF906F // c
#define celeste2 0xFFA05F // C
#define azzurro1 0xFFB04F // m
#define azzurro2 0xFF8877 // M
#define viola1   0xFF50AF // v
#define viola2   0xFF609F // V
#define fucsia1  0xFF708F // f
#define fucsia2  0xFF48B7 // F
#define lum1     0xFFC837 // 1
#define lum2     0xFFF00F // 2
#define lum3     0xFFD02F // 3
#define lum4     0xFFE01F // 4
#define lum5     0xFFD827 // 5
// IR LED = 3;
int message = 0;
IRsend irsend;

void setup(){Serial.begin(9600);}

void loop() {
  if (Serial.available() > 0) {
    message = Serial.read();
      switch (message) {
        case '+':
         irsend.sendNEC(ON, 32);
        break;
        case '-':
         irsend.sendNEC(OFF, 32); 
        break;
        case 'S':
         irsend.sendNEC(SAVE, 32); 
        break; 
        case 'A':
         irsend.sendNEC(AUTO, 32); 
        break;
        case 'N':
         irsend.sendNEC(NEXT, 32);
        break;
        case 'f':
         irsend.sendNEC(fucsia1, 32); 
        break;
        case 'F':
         irsend.sendNEC(fucsia2, 32); 
        break;
        case 'v':
         irsend.sendNEC(viola1, 32); 
        break;
        case 'V':
         irsend.sendNEC(viola2, 32); 
        break;
        case 'm':
         irsend.sendNEC(azzurro1, 32); 
        break;
        case 'M':
         irsend.sendNEC(azzurro2, 32); 
        break;
        case 'R':
         irsend.sendNEC(rosso, 32);  
        break;
        case 'G':
         irsend.sendNEC(verde, 32);  
        break;
        case 'y':
         irsend.sendNEC(giallo1, 32); 
        break;
        case 'Y':
         irsend.sendNEC(giallo2, 32); 
        break;
        case 'o':
         irsend.sendNEC(arancio1, 32); 
        break;
        case 'O':
         irsend.sendNEC(arancio2, 32);
        break;     
        case 'B':
         irsend.sendNEC(blu, 32); 
        break;
        case '1':
         irsend.sendNEC(lum1, 32); 
        break;
        case '2':
         irsend.sendNEC(lum2, 32); 
        break;
        case '3':
         irsend.sendNEC(lum3, 32); 
        break;
        case '4':
         irsend.sendNEC(lum4, 32); 
        break;
        case '5':
         irsend.sendNEC(lum5, 32); 
        break;  
        case 'W':
         irsend.sendNEC(bianco, 32); 
        break;
   }
    Serial.flush();
 }
}

In allegato il layout di TouchOSC.

ArduinoLamp.touchosc (1003 Bytes)

CIao Francesco.

Io sono molto novello in questo campo, ma vedendo la tua realizzazione mi ha preso la voglia di capire meglio come usare TouchOSC, visto che ce l’ho.
tralasciando la possibilità “avanzata” di miscelare una serie di colori e telecomandi, io vorrei fare qualcosa di più semplice. Ossia, prendere 1 led e accenderlo e spegnerlo gradatamente ( mi và bene anche On e off) tramite Touchosc.

Tuttavia Non mi sono chiare parecchie cose. Ho trovato un tutorial che ricorre all’uso di Firmata ( che non ho capito a cosa serva) , e quando inserisco il codice rimanente il compilatore da errore. Il tuo sistema sembra nettamente più semplice, ma non ho capito bene come funziona. dimmi se sbaglio: fai leggere il valore ricevuto dalla seriale e lo switcha a seconda del valore al colore equivalente da generare?

QUello che non capisco è come faccio a far dialogare ( e capire se dialogano) , arduino , touchosc e il router. sai dirmi come posso riscolvere questo problema?

grazie

Max996duino

Allora, a parte che anche io ho avuto sto avendo problemi

Quello che vuoi fare tu:

// Processing

import oscP5.; import netP5.; import processing.serial.*; Serial USBSerialPort; OscP5 oscP5;

void setup() { // size(100,100); oscP5 = new OscP5(this,8000); USBSerialPort = new Serial(this, Serial.list()[0], 9600); }

void oscEvent(OscMessage theOscMessage) { String addr = theOscMessage.addrPattern(); if(addr.indexOf("/OFF") != 0){ USBSerialPort.write("+"); } else USBSerialPort.write("-"); }

void draw() { }


// Arduino

int message = 0;

void setup() { Serial.begin(9600); pinMode(13, OUTPUT); }

void loop() { if (Serial.available() > 0) { message = Serial.read(); switch (message) { case '+': digitalWrite(13, HIGH); break; case '-': digitalWrite(13, LOW); // break; } } }

Leggendo in rete ho trovato anche io tutorial che usano Firmata, se li trovi belli e pronti, dovresti riuscire, fai caso che su Arduino devi solo uploadare Firmata (non includere la libreria proprio tutto il codice), il resto lo fa tutto Processing (con le librerie arduino.cc e processing.serial incluse). Non sono riuscito invece, come credo sia capitato a te, semplicemente includendo tale libreria in un mio sketch già esistente. Io comunque dovevo inviare segnali ir quindi avevo bisogno di uno sketch specifico su Arduino, ma tu potresti fare così:

Carichi firmata su Arduino. Includi arduino.cc e processing.serial su Processing. Sempre in Processing metti in una if: se il tasto premuto è diverso da OFF allora accendi il led altrimenti lascialo spento o spegnilo, l'istruzione non è il classico digitalWrite(13, HIGH); ma arduino.digitalWrite(ledPin, Arduino.HIGH);

Dimmi se sbaglio: fai leggere il valore ricevuto dalla seriale e lo switcha a seconda del valore al colore equivalente?? Non sbagli: // lato Processing: void oscEvent(OscMessage theOscMessage) { // quando viene ricevuto un osc String addr = theOscMessage.addrPattern(); // la variabile stringa addr è uguale all' addrPattern dell' osc if(addr.indexOf("/ON") == 0){ // se la variabile addr è uguale a "/ON" USBSerialPort.write("+"); // manda un + sulla seriale }

// lato Arduino: Il valore ricevuto sulla seriale è assegnato alla variabile message, che viene switchata a seconda del carattere ricevuto

N.B. quando fai il layout su TouchOSC i due pushbutton devi chiamarli (in questo esempio) ON e OFF se non scrivi /ON, lo '/' lo aggiunge automaticamente TouchOSC (in campana). N.B.2 in molti sketch trovi al posto di "USBSerialPort" "arduino" anche io come te ho dovuto penare un po' alla fine ho scelto quel nome perchè è così che Arduino viene visto in Gestione Dispositivi del mio Windows7, ma su questo punto occorre fare delle prove, io ho visto che funzionava e intanto mi sono concentrato a scrivere gli sketch.

Come faccio a far dialogare (e capire se dialogano), arduino, touchosc e il router? Quando mandi in play lo sketch su Processing in basso sulla finestra ti dice you 192.168.0.X on port 8000, quelli sono i valori che devi configurare sul' app. A questo punto con lo sketch caricato su Arduino e lo sketch in esecuzione su Processing alla pressione di un tasto sul layout dovresti vedere su Arduino lampeggiare il led RX.

Spero di averti dato qualche spunto, Ciao!

Grazie Francesco

I miei dubbi continuano ad imperversare, sicurmamente mi sto imbattendo in qualcosa molto più evoluto delle mie attuali conoscenze, forse avrò bisogno di approfondire di molto la conoscenza della programmazione di Arduino, imparando bene i comandi relativi alle comunicazioni, e poi il discorso di processing, che non ho capito come si usa. Prima , dicevi di caricare dentro arduino il rpogramma in processing, e poi di inserire le stringhe relative ad arduino... ma se sovrascrivo 2 volte,non cancello il precedente?

max996duino

ps: abbi pietà di me, ma sono veramente alle prime armi

ma l'utilizzo di processing è proprio necessario? sai se esistono degli "eserciziari" x quanto riguarda arduino? , in realtà qualcosa ho trovato ma onestamente non spiega in maniera particolarmente approfondita il perchè e il per come delle cose..

ritorniamo a bomba... perchè bisogna utilizzare anche processing? , non si riesce a far dialogare TouchOsc con Arduino direttamente?

max996duino

Ciao, forse mi sono spiegato male io, per fare dialogare touchosc e arduino "direttamente" devi utilizzare una shield che si chiama WiFly, trovi la spiegazione sul corso di arduino presente sul sito di elettronica in (pag.157), scaricabile free previa registrazione, sulla guida ci sono un sacco di esercizi e parecchio da leggere..

Il sistema che uso io invece, prevede che Arduino sia attaccato ad un pc connesso alla stessa rete wifi dell' iPhone, il segnale osc viaggia attraverso il wifi dall' iPhone al pc a cui è collegato Arduino, Processing interpreta il segnale ed invia un carattere attraverso la seriale ad Arduino che compie un azione.

Se vuoi provare fai così:

1) Collega un led al pin 13 di Arduino.

2) Crea un layout in TouchOSC con due pushbotton, chiamali /ON e /OFF, e fai l'upload sull' iPhone. (puoi usare anche il mio layout allegato al primo post)

3) Apri l'IDE di Arduino, incolla lo sketch, fai l' upload sulla scheda e chiudi l'IDE, lascia l' USB attaccata.

// Arduino
int message = 0;

void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {
    message = Serial.read();
     switch (message) {
       case '+':
        digitalWrite(13, HIGH);
       break;
       case '-':
        digitalWrite(13, LOW); //
       break;
    }
   }
  }

2) Installa la libreria oscp5 in Processing, http://www.sojamo.de/libraries/oscP5/ . Avvia Processing, incolla lo sketch e spingi play, a questo punto se toccherai il pushbotton /ON vedrai il led sul pin 13 accendersi.

// Processing

import oscP5.*;
import netP5.*;      
import processing.serial.*;
Serial USBSerialPort;
OscP5 oscP5;

void setup() {
//  size(100,100);
    oscP5 = new OscP5(this,8000);
    USBSerialPort = new Serial(this, Serial.list()[0], 9600);
}

void oscEvent(OscMessage theOscMessage) {  
    String addr = theOscMessage.addrPattern();
       if(addr.indexOf("/OFF") != 0){
         USBSerialPort.write("+");
        } else
          USBSerialPort.write("-");
}

void draw() { }

Non è complicatissimo, se ti incastri un po', e riesci, hai un buon punto di partenza. Ciao.

Ciao Francesco mi sono incastrato così bene che l'unca roba che funziona è il codice di Arduino , buttato dentro Ardunio. Ieri sera ho provato a fare come mi hai detto . Scarico Processing, lo istallo , copio il codice lo lancio e mi dice che non trova oscp5.* e netp5.*, bestemmio per trovare questi file li metto dentro e rimane solo il casino con netp5 , poi ad un certo punto mi dice che ha un problema con un puntatore o qualcosa del genere quando il compilatore legge OscP5 oscP5; si pianta tutto, quindi non sò se il programma funziona o meno.

Faccio il layout sull'editor, assegno tutto come mi dici di fare ,sincronizzo, il Pod e il pc non dialogano, ommeglio non trasferisce il layout, ma vede l'Host. credo sia un problema di porte Incoming e Outcoming... ancora devo trovare il sistema di aprirle tramite il router ( che non sono sicuro siano la 8000 e 9000), processing non proferisce parola, quindi non sò come muovermi per il momento.

Ho visto che Processing ha bisogno di una "signora programmazione", non mi sembra poi così tanto intuitivo, esiste qualche guida fatta con un pò di criterio per capire come fare ad usarlo?

grazie Max996duino