comunicazione seriale arduino-processing

salve a tutti,
la mia intenzione era quella di comunicare serialmente (e non tramite firmata) tra arduino e processing, e dopo avere letto alcuni esempi ho provato ma invano.
In pratica arduino legge un potenziometro che da valori da 0 - 1023 e fin li tutto bene. Poi li srcive sulla seriale con un Serial.write().
Su processing ho fatto invece un programmino che legge i valori con un Serial.read() (ho gia incluso la libreria processing.serial)
e gli ho detto di scriverli sul suo monitor seriale, e effettivamente vengono scritto dei valori, ma non si aggiornano al ruotatre del potenziomentro... What i can do?

Grazie delle risposte =)

Magari venga a casa tua per vedere il codice che hai scritto ? :grin:

Se vuoi aiuto, posta il codice di Arduino e di Processing.

Allora adesso posto un codice con la lettura di un bottone mandata a processing tramite seriale (alcuni eventuali errori di codice potrebbero essere dovuti alla scrittura veloce =)

import processing.serial.*;

Serial arduino;


void setup()
{
  size(200,200);
  arduino = new Serial(this,Serial.list()[1],9600);
}

void draw()
{
  if(arduino.available() > 0)
  {
    int val = arduino.Read();
  }
  if (val==1)
  {
    background(255,0,0);
  }
  else
  {
    background(255);
  } 
}
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin



void setup() {
 pinMode(ledPin, OUTPUT);      
 pinMode(buttonPin, INPUT);    
 Serial.begin; 
}

void loop(){
 int buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) 
  {     
   Serial.write(1)
  }
  else
  {
   Serial.write(0)
  } 
}

Non puoi usare copia e incolla? :astonished:
Poi il tuo problema non è con un potenziometro?

Comunque, occhio che la write spedisce UN solo byte.
Per il valore 0-1023 è necessario una int e perciò devi spedire 2 byte.

E' anche possibile usare i Processing l'evento serialEvent:
http://processing.org/reference/libraries/serial/serialEvent_.html

nonono non e che lo scirtto direttamente sul post :stuck_out_tongue: :stuck_out_tongue:

e che non trovavo lo sketch del potenziometro e allora ne ho preso uno di un semplice bottone il cui stato e mandato via serial :sweat_smile: :sweat_smile:

il fatto e che non riesco a far funzionare neanche questo sketch, nel quale presumo che ci voglia un solo bite, dove sbaglio?
Ho provato a leggere serialEvent sulla reference di processing, ma non capisco a cosa serve =(

Beh, un pò di errori ci sono. Non sò se perchè hai riscritto il codice.

  1. arduino code:
Serial.begin;

deve essere

Serial.begin(9600);
  1. processing code:
void draw()
{ if(arduino.available() > 0)
  {  int val = arduino.Read();
  }
  if (val==1)
  { ...

In questo caso se dichiari la val dentro al blocco del if, ha vita e visibilità solo in quel blocco. La devi dichiarare prima di quell'if.

  1. sei sicuro che stai usando la stessa porta seriale?
    Se sei su Windows in Processing puoi anche sostituire:
arduino = new Serial(this,Serial.list()[1],9600);

con

arduino = new Serial(this,"COM2",9600);

dovrai indicare la COMx giusta, quella che usi su Arduino (io ho messo COM2, tu quella reale)

si allora io ho riscritto il codice (scusa per quegli errori banali :cold_sweat: :sweat_smile:) xD
ho anche messo la mia porta seriale (COM5) su entrambi gli sketch, ma ancora non funziona :stuck_out_tongue_closed_eyes:

Il metodo pero di per se e giusto? (cioe serialWrite/serialRead)
Se si allora potrebbero esserci dei problemi sul PC.

Bisogna fare un debug per bene. Inizia a verificare la parte Arduino.
Prova da Arduino a vedere se sul Serial Monitor ti stampa qualcosa quando premi il pulsante.
Magari per la prova metti Serial.print(1) e Serial.print(0) al posto del write.
Se non ti stampa mai l'1 allora hai collegato male il pulsante.

P.S. banale, solo per miglioria

const int ledPin =  13;

meglio se scrivi:

const byte ledPin =  13;

si si ho provato e scrive 1 alla pressione...

Adesso provo sul computer di my dad e poi vi dico =)

mah.. di la sembra arrivi in ascii..
prova a fare così con serialEvent come dice nid69ita

void draw()
{
 println (val);
}
void serialEvent(Serial arduino){  
 
if(arduino.available()>0){ 
   val = arduino.read();
  //}
  if (val==1)
  {
    background(255,0,0);
  }
  else if (val==0)
  {
    background(255);
  } 
 }
 }

Premetto che di processing non so un fico secco, ma considerando la somiglianza con l'IDE arduinesco, io mi chiedo, ma non sarà che quando dici:

if (val==1)

in realtà dovresti usare:

if (val=='1')

si perchè da quello che so io (non sono un'esperto ma ci ho giocato con la trasmissione dati alla/da seriale), i dati inviati per via seriale sono CHAR e quindi devi usare la virgoletta singola per indicare il numero CHAR e non quello byte/int che sia. Ragazzi, correggetemi se sbaglio!

PS: Anche se ricevi comandi/dati su arduino dalla seriale devi usare le virgolette singole.

ciao,

Hiperformance ha ragione, sulla seriale 1 non è '1'.
Il primo è un byte di valore 1 mentre il secondo è il carattere ASCII '1'.