Problema passaggio dati Processing -> Arduino

Salve ragazzi, come da oggetto ho un problema con il passaggio dei dati da Arduino a Processing

Praticamente il progetto consiste nel far variare il colore di un led rgb utilizzando lo smartphone. Da OSC a Processing va tutto bene, il problema sembra essere tra processing e Arduino. Il codice che ho messo sotto ha una piccola modifica perciò non passa i valori rgb ma un solo carattere, viceversa il codice arduino legge il carattere e setta sul rosso 230.

Come posso risolvere?

Questo è il codice processing

//Informazioni per la comunicazione
String IP    = "192.168.1.14";
int    out   = 8004;
int    in    = 9004;
String com   = "COM3";
int    bit   = 9600;

//Librerie
import oscP5.*;
import netP5.*;
import processing.serial.*;
import cc.arduino.*;

OscP5 Ricezione;
NetAddress Invio;
Serial Arduino;
Arduino ard;


//Indirizzi/Dati di OSC
//Info. Pagine
String pagine[]  = {"/main"};
int    numPagine = 1;

//Info. Bottoni
String ButtomPage1[]  = {"/faderRosso", "/faderVerde",  "/faderBlu", ""};
int    dataDefaultPage1[]  = {0, 0, 0, 0};
//String V0[]  = {"/vl",   "/",    "/",    "/",  "/",   "/",   "/", "/"}; non dovrebbe servire per ora
int    numButton1 = 3;

//Variabili del programma
int    numeroBottoniPaginaSelezionata;     //Variabile per il controllo dei dati in ingresso (numero bottoni)
String bottoniPaginaSelezionata[];   //Variabile per il controllo dei dati in ingresso (nome bottoni)
int    d;     //Variabile per contenere i dati appena ricevuti da OSC
int    e;    //Variabile per contenere i dati appena ricevuti da Arduino
int N[]={0,0,0};

void setup() {
  frameRate (30);
  
  Ricezione = new OscP5(this,out);
  Invio = new NetAddress (IP,in);
  Arduino = new Serial(this, com, bit);   
}

void draw() {
  background(50); 

  Aggiornamento();
}

void Aggiornamento(){
  ArduinoFunc();
}

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

// funzione che riceve i dati dal OSC
void oscEvent(OscMessage theOscMessage) {
  
 for (int i = 0; i < numPagine; i++){
    switch (i){      
      case 0:
      numeroBottoniPaginaSelezionata = numButton1; 
      bottoniPaginaSelezionata = ButtomPage1;
      break;
      
    }
    
    for(int j = 0; j < numeroBottoniPaginaSelezionata; j++) {
      
      if ( (pagine[i]+bottoniPaginaSelezionata[j]).equals(theOscMessage.addrPattern())) {
        
        float valoreRicevuto  = theOscMessage.get(0).floatValue();
        d = int(valoreRicevuto * 255.00);
        
        switch (i){
          case 0:
          dataDefaultPage1[j] = d;
          println("Valore: " + dataDefaultPage1[j] + "(" + bottoniPaginaSelezionata[j] + ")" );
          break;
        } 
      }
    } 
    
  }
}

E questo è quello Arduino

char T[]= {'r','v','b','i'};
int  dati[]= {  0,  0,  0,  0}; // di default sono 0,0,0,0
int  pin[]= {3, 5, 6, 4};
int  N[]= {0,0,0};
int  e = 0;
int  f;
char d;

void setup() {
  Serial.begin(9600);
  for (int i = 0; i <= 4; i += 1){pinMode(pin[i], OUTPUT);}
}

void loop() {

 for (int i = 0; i < 4 ; i++) {analogWrite(pin[i],dati[i]);}
 if(Serial.available() > 0) {
   char message = Serial.read();
   
   if(message == 'r') {
     analogWrite(0,230);
   }
 }
}

No ma xke A0? Comunque dimenticavo di dirvi che ho un Arduino Mega

Quindi mandi 230 sul pin 0 sperando che di pilotarlo come PWM ? Il pin 0 non è PWM.

A questa pagina una serie di schede con il pinout delle varie board. http://forum.arduino.cc/index.php?topic=151646.msg1138645#msg1138645

Forse hai letto male il codice… In posizione 0 dell’array dei pin ed è il pin3 sul mega dal 3 al 6 Sn tutti pwm

vecio88: E questo è quello Arduino

 if(Serial.available() > 0) {
   char message = Serial.read();
   if(message == 'r') {
     analogWrite(0,230);
   }
 }
}

Quando Arduino riceve un byte e il byte è 'r' allora scrivi su Pin 0 il valore 230. forse volevi scrivere:

analogWrite(pin[0],230);

Il for che fai in precedenza alla if effettivamente scrive sui 4 pin dell'array ma scrive 0 visto che array dati è tutto a 0

Hai ragione :blush: si sn settati a zero di default però nel momento in cui inizio a modificare i valori rgb il programma dovrebbe prendere i dati dal serial e metterli nell'array dei valori...

Cmq sia c'è un modo per stampare dei valori di debug nella consolo on basso dell'ide Arduino?

Si, con Serial.println()

Serial.print("Valore");
Serial.println(val);

Forse però la seriale è impegnata nella comunicazione con Processing.

Sì è occupata con processing... Perché non riesco a capire se arrivano i dati ma Nn riesco a gestirli o non arrivano proprio

Per sicurezza non puoi provare a fare un blink dei led del pin 13 ?

if(message == 'r') 
{ digitalWrite(13,HIGH);
  delay(1000);
  digitalWrite(13,LOW);
}

Buongiorno, ho provato a fare il blink di quel led ma mi sono accorto che a prescindere che io lo metta o meno quel led rimane illuminato :)

ho provato a correggere l'analogWrite ma niente...mi sta venendo il dubbio che non arrivino proprio i dati ad Arduino.

Comunque leggevo che Arduino Mega ha diversi Serial però non mi è chiaro come devo comportarmi in questo caso

ho fatto un'altra prova, ho messo l'analog write fuori dal controllo Serial.available e ovviamente funzionava. L'ho messo all'interno del Serial.available e non andava, perciò aumento il mio presentimento che non arrivano i dati dal Serial

Ho provato l'esempio di processing simpleWrite e niente stesso identico problema

vecio88: No ma xke A0? Comunque dimenticavo di dirvi che ho un Arduino Mega

A questo punto è necessario che posti uno schema di come hai collegato l'hw e soprattutto quali pin hai usato come tx/rx La Serial fa riferimento a seriale 0 che coincide con seriale usb (si dico castronate mi correggano i più esperti). Se usi altre seriali (mi pare 1,2 e 3 su Mega) usi altri pin e un altro oggetto. http://arduino.cc/en/Reference/Serial "The Arduino Mega has three additional serial ports: Serial1 on pins 19 (RX) and 18 (TX), Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX)"

L'unico hw è un led rgb collegato in questo modo R su pin 3 Gnd su pin 4 G su pin 5 B su pin 6 Sn tutti pwd

Quindi PC e Arduino collegati tramite USB.

Non mi convince il GND su pin 4. Perchè? Il GND va a GND. Hai 3 colori, 3 pin.

ciao nei miei sketch in questo caso devo mettere un delay, ignoro il motivo ma cosi (nei miei)funziona

if(Serial.available() > 0) {
   char message = Serial.read();
   if(message == 'r') {
     analogWrite(pin[0],230);
   delay (100);
}
 }
}

Lo schema da cui ho preso questo esempio faceva così anche se li il Gnd lo metteva su un pin Nn pwm perché era un Arduino uno e la disposizione dei pin era diversa

vecio88: Lo schema da cui ho preso questo esempio faceva così anche se li il Gnd lo metteva su un pin Nn pwm perché era un Arduino uno e la disposizione dei pin era diversa

Una serie di schede per i collegamenti: http://forum.arduino.cc/index.php?topic=146152.msg1098046#msg1098046 Sul sito di xxxPighi ci sono le versioni pdf ad alta definizione.

Scheda 5, è una striscia a led RGB, molto più complessa, ma puoi vedere che il GND è a GND con l'alimentazione e vengono pilotati da 3 pin i 3 colori.

Ok questa è una modifica che farò appena posso :) però il problema sembra un altro ovvero che non arriva niente al Serial

Ho un piccolo dubbio, se le porte seriali USB dell'arduino mega sono 0 e 1 e io non collego il led a quelle porte non mi scriverà niente?

Questa cosa mi sembra strana perchè nell'esempio che puoi vedere http://www.youtube.com/watch?v=PNXQexJotTM al minuto 10:59 c'è lo schema. Il mio però ha solo il led RGB e neanche lui ha collegato niente ai pin 0 e 1.

Ripeto ho la netta impressione che non arrivi assolutamente niente alla seriale.