Arduino e processing

Mi sapete dire quali sono i “sorgenti minimi” per far inviare dati da Arduino a Processing? E’ indispensabile che su Arduino sia presente l’intera libreria Firmata? O va bene anche questo sorgente?

#include <Firmata.h>

/* analog inputs */
int analogInputsToReport = 0; // bitwise array to store pin reporting
int analogPin = 0; // counter for reading analog pins
/* timer variables */
unsigned long currentMillis;     // store the current value from millis()
unsigned long previousMillis;    // for comparison with currentMillis




void setup() {
    Firmata.setFirmwareVersion(0, 2);
    //Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
   // Firmata.attach(REPORT_ANALOG, reportAnalogCallback);

    Firmata.begin(57600);
    
    pinMode(A0,INPUT);
    digitalWrite(A0,HIGH);
}

void loop() {
   
  if(analogRead(A0)>600) {
    digitalWrite(13,HIGH);
  } else {
    digitalWrite(13,LOW);
  }
  
  
    while(Firmata.available())
        Firmata.processInput();
    currentMillis = millis();
    if(currentMillis - previousMillis > 20) {  
        previousMillis += 20;                   // run this every 20ms
        for(analogPin=0;analogPin<TOTAL_ANALOG_PINS;analogPin++) {
            if( analogInputsToReport & (1 << analogPin) ) 
                Firmata.sendAnalog(analogPin, analogRead(analogPin));
        }
    }  
}

Il codice dovrebbe semplicemente controllare il LED a seconda dello stato del pin analogico A0, e allo stesso tempo inviare il valore di questo pin a Processing, dove gira questo programma:

import processing.serial.*;
import cc.arduino.*;

Arduino arduino;
float myValue;

void setup()
{
println(Arduino.list());
arduino = new Arduino(this, Arduino.list()[3], 115200);
}

void draw()
{
myValue = arduino.analogRead(0);
println(myValue);
}

Ovviamente… non funziona niente. :slight_smile: Cioe’, funziona lo sketch su Arduino che accende e spegne il LED quando serve, ma non capisco come si usa Processing, vedo sempre tutti 0.0 !

infatti il codice processing stampa solo a video.

il codice minimo a lato arduino è:

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

void loop(){
  Serial.prinltn("a");
}

lato processing:

import processing.serial.*;

Serial myPort;

void setup() {
   myPort = new Serial(this, "/dev/ttyACM0", 9600); //"/dev/ttyACM0" è per linux, cambialo a "COM1" o col nome della tua porta seirale
}

void draw(){
    if ( myPort.available() > 0 ){
        print( myPort.readStringUntil('\n') ); //legge una stringa fino al simbolo di "a capo"
    }
}

come puoi notare, i comandi per usare la seriale in processing sono abbastanza simili a quelli di arduino, anzi sono gli stessi più alcune funzioni davvero comode, come quella che ho usato che legge un'intera stringa.

pero' il tuo sorgente fa cose completaente diverse da quello che devo fare io (visualizzare sul PC valori letti da pin analogico)!! Così capisco anche meno di prima... :~

errore mio, nel codice processing bisogna sostituire loop in draw (ora correggo)

jumpjack:
pero’ il tuo sorgente fa cose completaente diverse da quello che devo fare io (visualizzare sul PC valori letti da pin analogico)!! Così capisco anche meno di prima… :~

nel codice arduino basta cambiare la

Serial.println("a");

in

Serial.println( analogRead(A0) );

secondo me non l’hai nemmeno guardato con attenzione il mio codice :slight_smile:

lesto:
secondo me non l'hai nemmeno guardato con attenzione il mio codice :slight_smile:

Veramente nemmeno si compila, il tuo codice... (su Processing)

ora l'ho sistmatao, mancava un >0 su Serial.available()

Stasera lo provo... ma se invece di "stampare" un carattere "stampo" un valore compreso tra 1023... poi cosa leggo?!? :astonished: Mi sa che non va bene.

dato che la parte java legge una riga fino al carattere "\n", ovvero "invio", e visto che arduino stampa il valore + "invio" (println, a differenza di print aggiunge i caratteri "\r\n", ovvero "invio" secondo windows, secondo linux invio è solo "\n", seconda mac "\n\r", ma di questo non ti devi preoccupare) nel terminale di processing leggerai esattamente il valore da 0 a 1023.

Il valor è contenuto in una stringa, per convertirlo in intero puoi fare anzichè

print( myPort.readStringUntil('\n') ); //legge una stringa fino al simbolo di "a capo"
String lettura = myPort.readStringUntil('\n'); //legge una stringa fino al simbolo di "a capo"
try
  {
    int numero = int( lettura );
  }
  catch(NumberFormatException e)
  {
    // questa eccezzione viene sollevata se la lettura NON è un numero
  }

Processing ora compila, ma continua a non stampare un piffero.

Potrebbe dipendere da questo warning?

WARNING:  RXTX Version mismatch
	Jar version = RXTX-2.2pre1
	native lib Version = RXTX-2.2pre2

Il mio codice Prcessing:

  import processing.serial.*;

Serial myPort;

void setup() {
  println("Inizializzo...");
   myPort = new Serial(this, "COM11", 9600); 
   println("Inizializzazione ok.");
}

void draw(){
  println ("Ciclo...");
    if ( myPort.available() > 0 ){
      println("Dati disponibili, stampo:");
        print( myPort.readStringUntil('\n') ); //legge una stringa fino al simbolo di "a capo"
    }
}

no, quel warning è ok.

ma che baud rate hai settato su arduino? su processing hai impostato 9600.

tra l’altro per caso riosservando il codice del post iniziale, hai impostato processing a 115200 baud, e arduino a 57600. ovvio che poi non funziona nulla

lesto:
no, quel warning è ok.

ma che baud rate hai settato su arduino? su processing hai impostato 9600.

tra l'altro per caso riosservando il codice del post iniziale, hai impostato processing a 115200 baud, e arduino a 57600. ovvio che poi non funziona nulla

NO, vabbe', ho fatto vari test, pubblicato sorgenti diversi... Ora ho fatto test con 9600 baud da entrambi i lati dopo aver provato 57600 e 115200, ma non funziona QUASI niente: ieri, miracolosamente, improvvisamente, è comparsa una "A" in processing (Arduino stava stampando infinite "A" sulla seriale), ma... non sono più riuscito a riprodurre il fenomeno. :astonished: Arduino funziona, se apro il serial monitor vedo tutte 'ste AAAAAAAAAAAAAAAAA. Processing funziona, si capisce dai messaggi di debug. Ma non riceve niente sulla seriale, nemmeno con un altro sorgente che al rilevamento di un evento sulla seriale dovrebbe leggerla e stampare quello che vede: non viene rilevato nessun evento.

Possibile che da qualche parte non esista una coppia di sorgenti arduino/processing FUNZIONANTE??? Non lo usa nessuno? Tutta teoria?!?
Boh. :astonished:

prova a usare myPort.read();

Ciao il mio codice scrive sulla seriale, a te serve leggere da quello che ho capito, però è un inizio, comunque nel primo post importi sia arduino.cc (per firmata) che processing.serial, negli esempi successivi solo processing.serial, che non prevede Firmata caricato su Arduino, anche io uso solo .serial Arduino Forum
Ciao..