Pages: [1] 2 3   Go Down
Author Topic: Processing: Varie ed Eventuali  (Read 2252 times)
0 Members and 1 Guest are viewing this topic.
0
Online Online
Faraday Member
**
Karma: 47
Posts: 5961
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Processing sragiona ? o forse io ?  smiley

Se su arduino stampo il carattere newline \n non ho problemi, riesco a riceverlo e gestirlo su processing, uso questo carattere come marker per comunicare la fine del valore del potenziometro:

ARDUINO:
Code:
Serial.print(analogRead(potPin));
  Serial.print("\n");
PROCESSING:
Code:
int MARKER = 10; \\ valore dec ASCII di \n
port.bufferUntil(MARKER);
brightness = float(port.readStringUntil(MARKER));
println(brightness);


Volendo invece usare un carattere arbitrario, ad esempio M, al posto di \n, non funziona. invece del valore del potenziometro su processing ricevo "NaN"
ARDUINO:
Code:
Serial.print(analogRead(potPin));
  Serial.print("M");
PROCESSING:
Code:
int MARKER = 77;  \\ valore dec ASCII di M
port.bufferUntil(MARKER);
brightness = float(port.readStringUntil(MARKER));
println(brightness);


Ci sto' sbattendo la testa da qualche ora, mi arrendo  smiley
Questo e' lo sketch completo sia lato Arduino che Processing http://ilblogdidami.blogspot.it/2011/10/arduino-and-processing-serial_03.html

Grazie
« Last Edit: April 02, 2012, 12:19:01 pm by Testato » Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mmm se può esserti d'aiuto, anche io ho avuto problemi con questa comunicazione.
Nel primo esempio che hai citato tu (con lo \n) addirittura non mi funzionava e mi dava molti valori nulli prima che ricevesse il carattere, quindi ho risolto con:
Code:
if ( arduino.available() > 0) {
    val=arduino.readStringUntil('\n');
    if(val!=null){
     altezza=val;
    }   
  }


Poi magari non c'entra niente..
Logged

Rome
Offline Offline
God Member
*****
Karma: 1
Posts: 643
La mia prima bromografata!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

però io mi chiedo, cosa succede quando il valore del potenziometro è proprio 10?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22938
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Potrebbe trattarsi di codifiche di caratteri differenti fra Arduino e Processing?
Invece di quel loop in Processing perché non inizi stampando cosa effettivamente arriva dalla seriale, per capire quando mandi "M" da Arduino il computer cosa riceve e Processing cosa stampa.
Logged


0
Online Online
Faraday Member
**
Karma: 47
Posts: 5961
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

provo subito, grazie dell'intervento  smiley
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22938
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

NaN non è possibile. E' una sigla per indicare che ha ricevuto qualcosa di inintellegibile o un dato non atteso:
http://it.wikipedia.org/wiki/NaN

A tipi di dati siamo a posto? Cioè accetti il dato in una variabile capace di riceverlo?
Logged


0
Online Online
Faraday Member
**
Karma: 47
Posts: 5961
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusa ho cancellato il vecchio post  per errore.

cmq ho messo in piedi uno sketch solo per leggere la seriale ed effettivamente se invio M e poi \n mi leggo in processin 77 e poi va a capo

credo che il problema sia quello che dici tu, dallo sketch processing (anche se non lo usi lo stile e i concetti sono quelli arduinici) non noti nulla ? sara' la variabile MARKER messa ad int ?
ho provato a dichiararla char ma ricevo sempre NaN
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22938
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Secondo me il problema è qui:
Code:
brightness = float(port.readStringUntil(MARKER));
Tu converti la lettura in float. Ma che cosa ottieni da port.readStrinUntil(MNARKER)? Io credo una stringa, lo intuisco dal nome. Trova caratteri non validi e dà quell'errore. Cerchi cioè di convertire "M" in numero  smiley-wink
Logged


0
Online Online
Faraday Member
**
Karma: 47
Posts: 5961
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la cosa strana e' che cmq con \n funziona.

lasciando stare le altre variabili ed anche processing in se', parlando in generale per me sono equivalenti queste due cose

Code:
Serial.print("\n");
Code:
int MARKER =10;

con

Code:
Serial.print("M");
Code:
int MARKER =77;

cioe' i tipi di dati mica li cambio fra il primo e il secondo tipo. eppure se su arduino sparo il "\n" su processing lo intercetto cercando con una int il 10 tutto funge bene.
Mentre se su arduino sparo "M" e su processing con una int cerco 77 non funge piu'  smiley-eek-blue

p.s abbiamo scritto insieme, cmq come vedi anche "\n" e' un numero eppure funziona
« Last Edit: March 27, 2012, 06:19:01 pm by Testato » Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22938
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il carattere "\n" è un carattere particolare, che corrisponde al byte 10. In memoria non viene rappresentato con "\n", sta qui la differenza.
Mentre invece se spedisci "M" e leggi con quella funzione, ti viene restituita una stringa "M". La la "stringa" per "\n" è uno di quei byte che quando stampi spesso appaiono come quadratini vuoti, ma che poi vengono convertiti in numero perché hanno già un valore. Son convinto che otterresti lo stesso risultato spedendo "\r", che corrisponde a 13.
Logged


0
Online Online
Faraday Member
**
Karma: 47
Posts: 5961
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hai colto nel segno, infatti avevo gia' provato con altri caratteri non stampabili, \r, \t, ecc e funzionano tutti.
Non funziona invece con \0 che e' anch'esso non stampabile.

Volevo capire cosa c'e' sotto, parliamo di qualche pilastro informatico che viene dalle telescriventi credo. Hai qualche link per approfondire ?
Perche' purtroppo io continuo a non cogliere il vero motivo, non riesco a comprendre appieno questa tua frase e mi piacerebbe approfondire:
Quote
La la "stringa" per "\n" è uno di quei byte che quando stampi spesso appaiono come quadratini vuoti, ma che poi vengono convertiti in numero perché hanno già un valore

Seconda questione, come posso modificare il codice in modo da farlo funzionare con la "M" ? Ho provato a dichiarare String il marker, ma al compilatore di processing non piace: String MARKER =77;

P.S. Ho aggiunto nel primo post il link completo al codice Arduino+Processing, magari approfitto per farti installare e conoscere processing  smiley
« Last Edit: March 28, 2012, 03:27:28 am by Testato » Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

1. state facendo confusione tra caratteri e stringhe.
Se scrivete "\n" state creando una STRINGA di un carattere, mentre a voi interessa '\n', ovvero IL CARATTERE
(questo lato arduino)

2. perchè lato processing dai tu arbitrariamente il valore? non puoi fare come su arduino?
int MARKER = '\n';
oppure
int MARKER = 'M';

3. non son sicuro ma bufferUntil scarta tutti i dati successivi... se nel momento in cui leggi il buffer, arriva la seconda parte di un dato otterrai un valore sballato perchè la prima parte è stata persa. NON limitare i buffer in alcun modo.

4. port.readStringUntil(MARKER) è ok, dovrebbe bastare usare solo questa. Ma che succede se non è ancora stato letto un carattere di tipo MARKER? bhe che viene restituita un valore NULL, che se provi a convertire in numero è un NaN (not a number, non un numero... tra l'altro sto NaN te lo ritrovi con le divisioni per 0)

quindi:
String ris = port.readStringUntil(MARKER); //leggo il buffer
float a = 0; //inizializzo la variabile risultato
if (ris != null){ //se ho letto qualcosa
   println(ris); //per debug
   a = Float.parseFloat(ris);  //effettuo il parse da String a float, è l'equivalente del tuo float() ma precotto dal java
   println(a); //per debug
   println(); //lascia una riga vuota
}

Quote
però io mi chiedo, cosa succede quando il valore del potenziometro è proprio 10?
i valori del potenziometro non sono spediti "raw", ma convertitti in stringa. Quindi leggerai 3 caratteri: '1', '0', e 'M' (o '\n', dipende da cosa usate)

se volessi leggere i dati RAW è più facile: NON serve il carattere di fine e sai che un int di arduino è 2 byte (attenzione, in java/processing è 4 byte), quindi basta leggere 2 byte e metterli in un int (attenzione al segno! dovete gestirlo voi in base al valore del primo byte letto, del bit più a SX)
certo, se il processing lo fai partire quando arduino già rasmette, non sei in grado di capire qual'è il primo e quale il secondo byte e devi cmq usare il sistema del " valore tappo"

edit: notare la somiglianza della mia soluzione con quella di shorty... ora sa perchè funziona, e perchè otteneva tanti valori null (punto 3 + Serial.available(), cosa che mi son dimenticato )
« Last Edit: March 28, 2012, 03:47:01 am by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Rome
Offline Offline
God Member
*****
Karma: 1
Posts: 643
La mia prima bromografata!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Lesto, avevo aperto ieri un topic con i miei dubbi su questo, ma l'avevo richiuso perchè non mi era chiaro neanche ciò che avevo scritto.
Quindi per far "parlare" Arduino e Processing alla fine conviene usare una stringa. Se devo mandare due numeri 'grandi' li mando cifra per cifra, magari intervallati da uno spazio e utilizzando un carattere di inizio tx e magari anche uno di fine.
Per esempio se dovessi spedire: 478 e 2112 diventerebbe una stringa di 10 caratteri.. se dovessi mandarla in byte, però, potrei usare solo 6 byte, se ne utilizzo 2 per l'inizio trasmissione. dico 2 perchè uno solo non saprei come distinguerlo da uno dei valori da leggere. quindi se mando come inizio trasmissione una sequenza 255,255 sono sicuro che non rientra tra le doppiette di byte dati (in quanto limito il dato ad un numero tipo 10000. che viene: 00100111 00010000 -> quindi il byte alto non potrà mai essere 11111111.
Può funzionare così?

p.s. scusa Testato per l'intromissione, ma magari completa un pò il discorso.

Davide.
Logged

0
Online Online
Faraday Member
**
Karma: 47
Posts: 5961
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie lesto dell'intervento, ma non funziona  smiley

lasciando perdere lo sketch in se', che non mi interessa piu' di tanto, sto' solo tentando di capire questa gestione dei caratteri

se uso Serial.print('\n'); in arduino e int MARKER = '\n'; in processing
tutto funziona

se uso ('M') invece ricevo NaN

Prova tu stesso  smiley
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si, ma cosa ottinei nella terminale di output? ho messo le println() apposta :-)

@dab77: il carattere tappo è un macello, varia dalla situazione.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1] 2 3   Go Up
Jump to: