Go Down

Topic: Problema passaggio dati Processing -> Arduino (Read 10349 times) previous topic - next topic

vecio88

Ok provo a forzarla ma ho controllato e in posizione 0 c'è la COM3

camperos

invio base da processing ad arduino.
con arduino UNO tutto ok, il led si accende

con arduino "mega"  all'invio dell carattere da processing il "loop" si blocca,
provato decommentando la riga di arduino

al mio succede questo, forse è questo il problema?
con android cellulare bluetooth nessun problema


Code: [Select]
void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
}
void loop() {
  //digitalWrite(3,HIGH);
  if(Serial.available()>  0  ) {
    char message = Serial.read();
    if(message == 'r') {
      digitalWrite(3,HIGH);
    }
  }
}


processing invio base

Code: [Select]
import processing.serial.*;
Serial myPort;
void setup() {
  println(Serial.list());
  myPort = new Serial(this, Serial.list()[1], 9600);
}
void draw () {
  delay (256);
  myPort.write ('r');
}
https://www.youtube.com/watch?v=RR-xsS2xUzc

camperos

ok, questo sul "Mega"funziona, almeno provi la comunicazione, un lkampeggio di 1 secondo

Code: [Select]
void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
}
void loop() {
  // digitalWrite(3,HIGH);
  if(Serial.available()  ) {
    char message = Serial.read();
    if(message == ('r')) {
      digitalWrite(3,HIGH); 
    }
    if(message == ('s')) {
      digitalWrite(3,LOW);
    }
  }
}


processing

Code: [Select]
import processing.serial.*;
Serial myPort;
void setup() {
  println(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 9600);//cambiare "0" con la propria porta
}
void draw () {
  delay (1000);
  myPort.write ('r');
delay (1000);
myPort.write ('s');
}
https://www.youtube.com/watch?v=RR-xsS2xUzc

vecio88

Grazie camperos domani provo :) sperando di risolvere

vecio88

Funziona cosi, ma non capisco dove sia la differenza :)

vecio88

Allora ci sono progressi :) Aggiungendo il delay di minimo 900 funziona, ma non ho capito bene il perchè.

Ma non funziona bene perchè il rosso non lo prende invece il verde e il blu si. Nonostante tutto è proprio lento perchè per ogni colore aspetta 900ms e soprattutto non li somma i valori ma li sostituisce. Se metto il blu a 200 e il verde a 130 al led arriva solo il valore del verde.

Vi posto il codice

Processing:
Code: [Select]

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

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

OscP5 Ricezione;
NetAddress Invio;
Serial Arduino;


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

//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);
  ArduinoFunc();
}

void ArduinoFunc(){
  red = "r" + (dataDefaultPage1[0]/100) + ((dataDefaultPage1[0]/10)-((dataDefaultPage1[0]/100)*10)) + (dataDefaultPage1[0]-((dataDefaultPage1[0]/10)*10));
  green = "g" + (dataDefaultPage1[1]/100) + ((dataDefaultPage1[1]/10)-((dataDefaultPage1[1]/100)*10)) + (dataDefaultPage1[1]-((dataDefaultPage1[1]/10)*10));
  blu = "b" + (dataDefaultPage1[2]/100) + ((dataDefaultPage1[2]/10)-((dataDefaultPage1[2]/100)*10)) + (dataDefaultPage1[2]-((dataDefaultPage1[2]/10)*10));
  println(red + " - " + green + " - " + blu);
  delay(900);
  Arduino.write(red);
  delay(900);
  Arduino.write(green);
  delay(900);
  Arduino.write(blu);
  delay(900);
  Arduino.write("i" + 1);
}

// 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;
        }
      }
    }
   
  }
}


Arduino:
Code: [Select]

char T[]= {'r','g','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);
  pinMode(pin[0], OUTPUT);
  pinMode(pin[1], OUTPUT);
  pinMode(pin[2], OUTPUT);
  pinMode(pin[3], OUTPUT);
}

void loop() {
  analogWrite(pin[0],dati[0]);
  analogWrite(pin[1],dati[1]);
  analogWrite(pin[2],dati[2]);   
   
 
  if(Serial.available()) {
    if(e == 0) {
      d = Serial.read();
      for (int i=0;i<4;i++) { if ( d == T[i] ) {e = 1; f=i;} }
      Serial.println(d);
      Serial.print("e in case 0: ");
      Serial.println(e);
      Serial.print("f: ");
      Serial.println(f);
    } else if(e == 1) {
      N[0] = Serial.read();
      Serial.print("e caso  1: ");
      Serial.println(e);
      e = 2;
      Serial.print("N0: ");
      Serial.println(N[0]);
    } else if(e == 2){
      N[1] = Serial.read();
      Serial.print("e caso  2: ");
      Serial.println(e);
      e = 3;
      Serial.print("N1: ");
      Serial.println(N[1]);
    } else if(e == 3) {
      N[2] = Serial.read();
      Serial.print("e caso  3: ");
      Serial.println(e);
      e = 0;
      Serial.print("e nuovo: ");
      Serial.println(e);
      dati[f]= ((N[0]-48)*100)+((N[1]-48)*10)+(N[2]-48);
      Serial.print("N1: ");
      Serial.println(N[2]);
      int h = (N[0] - 48)*100;
      Serial.print("h: ");
      Serial.println(h);
      int h1 = (N[1]-48)*10;
      Serial.print("h: ");
      Serial.println(h1);
      int h2 = N[2]-48;
      Serial.print("h: ");
      Serial.println(h2);
    }     
   
  }
}

camperos

ho provato "dimmer"
http://arduino.cc/en/Tutorial/Dimmer
anche lui con arduino UNO funziona, mentre con arduino MEGA no,
per farlo funzionare si deve mettere un delay 1000,
ovviamente va a scatti
ho provato ad usare millis al posto del delay e devo metter 2 secondi per fare funzionare "dimmer" poi funziona correttamente.

al posto del delay prova ad usare "millis", purtroppo non ho "osc" e quindi non posso provare il tuo sketch
https://www.youtube.com/watch?v=RR-xsS2xUzc

camperos

#37
Nov 26, 2013, 10:37 pm Last Edit: Nov 26, 2013, 10:40 pm by camperos Reason: 1
forse ho trovato la soluzione  :)
leva tutti i delay e mettine uno nel setup subito sotto la connessione

Code: [Select]
// port = new Serial(this, Serial.list()[1], 9600);  
delay (1000);


eventualmente metti 2000, o 3000.
ovviamente attendi
https://www.youtube.com/watch?v=RR-xsS2xUzc

vecio88

Grande camperos :) funziona, male ma almeno abbiamo risolto un altro problema :)

Praticamente ora, anche se i valori sono fermi a 0 0 0, il led assume tutti i colori esistenti senza che nessuno faccia niente :) è fuori dal mio controllo.

L'ordine dei pin rgb sono (b,g,gnd,r)? Il gambetto lungo è quello del GND giusto? in teoria cosa cambia se modifico quel valore perchè in pratica non cambia niente :D?

nid69ita

#39
Nov 27, 2013, 11:43 am Last Edit: Nov 27, 2013, 02:46 pm by nid69ita Reason: 1

L'ordine dei pin rgb sono (b,g,gnd,r)? Il gambetto lungo è quello del GND giusto? in teoria cosa cambia se modifico quel valore perchè in pratica non cambia niente :D?


Io continuo a pensare che la gambetta GND deve essere messo a GND diretto e le altre gambe ai pin (con una resistenza).
Sono un programmatore e non un elettronico.
my name is IGOR, not AIGOR

gpb01

#40
Nov 27, 2013, 12:00 pm Last Edit: Nov 27, 2013, 12:04 pm by gpb01 Reason: 1
... normalmente i LED hanno un lato leggermente appiattito ed i datasheet fanno riferimento a quel lato per indicare la sequenza dei piedini, per cui ... identifica il tipo di LED RGB che hai e cercati il datasheet, solo così sarai sicuro.

Il GND va collegato direttamente a GND, gli altri piedini, ciascuno tramite una sua resistenza, vanno collegati ai pin di Arduino.


@nid : non puoi mettere una sola resistenza sul GND ... l'assorbimento cambia in funzione di quanti colori sono accesi ... come faresti a calcolarla correttamente ? Oltretutto, ciascun colore ha un "forward voltage" differente ... quindi le resistenze vanno calcolate datasheet alla mano ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

nid69ita


... normalmente i LED hanno un lato leggermente appiattito ed i datasheet fanno riferimento a quel lato per indicare la sequenza dei piedini, per cui ... identifica il tipo di LED RGB che hai e cercati il datasheet, solo così sarai sicuro.
Il GND va collegato direttamente a GND, gli altri piedini, ciascuno tramite una sua resistenza, vanno collegati ai pin di Arduino.
@nid : non puoi mettere una sola resistenza sul GND ... l'assorbimento cambia in funzione di quanti colori sono accesi ... come faresti a calcolarla correttamente ? Oltretutto, ciascun colore ha un "forward voltage" differente ... quindi le resistenze vanno calcolate datasheet alla mano ;)
Guglielmo

Ho corretto il mio post precedente  :D
Comunque anche tu come me confermi che il GND del led va al GND.
my name is IGOR, not AIGOR

gpb01


...
Comunque anche tu come me confermi che il GND del led va al GND.


... quello è poco ma sicuro  XD XD XD XD

Guglielmo
Search is Your friend ... or I am Your enemy !

vecio88

Allora ragazzi siamo arrivati quasi alla fine :) il sistema funziona ora, ho modificato un po il codice di processing che invia ora solo quando si verifica un evento.

C'è solo un piccolo problema, il fader come sapete è a scorrimento e questo causa problemi, perche fino a quando mi fermo il sistema invia diversi valori e questo sembra non piacere molto al codice arduino visto che sbaglia a quale pin assegnare il valore. Diciamo che la cosa più ovvia che mi viene in mente e mandare i dati solo quando viene fermato l'invio di valori nuovi. Ma come si fa?

Per quanto riguarda la questione del GND, ho modificato come suggerito da voi, ma la domanda che vi faccio è: perchè prima funzionava lo stesso?

Go Up