Go Down

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

vecio88

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
Code: [Select]

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

Code: [Select]

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




vecio88

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

nid69ita

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
my name is IGOR, not AIGOR

vecio88

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

nid69ita

#4
Nov 23, 2013, 09:45 pm Last Edit: Nov 23, 2013, 09:48 pm by nid69ita Reason: 1

E questo è quello Arduino
Code: [Select]

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:
Code: [Select]
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
my name is IGOR, not AIGOR

vecio88

Hai ragione  :smiley-red: 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?

nid69ita

Si, con Serial.println()

Code: [Select]
Serial.print("Valore");
Serial.println(val);


Forse però la seriale è impegnata nella comunicazione con Processing.
my name is IGOR, not AIGOR

vecio88

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

nid69ita

Per sicurezza non puoi provare a fare un blink dei led del pin 13 ?
Code: [Select]
if(message == 'r')
{ digitalWrite(13,HIGH);
  delay(1000);
  digitalWrite(13,LOW);
}
my name is IGOR, not AIGOR

vecio88

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

vecio88

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

vecio88

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

nid69ita


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)"
my name is IGOR, not AIGOR

vecio88

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

nid69ita

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.
my name is IGOR, not AIGOR

Go Up