Go Down

Topic: Problema Comunicazione Seriale Processing (Read 255 times) previous topic - next topic

the_hawk

Aug 07, 2016, 03:26 pm Last Edit: Aug 12, 2016, 08:15 pm by The_Hawk
Ciao a tutti, è la mia prima volta che uso un arduino e sto avendo problemi riguardo la comunicazione seriale con processing.

In particolare provo ad inviare una variabile di tipo intero convertita a stringa per comodità da processing alla board che ricevuta la variabile dovrebbe accendere il numero di led indicato dal numero e reinviare lo stesso nuovamente a processing.

Dal monitor seriale il tutto funziona alla perfezione, ma da processing no.

Più precisamente processing invia la variabile (il led RX si accende) ma non si accendono i led collegati alla board che inoltre restituisce null a processing o almeno così legge la console di processing.

Per vedere se processing inviava null ho inserito e avevo provato (ora nel codice è diverso) una funzione (blink_ALL) che se viene letto null fa lampeggiare tutti i led collegati alla board, ma avviando processing ciò non avviene e quindi non dovrebbe inviare null.

Lo stesso accade se invio un numero scelto da me senza usufruire della variabile.

Se invece dalla board non ricevo nulla (commentando il codice di ricezione) e inviando soltanto processing legge perfettamente ciò che invio.

La board in questione è la Mega 2560.

Ecco i codici incriminati:
Lato Processing:
Code: [Select]

import processing.serial.*;

import hypermedia.net.*;

Serial myport;

public void setup() {
 
 background(0);
 size(600, 400);
  // create a new datagram connection on port 6000
  // and wait for incoming message
  udp = new UDP( this, 20779 ); 
  udp.log( false );     // <-- printout the connection activity
  udp.listen( true );
  instantiate_rpms();
  myport= new Serial(this, "COM3", 115200);
}

public void draw() {
  background(0);
  fill(255);
  textSize(30);
  draw_throttle();
  text(gear, 300, 200);
  textSize(20);
  draw_lap_info();
  text("MAXSPEED: "+maxSpeed, 10, 120);
  draw_fuel_info();
  draw_sector_info();
  draw_rpm_info();
  int rpm=int(map(valori[37], 0, 15000, 0, 15));
  String g=str(rpm);
  myport.write(g);
  println("SEND: " + g);
  println(myport.readString());
  text("POSITION: "+(valori[39]+1), 400, 140);
  draw_G_force(G_lat, G_lon);
  draw_sunspensions();
}


Lato Arduino:
Code: [Select]

int leds[15];
int num_leds=15;
char RPM;
String RPMs;
bool stringcomplete=false;

void setup() {
  Serial.begin(115200);
  int o=53;
  for(int i=0; i<num_leds; i++, o--)
  {
    leds[i]=o;
  }
  for(int i=0; i<num_leds; i++)
  {
    pinMode(leds[i], OUTPUT);
  }
}

void loop() {
  turn_ALL_OFF();
  //blink_ALL();
  //delay(1000);
  turn_on(RPMs.toInt());
  Serial.println(RPMs);
  delay(500);
  RPMs="";
  stringcomplete=false;
}

void blink_ALL()
{
  turn_ALL_OFF();
  delay(500);
  turn_ALL_ON();
  delay(500);
}

void serialEvent()
{
  while(Serial.available())
  {
    char inChar=(char)Serial.read();
    RPMs+=inChar;
    if(inChar=='\n')
      stringcomplete=true;
  }
}

void turn_ALL_OFF()
{
  for(int i=0; i<num_leds; i++)
  {
    digitalWrite(leds[i], LOW);
  }
}

void turn_ALL_ON()
{
  for(int i=0; i<num_leds; i++)
  {
    digitalWrite(leds[i], HIGH);
  }
}

void turn_on(int RPMs)
{
  if(RPMs>=0 && RPMs<=15)
  {
    for(int i=0; i<RPMs; i++)
    {
      digitalWrite(leds[i], HIGH);
    }
    for(int i=RPMs; i<num_leds; i++)
    {
      digitalWrite(leds[i], LOW);
    }
  }
}


Go Up