[RISOLTO] Arduino+Tlc5940+Blutooth+Processing

Salve a tutti,
sto tentando di passare dei valori di luminosita provenienti da una app scritta in processing ad un arduino con un Tlc5940 e 5 led rgb.
Da premettere che i dati che ricevo sono corretti (ho controllato tramite monitor seriale e questo sketh)

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
  Serial.begin(38400);
  mySerial.begin(38400);
}
void loop()
{
  if (mySerial.available())
    Serial.println(int(mySerial.read()));
  if (Serial.available())
    mySerial.println(Serial.read());
}

Il problema vero e proprio è attribuire l'inizio dell'array in primis, in tal modo sono sicuro della corrispondenza tra posizione dell'array e canale del Tlc.
Questo è lo sketh di arduino:

#include <Tlc5940.h>
int arr[15];
//int val;
int channel;
void setup(){
  Tlc.init();
  Serial.begin(38400);
  for (channel=0;channel<15;channel++){
    Tlc.set(channel,0);
  }
  delay(2000);
}
void loop(){
  if (Serial.available()){
    Tlc.clear();
    for(int channel=0; channel<15;channel++){
      int val=Serial.read();
      val=map(val,0,255,0,4095);
      Tlc.set(channel,val);
    }
    Tlc.update();
  }
}

Altro problema è la perdita di dati durante il trasporto oltre la corrispondenza.
Praticamente anche se imposto tutti i valori di processing a 0 tranne uno comunque visualizzo l'accensione di tutti i canali dallo 0 al 14.
E' come se perdessi un elemento dell'array per cui mi si sposta tutta la corrispondenza.
Allego anche lo sketh di processing (non si sa mai...)

import processing.serial.*;
import controlP5.*;
ControlP5 Cp5;
Serial myPort;

int [] rgb1 = new int[15];

Slider r1, r2, r3, r4, r5, g1, g2, g3, g4, g5, b1, b2, b3, b4, b5;

void setup() {
  size(800, 800);
  Cp5= new ControlP5(this);
  String portName = "COM5";
  myPort = new Serial(this, portName, 9600);

  r1 = Cp5.addSlider("R1", 0, 255, 40, 10, 10, 255, 10);
  Cp5.controller("R1").setColorForeground(#FC0000);
  Cp5.controller("R1").setColorActive(#000000);
  g1 = Cp5.addSlider("G1", 0, 255, 60, 10, 30, 255, 10);
  Cp5.controller("G1").setColorForeground(#0BFC00);
  b1 = Cp5.addSlider("B1", 0, 255, 80, 10, 50, 255, 10);
  Cp5.controller("B1").setColorForeground(#002CFC);

  r2 = Cp5.addSlider("R2", 0, 255, 40, 10, 70, 255, 10);
  Cp5.controller("R2").setColorForeground(#FC0000);
  Cp5.controller("R2").setColorActive(#000000);
  g2 = Cp5.addSlider("G2", 0, 255, 60, 10, 90, 255, 10);
  Cp5.controller("G1").setColorForeground(#0BFC00);
  b2 = Cp5.addSlider("B2", 0, 255, 80, 10, 110, 255, 10);
  Cp5.controller("B2").setColorForeground(#002CFC);

  r3 = Cp5.addSlider("R3", 0, 255, 40, 10, 130, 255, 10);
  Cp5.controller("R3").setColorForeground(#FC0000);
  Cp5.controller("R3").setColorActive(#000000);
  g3 = Cp5.addSlider("G3", 0, 255, 60, 10, 150, 255, 10);
  Cp5.controller("G3").setColorForeground(#0BFC00);
  b3 = Cp5.addSlider("B3", 0, 255, 80, 10, 170, 255, 10);
  Cp5.controller("B3").setColorForeground(#002CFC);

  r4 = Cp5.addSlider("R4", 0, 255, 40, 10, 190, 255, 10);
  Cp5.controller("R4").setColorForeground(#FC0000);
  Cp5.controller("R4").setColorActive(#000000);
  g4= Cp5.addSlider("G4", 0, 255, 60, 10, 210, 255, 10);
  Cp5.controller("G4").setColorForeground(#0BFC00);
  b4 = Cp5.addSlider("B4", 0, 255, 80, 10, 230, 255, 10);
  Cp5.controller("B4").setColorForeground(#002CFC);

  r5 = Cp5.addSlider("R5", 0, 255, 40, 10, 250, 255, 10);
  Cp5.controller("R5").setColorForeground(#FC0000);
  Cp5.controller("R5").setColorActive(#000000);
  g5 = Cp5.addSlider("G5", 0, 255, 60, 10, 270, 255, 10);
  Cp5.controller("G5").setColorForeground(#0BFC00);
  b5 = Cp5.addSlider("B5", 0, 255, 80, 10, 290, 255, 10);
  Cp5.controller("B5").setColorForeground(#002CFC);
}

void draw() {
  rgb1[0]= int(r1.getValue());
  rgb1[1]=int(g1.getValue());
  rgb1[2]=int(b1.getValue());
  rgb1[3]=int(r2.getValue());
  rgb1[4]=int(g2.getValue());
  rgb1[5]=int(b2.getValue());
  rgb1[6]=int(r3.getValue());
  rgb1[7]=int(g3.getValue());
  rgb1[8]=int(b3.getValue());
  rgb1[9]=int(r4.getValue());
  rgb1[10]=int(g4.getValue());
  rgb1[11]=int(b4.getValue());
  rgb1[12]=int(r5.getValue());
  rgb1[13]=int(g5.getValue());
  rgb1[14]=int(b5.getValue());
  printArray(rgb1);
  //myPort.write("255");
  for (int i=0; i<15; i++) {
    myPort.write(rgb1[i]);
  }
  background(100, 100, 100);
  println(Serial.list());

  println(second());
}
mySerial.begin(38400);

La SoftwareSerial non funziona a velocitá alte.
Ciao Uwe

Mi pare di aver letto da qualche parte che sopra i 19200 baud non funzioni correttamente, io ti consiglio di stare sotto questa soglia, il problema è quello indicato da uwefed.

Allora ho modificato lo sketh per leggere i dati provenienti dalla seriale come mi hanno consigliato uwefed e funk a 2400 (tutto stessa velocità Seriale Arduino, Seriale1 Arduino, velocita modulo hc05 tramite comandi at, porta com5 del computer).
Eccolo sketh:

#include <Tlc5940.h>
int arr[15];
//int val;
int channel;
void setup(){
  Tlc.init();
  Serial.begin(2400);
  Serial1.begin(2400);
  for (channel=0;channel<15;channel++){
    Tlc.set(channel,0);
  }
  delay(2000);
}

void loop(){
  if (Serial1.available()){
    Tlc.clear();
    for(int channel=0; channel<15;channel++){
      int val=Serial1.read();
      val=map(val,0,255,0,4095);
      if(val<0){
        val=0;
      }
      Tlc.set(channel,val);
      Serial.println(int(val));
    }
    Tlc.update();
  }
}

Ma la cosa strana e che la seriale mi stampa 17 valori invece di 15, ed in piu alcune volte mi replica lo stesso valore 2 o 3 volte all'interno dello stesso array.
Non lo ho specificato prima, ma sto usando un Arduino Mega che porta 4 seriali.
Grazie a tutti

prova con 9600.
Ciao Uwe

Provato a 9600, 2400, 38400 ma niente.
Si perde la corrispondenza tra gli array.
Vorrei mandare un valore di apertura di array che dichiari che i successivi 15 sono i valori di luminosita del 5940, ma non so come fare.
Suggerimenti??

ciao
processing invia in ascii string,

per arduino forse ti puo aiutare la funzione parseInt

Ho risolto finalmente sbattendo su tutti i forum del mondo. Allego lo sketh per gli altri.

#include <Tlc5940.h>
int arr[15];
//int val;
int channel;
#define HEADER        '|'
void setup(){
  Tlc.init();
  Serial.begin(9600);
  Serial1.begin(9600);
  for (channel=0;channel<15;channel++){
    Tlc.set(channel,0);
  }
  delay(2000);
}

void loop(){
  if (Serial1.available()>=16){
    if(Serial1.read()==HEADER){
      Tlc.clear();
      for(int channel=0; channel<15;channel++){
        int val=Serial1.read();
        val=map(val,0,255,0,4095);
        if(val<0){
          val=0;
        }
        Tlc.set(channel,val);
        Serial.println(int(val));
      }
    }
    Tlc.update();
  }
}

Grazie a tutti per i consigli