Feb.25

P1: Controllo Arduino via Wifi (TouchOSC)

P1

 

Intro: 

  • Controllo led RGB attraverso un’interfaccia su iPad/iPhone creata con TouchOSC Editor.
  • Analisi dati provenienti da una fotoresistenza.
  • Controllo Cubo (implementazione java su processing) con interfaccia touch.

Occorrente Hardware
  • 1 Arduino Uno
  • 1 Led Rosso
  • 1 Led RGB
  • 1 fotoresistenza
  • 1 resistenza da 330 ohms
  • 1 breadboard
  • 2 cavi di collegamento
 
Occorrente Software
  • Arduino software
  • Processing
  • TouchOSC Editor: Creazione interfaccia
  • TouchOSC su iPad/iPhone
 
Sorgente Arduino
char T[]= {'r','v','b','i'}; //identificare processi (rosso,verde,blu,intensità)  
int  D[]= {  0,  0,  0,  0}; //dati
int  P[]= {  3,  5,  6, 11,  4}; //Pin
int  N[]= {0,0,0};
int  e;
int  f;
char d;

void setup() {

  Serial.begin(9600);
  for (int i=0;i<=4;i+=1){pinMode(P[i], OUTPUT);} //imposta pin uscita
  pinMode(A0,INPUT); //imposta pin ingresso

}

void loop() {

 for (int i=0;i<=4;i+=1) {analogWrite(P[i],D[i]);} //voltaggio da settare
 if (Serial.available()<=0){Invio();} //vero se non ci sono comunicazioni seriali

}

void serialEvent(){ //si attiva quando riceva dati

  switch (e) {

    case 0:

    d = Serial.read();
    for (int i=0;i<=4;i+=1) { if ( d == T[i] ) {e = 1; f=i;} }
    break; 

    case 1:

    N[0] = Serial.read();
    e = 2;
    break;

    case 2:
    N[1] = Serial.read();
    e = 3;
    break;

    case 3:
    N[2] = Serial.read();
    e = 0;
    D[f]= ((N[0]-48)*100)+((N[1]-48)*10)+(N[2]-48);
    break;

  }
}

void Invio(){

 int lu = analogRead(A0);
 Serial.print ("l");
 Serial.print (lu/100); //invio centinaia
 Serial.print ((lu/10)-((lu/100)*10)); //invio decina
 Serial.print (lu-((lu/10)*10)); //invio unità

}
 
Sorgente Processing
//Librerie
import oscP5.*;
import netP5.*;
import processing.serial.*;

OscP5 Ricezione; 
NetAddress Invio;
Serial Arduino;

//Informazioni per la comunicazione
String IP    = "192.168.0.100"; //indirizzo dispositivo
int    out   = 8004;
int    in    = 9004;
String com   = "/dev/tty.usbmodemfd121"; //nome porta seriale
int    bit   = 9600; //velocità di trasferimento

//Indirizzi OSC
String P[]  = {"/Led", "/Led_RGB", "/Touch", "/Sen", "/OpAp"}; //Pagine
int    p    = 4; //numero di pagine

//Pulsanti pagina0
String B0[]  = {"/il", "/bl",  "/bp", "/bla", "/tp", "/tl",  ""}; //nomi pulsanti
int    D0[]  = {    0,     1,      0,      0,    40,    50,   0}; //dati di default
String V0[]  = {"/vl",   "/",    "/",    "/",  "/",   "/",   "/", "/"}; //valore indicativi
int    b0   = 6; //pulsanti in una pagina

//Pulsanti pagina1
String B1[] = {"/ir" , "/iv", "/ib", "/br", "/bv", "/bb",  "/ta", "/ba",  "/i",  ""};
int    D1[] = {     0,     0,     0,     1,     1,     1,      1,     0,   255,   0};
String V1[] = {"/vr" , "/vv", "/vb",   "/",   "/",   "/", "/vta",   "/", "/vi", "/"};
int    b1   = 9;

//Pulsanti pagina2
String B2[]  = {"/t/1", "/t/2", "/t/3", "/t/4", "/t/5", ""};
float  X []  = {    500,    500,    500,    500,    500,  0}; //coordinata X dito
float  Y []  = {    500,    500,    500,    500,    500,  0}; //coordinata Y dito
String V2[]  = {""};
int    b2    = 5;

//Pulsanti pagina3
String B3[]  = {""};
int    D3[]  = {0};
String V3[]  = {"/lu"};
int    b3   =  0;

//Pulsanti pagina4
String B4[]  = {"/vec", "/t",  ""};
int    D4[]  = {     4,    1,   0};
String V4[]  = {"/vc",   "/", "/"};
int    b4    = 2;

//Variabili del programma
int    b;     //Variabile per il controllo dei dati in ingresso (numero pulsanti)
String B[];   //Variabile per il controllo dei dati in ingresso (nome pulsanti)
int    d;     //Variabile per contenere i dati appena ricevuti da OSC
int    e;    //Variabile per contenere i dati appena ricevuti da Arduino
float  s;     //Variabile per la rotazione dei cubi
int    g =0;  //Variabile per la funzione Pulsazione e Lampeggio
int N[]={0,0,0};

void setup() {

  size(displayWidth, displayHeight, P3D); //finestra in modalità 3D
  frameRate (30);

  Ricezione = new OscP5      (this,out);
  Invio     = new NetAddress (IP,in);
  Arduino   = new Serial(this, com, bit);   

}

void draw() {
    background(50);

    for (int n=0;n<=4;n+=1){
      pushMatrix ();
      translate (map (Y[n],0,1000,0,1920),map(X[n],0,1000,0,1080));
      rotateX   (s += (float(D4[0])/1000));
      rotateY   (s += (float(D4[0])/1000));
      box       (100);
      popMatrix ();
  }
  fill(D1[0],D1[1],D1[2],D1[8]);
  delay(1);
  Aggiornamento();
}

void oscEvent(OscMessage theOscMessage) {
  for (int i = 0; i<=p; i+=1){  //scorre le pagine
    switch (i){

      case 0:
      b = b0;
      B = B0;
      break;

      case 1:
      b = b1;
      B = B1;
      break;

      case 2:
      b = b2;
      B = B2;
      break;

      case 3:
      b = b3;
      B = B3;
      break;

      case 4:
      b = b4;
      B = B4;
      break;
    }
    for (int i1=0; i1<= b; i1+=1){ // scorre i pulsanti
      if ( (P[i]+B[i1]).equals(theOscMessage.addrPattern())) {
        println("Ricevo dati da OSC");
        if (i==2 && i1 <5){
          X[i1]= theOscMessage.get (0).floatValue () ;
          Y[i1]= theOscMessage.get (1).floatValue () ;
        }
        else { d = int ( theOscMessage.get (0).floatValue () );}

        switch (i){
          case 0:
          D0[i1] = d;
          break;

          case 1:
          D1[i1] = d;
          break;

          case 2:
          break;

          case 3:
          D3[i1] = d;
          break;

          case 4:
          D4[i1] = d;
          break;
        }
      }
    }
  }
}

void Aggiornamento(){

  for ( int y = 0; y <= b0; y += 1) { Invio ( P[0]+V0[y], D0[y]); Invio ( P[0]+B0[y], D0[y]); }

  for ( int y = 0; y <= b1; y += 1) { Invio ( P[1]+V1[y], D1[y]); Invio ( P[1]+B1[y], D1[y]); }

  Invio ( P[3]+V3[0], D3[0]);

  for ( int y = 0; y <= b4; y += 1) { Invio ( P[4]+V4[y], D4[y]); Invio ( P[4]+B4[y], D4[y]); }

  if  ( D1[7] == 1){ Automatico();} else { for (int y = 3;y<=5;y+=1){ if(D1[y]==0){D1[y-3]=0;}}}

  if  ( D0[1] == 0){ D0[0] = 0;}  
  else if  ( D0[2] == 1) { Pulsazione(); D0[3] = 0;}
  else if  ( D0[3] == 1) {  Lampeggio();}

  if (Arduino.available()<=0) {Arduino();}

  if  ( D4[1] == 0 && Arduino.available() == 0){exit();}
}

void Invio (String p,int m){
  OscMessage myMessage = new OscMessage(p);
  myMessage.add(m);
  Ricezione.send(myMessage, Invio);
}

void Automatico () {

  if      ( D1[0] != 255 && D1[1] == 0   && D1[2] == 0  ) { D1[0] += D1[6]; }
  else if ( D1[0] == 255 && D1[1] != 255 && D1[2] == 0  ) { D1[1] += D1[6]; }
  else if ( D1[0] != 0   && D1[1] == 255 && D1[2] == 0  ) { D1[0] -= D1[6]; }
  else if ( D1[0] == 0   && D1[1] == 255 && D1[2] != 255) { D1[2] += D1[6]; }
  else if ( D1[0] == 0   && D1[1] != 0   && D1[2] == 255) { D1[1] -= D1[6]; }
  else if ( D1[0] != 255 && D1[1] == 0   && D1[2] == 255) { D1[0] += D1[6]; }
  else if ( D1[0] == 255 && D1[1] == 0   && D1[2] != 0  ) { D1[2] -= D1[6]; }
  else    { D1[7] =  0; Invio (P[1]+B1[7], 0); }

  if ( D1[0] < 0  ) {D1[0] = 0  ;}
  if ( D1[1] < 0  ) {D1[1] = 0  ;}
  if ( D1[2] < 0  ) {D1[2] = 0  ;}
  if ( D1[0] > 255) {D1[0] = 255;}
  if ( D1[2] > 255) {D1[2] = 255;}
  if ( D1[1] > 255) {D1[1] = 255;}  
}

void Pulsazione() {
  if (g == 0      ) { D0[0] +=  20;             }
  if (g == D0[4]  ) { D0[0] -=  20;             }
  if (D0[0] > 255 ) { D0[0]  = 255; g  = D0[4]; }
  if (D0[0] <= 0  ) { D0[0]  =   0; g -= 1;     }
}

void Lampeggio()  {
  if (g == D0[5] ) { D0[0] = 0;g -= 1; } else if (g>0){g -= 1;}
  if (g == 0     ) { D0[0] = 255;   g = D0[5]; }
}

void Arduino(){
  Arduino.write("r" + (D1[0]/100) + ((D1[0]/10)-((D1[0]/100)*10)) + (D1[0]-((D1[0]/10)*10)));
  Arduino.write("v" + (D1[1]/100) + ((D1[1]/10)-((D1[1]/100)*10)) + (D1[1]-((D1[1]/10)*10)));
  Arduino.write("b" + (D1[2]/100) + ((D1[2]/10)-((D1[2]/100)*10)) + (D1[2]-((D1[2]/10)*10)));
  Arduino.write("i" + (D0[0]/100) + ((D0[0]/10)-((D0[0]/100)*10)) + (D0[0]-((D0[0]/10)*10)));
}

void serialEvent(Serial p){
  switch (e) {

    case 0:
    if ((p.readString()).equals( "l")) {e = 1;}
    break;

    case 1:
    N[0] = p.read();
    e = 2;
    break;

    case 2:
    N[1] = p.read();
    e = 3;
    break;

    case 3:
    N[2] = p.read();
    e = 0;
    D3[0]= ((N[0]-48)*100)+((N[1]-48)*10)+(N[2]-48);
    println("Ricevo dati da Arduino ");
    break;
  }
}
 
Arduino
Share this Story:
  • facebook
  • twitter
  • gplus