[Arduino 2009 + Firmata] Sfarfallio..

Ciao ragazzi, spero di scrivere nel posto giusto..
Mi è tornata un pò la voglia di smanettare con Arduino, e volevo fare un pò di prove con Processing..
L'avevo già fatto in passato ma ora stavo provando a comandare Arduino tramite il Firmata.
Diciamo che funziona, però ad esempio provando degli sketch di Processing (forniti assieme alla libreria Arduino) dove ad esempio varia il colore di un led RGB in base al movimento del mouse, il led "sfarfalla" fastidiosamente, apparentemente in sincronia con il led TX..

Provando invece con una vecchia versione (presumo v1) di Firmata la cosa non accade, ma così alcuni sketch piu recenti non funzionano regolarmente..

Sbaglio qualcosa? ::slight_smile:

EDIT: facendo altre prove pare che la cosa sia direttamente collegata con la velocità della porta COM.. infatti diminuendo la velocità della porta la situazione peggiora.. :-?

Per la cronaca, ho provato ad utilizzare Firmata di una versione piu vecchia (0018) e lo sfarfallio non si presenta piu.. forse c'è qualche problema con l'ultima versione?

io ho una situazione simile: anche io utilizzo arduino con il firmware "StandardFirmata" ma mi sono fatto un programma per controllare un multiplexer, salvare i dati in un array, controllare solo una posizione di questo array e se maggiore di 512 accendere il led sul pin 13, è un interruttore. solo che il led si accende almeno un secondo dopo che ho chiuso l'interruttore. ho provato a vedere la velocità della firmata e non era a 115 mila ecc ecc, come avevo impostato in processing, quindi l'ho cambiata ma il problema persiste. non ho provato con librerie prese da altre versioni, ma ho comunque un ritorno troppo lento. potrebbe essere la velocità dell'usb, come dicevi tu? in effetti se trasferisco file dal pc alla chiavetta (attaccata alla scheda madre) mi viaggia a 4mb al secondo, e mi sembra un pochetto lenta.

Beh anche se fossero 4Mb/sec credo proprio che per comunicare via seriale siano piu che sufficenti.. non è qualche problema nel codice?

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

int r0 = 0;      //value select pin at the 4051 (s0)   serve per leggere il mux
int r1 = 0;      //value select pin at the 4051 (s1)   serve per leggere il mux
int r2 = 0;      //value select pin at the 4051 (s2)   serve per leggere il mux
int row = 0;     // storeing the bin code   serve per leggere il mux
int count = 0;    // just a count   serve per leggere il mux

byte bin[] = {000, 1, 10, 11, 100, 101, 110, 111}; //pin settings for mux's      serve per leggere il mux
int mux1[] = {0,0,0,0,0,0,0,0}; //scrivo l'array dei valori che mi da il mux1
int mux2[] = {0,0,0,0,0,0,0,0}; //scrivo l'array dei valori che mi da il mux2
int mux3[] = {0,0,0,0,0,0,0,0}; //scrivo l'array dei valori che mi da il mux3
int mux4[] = {0,0,0,0,0,0,0,0}; //scrivo l'array dei valori che mi da il mux4

void setup()
{
  println(Arduino.list());
  arduino = new Arduino(this, Arduino.list()[1], 115200);
  arduino.pinMode(2, Arduino.OUTPUT);
  arduino.pinMode(3, Arduino.OUTPUT);
  arduino.pinMode(4, Arduino.OUTPUT);
  arduino.pinMode(13, Arduino.OUTPUT);
}

void draw()
{
  for (count=0; count<=7; count++)
  {
    row = bin[count];      
    r0 = row & 0x01;
    r1 = (row>>1) & 0x01;
    r2 = (row>>2) & 0x01;
    arduino.digitalWrite(2, r0);
    arduino.digitalWrite(3, r1);
    arduino.digitalWrite(4, r2);
    mux1[count] = arduino.analogRead(0); //con analogRead basta mettere il numero del pin analogico
    //mux2[count] = arduino.analogRead(1);
    //mux3[count] = arduino.analogRead(2);
    //mux4[count] = arduino.analogRead(3);
    delay(1);
    //print(mux1[2]);  
// 3 con potenziometro sulla prima entrata per potenziometri sul mux e pin2 digitale attaccato per primo dal basso
// 2 con interruttore sulla seconda entrata per interruttori sul mux
  }
  //println("");
  
  if (mux1[1] > 255) //se il primo interruttore è acceso, si accende il led
  {
    arduino.digitalWrite(13, Arduino.HIGH);
  }
  else
  {
    arduino.digitalWrite(13, Arduino.LOW);
  }
}

questo in processing, mentre in arduino ho caricato l'esempio "StandardFirmata" con un valore del baudrate (una riga che diceva Firmata.begin ecc) superiore (siccome nelle note all'inizio dello sketch avevo letto che la v2 era più vleoce).
comunque io ho scaricato un "processing-arduino 0017" e l'ho scompattato nella cartella di processing. non è che magari è una libreria un po' vecchia, per cui è lento?
comunquesia siccome 4mb/sec mi sembravano un po' pochi, pensavo che succedesse la stessa cosa con arduino.

lo stesso programma che ho caricato su processing, prima lo caricavo su arduino direttamente, e stampavo i valori sulla seriale: accendevo e spegnevo il led senza problemi, la risposta era immediata.
ora invece, alla stessa velocità, almeno dovrebbe essere così, il led mi risponde molto dopo, e anche i valori che stampo in processing sono lenti

Guarda io purtroppo non sono un grande esperto.. anzi.. sono proprio un principiante..

La differenza sostanziale, e qui spero di non scrivere una castroneria, è che caricando lo sketch direttamente su arduino, il tutto viene eseguito a livello hardware su arduino e quindi piu veloce rispetto all'utilizzo tramite Firmata/Processing che avviene a livello software sul pc e successivamente inviato ad arduino..

Comunque la 0017 è un pò vecchiotta.. perche non provi con una versione piu recente?
Una volta scaricando uno "sketch" Processing, avevo letto su quel sito che proprio la 0017 aveva dei bug quindi ne sconsigliavano l'utilizzo.. tentare non nuoce..

si, solo che non ho trovato altro. su arduino.cc c'era linkata quella libreria per processing. magari cerco nel sito di processing

http://www.arduino.cc/playground/Interfacing/Processing
c'è solo questo! dove potrei trovare una versione della libreria per processing più aggiornata?

no io dicevo piu che altro di provare un "firmware" firmata piu recente.. tu quale hai caricato su arduino? quello della 0017 o l'ultima versione (cioè quella che si trova con l'IDE di Arduino?)

l'ultima versione nell'IDE Arduino 022, però aveva questo "Firmata.begin" on un valore diverso da 115200, più basso. mi sembra 57 mila e qualcosa.
è l'unica cosa che posso ipotizzare per giustificare questa lentezza