Problema radar Arduino-Processing

Salve da ieri sto provando a creare una sorta di "radar" dove utilizzando un sensore ad ultrasuoni( montato su un servomotore) si venga a creare una sorta di mappa degli oggetti prendenti nel raggio di 10 cm. Sto riscontrando un problema riguardo il SerialEvent() di Processing poichè mi viene disabilitato a causa di un valore Null.

Error, disabling SerialEvent() for COM3
null

Allego i due codici ( non fate caso al codice processing che non disegna bene il point poichè vorrei prima risolvere questo problema prima di implementare completamente il codice):

Arduino :

/*
Radar con sensore ad ultrasuoni montato su servomotore da modellismo.
 */

#include <Servo.h>

Servo myservo;

int triggerPort = 9;
int echoPort = 10;

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

  myservo.attach(8);
  pinMode( triggerPort, OUTPUT );
  pinMode( echoPort, INPUT );
  myservo.write(0);
}

void loop()
{
  for ( int i = 0; i < 180; i++)
  {
    myservo.write(i);
    //porta bassa l'uscita del trigger
    digitalWrite( triggerPort, LOW );
    //invia un impulso di 10microsec su trigger
    digitalWrite( triggerPort, HIGH );
    delayMicroseconds( 10 );
    digitalWrite( triggerPort, LOW );
    long duration = pulseIn( echoPort, HIGH );
    long r = 0.034 * duration / 2;

    if (r<10)
    {
      Serial.print ( r );
      Serial.print ('\n');
      Serial.print ( i );
      Serial.print ('\n');
    }  
    else
    {
      Serial.print (0);
      Serial.print ('\n');
    }
  }
  delay(1000);
}

Processing :

import processing.serial.*;

 Serial myboard;
 
 float Distanza = 0.0;
 float Angolo = 0.0;
 
 float x,y;
 
void setup(){
    
  myboard = new Serial(this,  Serial.list()[0] , 9600);
  
  size(600,300);
  strokeWeight(2);
  arc(300, 250, 450, 450, -PI, 0);  // Semicerchio.
  line(75,250,525,250); // Chiudo il semicerchio.
  strokeWeight(15);
  point(300,250); // Centro del semicerchio.

  strokeWeight(2);
  // Perpendicolare : line(300,250,300,25); 
  
 
}

}
void draw(){
  y = (300-((Distanza*22.5)+25)); 
  point((Angolo+100),y);
}

void serialEvent(Serial myPort){
  while(myboard.available()>0)  {
  Distanza = float(myboard.readStringUntil('\n'));
    
  Angolo = float(myboard.readStringUntil('\n'));
}}

dall'esempio "virtualcolormixer" c'è il codice processing

in processing si devei splittare la stringa
arduino

    if (r<10)
    {
      Serial.print ( r );
      Serial.print (',');
      Serial.print ( i );
      Serial.print ('\n');

processing

void serialEvent(Serial myPort){
String inString = myboard.readStringUntil('\n');
  
 if (inString != null) { 
 inString = trim(inString);
  float[] dati= float(split(inString, ','));
  Distanza = dati[0];
Angolo = dati[1];

qualcosa del genere :slight_smile:
prova

Non conosco bene Processing, il quale si programma in Java.
Detto questo, se l'evento serialEvent riceve il parametro myPort come seriale, da quello devi leggere. Magari va bene anche myboard, ma dubito:

void serialEvent(Serial myPort){
String inString = myPort.readStringUntil('\n');    // myPort e non myboard

Secondo, non mi risulta Java sia come Vbasic che permette di fare conversioni tra stringhe e numerici con un semplice cast.
http://processing.org/discourse/beta/num_1233141860.html

Salve, innanzitutto grazie per le vostre risposte. Ho provato a splittare i valori letti da seriale ma il problema sussisteva ancora, ho eliminato l' "else" nel programma Arduino e ora non mi si presenta più il null . Problema risolto , grazie.
Un'ultima cosa avete qualche consiglio su come posso riportare questi punti sulla semicirconferenza ? Perchè ora i punti creano delle linee orizzontali in base all'oggetto rilevato dal sensore, volendo trasformare queste rette in archi ? non so se mi sono spiegato! Grazie.

ho cancellato il post precedente, leggendo meglio.. credo che sia più idoneo prendere spunto da qui

void setup() {
  size (1000, 1000);//dimensione schermo
} 
void draw() { 
  background (0); //sfondo
  strokeWeight (1);// larghezza bordo
  translate (500, 500);//sposto al centro
  stroke(255, 40, 40);  // colore bordo
  noFill(); //elimino il colore corpo
  arc(0, 0, 160, 160, radians (180), radians (180+mouseX/2));//al posto di mouseX/2 mettere
  // Distanza che è da mappare
}

arc (coordinate x, coordinate Y, larghezza, altezza, punto di partenza, punto di fine);

con arduino puoi modificare ogni singolo parametro

l'inserimento di "radians" serve per convertire radianti con gradi (puoi non usare radians),
infatti il 180 che ho messo è per fare partile l'arco a sinistra del centro, lo zero è a destra del centro

Grazie ! :slight_smile: