Comunicazione seriale Processing to Arduino

Ciao a tutti, ho creato un'interfaccia con Processing(alcuni pulsanti) e ora sto cercando di mettere in comunicazione arduino e Processing via seriale.
Da Processing devo inviare un array o comunque una stringa che poi verrà letta e elaborata da arduino, ho provato inizialmente a inviare un solo carattere ma senza ottenere grossi risultati.
Potete aiutarmi?

Processing

import processing.serial.*;
Serial myPort; 
boolean isOn;

void setup() 
{
   size(400,400); 
   myPort = new Serial(this, "COM4", 9600);
   isOn = false;
}

void draw() {
 
 if (mousePressed == true) 
 { myPort.write('1'); //send 1 (led ON)
   isOn = !isOn;
   println("SEND COMMAND!");
   delay(500);
  }
 
}

Arduino

 void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

}

void loop() {
 char val;
 if (Serial.available()) 
    val = Serial.read();
 
 if (val == '1') 
 { 
    digitalWrite(LED1, HIGH);
 } 

 delay(10); 
}

Si, ma ... cosa non funziona ?
Il tutorial mi pare quello di Sparkfun e la parte Arduino mi pare incompleta
https://learn.sparkfun.com/tutorials/connecting-arduino-to-processing
(in sezione "...to Arduino" )

Avevo già consultato quel tutorial ma senza successo, anche perchè al posto di Portname alla settima riga aggiungo "COM4" (porta che devo utilizzare), ma al posto del Portname dopo String non so cosa mettere perchè mi da errore se scrivo COM4

In pratica qualsiasi cosa metta al posto di portName con questo codice mi da errore

void setup() 
{
  size(200,200); //make our canvas 200 x 200 pixels big
  String portName = Serial.list()[0]; //change the 0 to a 1 or 2 etc. to match your port
  myPort = new Serial(this,"COM4" , 9600);
}

void draw() {
  if (mousePressed == true) 
  {                           //if we clicked in the window
   myPort.write('1');         //send a 1
   println("1");   
  } else 
  {                           //otherwise
  myPort.write('0');          //send a 0
  }   
}

ciao...ho affrontato lo stesso argomento con un altro utente del forum...se hai pazienza questa sera, quando torno a casa, cerco e posto la soluzione.

comunque, lato processing, la dicitura:

String portName = Serial.list()[0];

Assegna all'oggetto String portName il "nome" ,dalla lista delle porte seriali attive, alla posizione 0...
se tu sei sicuro che arduino è connesso alla COM4 è giusto scrivere "COM4".

mi sembra che l'avevo risolta, utilizzando dal lato arduino, unSerial.readBytes() o Serial.readBytesUntil()...

Hm, mi da comunque qualche problema, ma se stasera sei disponibile aspetto volentieri grazie :slight_smile:

Beh il tuo codice Arduino rispetto a quello del tutorial puoi ben controllare che è DIVERSO.

  1. manca la pinMode nel setup
  2. accendi il led se ricevi 1 ma altrimenti non lo spegni.

Se Arduino è su COM4, la frase è giusta.
myPort = new Serial(this,"COM4" , 9600);

ma RIPETO: COSA non funziona ? si accende ma poi non si spegne ? Non fa nulla ?
Di sicuro un pin non è in output se non lo dichiari, altrimenti è in input.

"NOTE: If you do not set the pinMode() to OUTPUT, and connect an LED to a pin, when calling digitalWrite(HIGH), the LED may appear dim. Without explicitly setting pinMode(), digitalWrite() will have enabled the internal pull-up resistor, which acts like a large current-limiting resistor."

Il led non si accende proprio ma diciamo che questa doveva essere una prova di comunicazione seriale, perchè come ho scritto sopra in realtà devo mandare array o comunque stringhe di caratteri da processing ad arduino, conosci un tutorial adeguato?

ciao...scusa il ritardo...non trovando più l'originale ne allego un altro:

lato arduino:

byte A[9];
byte B[10];

int i = 0;
int sommaA = 0;
int sommaB = 0;
byte media = 0;

boolean readyToSend = false;

void setup() {
  Serial.begin(9600);
}

void loop() {

  while (Serial.available() > 0) {

    if (i < sizeof(A)) {
      i += Serial.readBytes(A, 9);
    }
    if (i >= sizeof(A) && i < (sizeof(A) + sizeof(B))) {
      i += Serial.readBytes(B, 10);
      readyToSend = true;
    }
  }

  if (readyToSend && i == (sizeof(A) + sizeof(B))) {
    for (int z = 0; z < sizeof(A); z++) {
      sommaA += A[z];
      Serial.write(A[z]);
    }

    for (int z = 0; z < sizeof(B); z++) {
      sommaB += B[z];
      Serial.write(B[z]);
    }
    media = (sommaA + sommaB) / 2;
    Serial.write(media);
    sommaA = 0;
    sommaB = 0;
    media = 0;
    i = 0;
    readyToSend = false;
  }
}

lato processing:

import processing.serial.*;

byte[] A = { 0, 1, 2, 3, 4, 5, 6, 7, 8};
byte[] B = { 9, 10, 11, 12, 13, 14, 15, 16, 17, 18};

int x =0;
int k=0;

boolean invio = false;
boolean invio2 = false;

Serial porta;

void setup() {
  size (400, 400);
  background(0);

  textSize(40);
  text("Premi il mouse qui", 10, 200);

  porta = new Serial(this, "COM3", 9600);
}

void draw() {
  if (mousePressed == true && !invio) {
    invio=true;
    invio2=true;
  }

  if (invio2) {
    for (int i=0; i<A.length; i++) {

      porta.write(A[i]);
    }
    for (int i=0; i<B.length; i++) {
      porta.write(B[i]);
    }
    invio2=false;
  }
  while (porta.available()!=0 && !invio2) {
    k=porta.available();
    x = porta.read();
    println(x);
    if (k==1) {
      delay(500);
      invio=false;
      invio2=false;
      k=0;
      x=0;
    }
  }
}

con questi codici invii due array di byte da P ad A...A li rimanda tali e quali ed in più la media dei valori delle due array.

provato e tutto funziona!!!!
grazie mi hai salvato :o