Salve a tutti,
vi spiego brevemente cosa vorrei fare: con processinng vorrei accendere un led su arduino (per iniziare a capire come comunicare tra loro).
Come ho letto sul web, ho scaricato la libreria su processing, e quando la importo me ne importa due:
import org.firmata.*;
import cc.arduino.*;
successivamente come ho letto sul sito di arduino ho scritto questo seplice codice:
import processing.serial.*;
import cc.arduino.*;
println(Arduino.list());
senza pero importare la libreria firmata, che non so cosa sia, ma sullo schermo che esce non mi scrive nulla. La mia arduino UNO e sulla COM5 e penso che processing pensi che sia sulla COM1, come fgaccio a dirglielo??
Grazie =)
Firmata è un programma (sketch) che devi caricare su Arduino.
Il Firmata su Arduino riconosce i comandi da Processing che manderai attraverso la seriale ad Arduino (praticamente comandi che si basano sul protocollo Firmata)
Quel comando:
println(Arduino.list());
serve solo per avere un elenco delle porte seriali. Così puoi capire quale scegliere.
http://playground.arduino.cc/Interfacing/Processing
Instruction, punto 5 lo dice chiaramente (ma in inglese)
okay, quindi devo caricare su arduino la libreria firmata?? (per quello che ho capito, se sparo scemate correggimi XD )
e come faccio a dire a processing che la seriale e la com5 e non la com1? Non serve dirglielo??
Grazie =)
Si, devi caricare Firmata su Arduino.
Per la porta devi usare il comando:
arduino = new Arduino(this, Arduino.list()[0], 57600);
Ma quello zero nella quadra, indica il primo elemento della lista. Tu devi indicare il numero dell'elemento giusto.
Da ma su mio pc, elemento 0 = COM1 che è la seriale fisica e non la porta usb
Potresti anche mettere (non sono sicuro):
arduino = new Arduino(this, "COM1", 57600);
naturalmente metti la com numero giusta da te
okay quindi per esempio su processing avvio questo codice:
import org.firmata.*;
import cc.arduino.*;
import processing.serial.*;
Arduino arduino;
int ledPin = 9;
void setup()
{
println(Arduino.list());
arduino = new Arduino(this, Arduino.list()[1], 57600);
arduino.pinMode(ledPin, Arduino.OUTPUT);
}
void draw()
{
arduino.digitalWrite(ledPin, Arduino.HIGH);
delay(1000);
arduino.digitalWrite(ledPin, Arduino.LOW);
delay(1000);
}
e su arduino questo?
#include <Boards.h>
#include <Firmata.h>
void setup(){}
void loop(){}
per non si accende il led collegato al pin 9 =(
Quasi. Su Arduino devi caricare il firmware o sketch Firmata. Lo trovi fornito assieme all'IDE Arduino.
File->Esempi->Firmata->StandardFirmata.
okay, adesso lo caricato su arduino... Ce un codice lunghissimo, che devo fare?
Per Processing avevo questo esempio, a video un quadrato per tutti i pin digitali, li accendi/spegni con il mouse:
import processing.serial.*;
import cc.arduino.*;
Arduino myArduino;
color off = color(4, 79, 111);
color on = color(0, 205, 0); // Red Green Blue
int[] values = { Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW,
Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW,
Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW };
void setup()
{ size(470, 200);
//println(Arduino.list()); myArduino = new Arduino(this, Arduino.list()[0], 57600);
myArduino = new Arduino(this, "COM4", 57600);
for (int i = 0; i <= 13; i++)
{ myArduino.pinMode(i, Arduino.OUTPUT);
}
}
void draw()
{ background(off);
stroke(on);
for (int i = 0; i <= 13; i++)
{ if (values[i] == Arduino.HIGH)
{ fill(on);
}
else
{ fill(off);
}
rect(420 - i * 30, 30, 20, 20);
fill(200);
text(i, 420 - i * 30,13);
}
}
void mousePressed()
{ int pin = (450 - mouseX) / 30;
if (values[pin] == Arduino.LOW)
{ myArduino.digitalWrite(pin, Arduino.HIGH);
values[pin] = Arduino.HIGH;
} else
{ myArduino.digitalWrite(pin, Arduino.LOW);
values[pin] = Arduino.LOW;
}
}
Federico99:
okay, adesso lo caricato su arduino... Ce un codice lunghissimo, che devo fare?
In che senso? Nulla. Quel codice lo hai caricato su Arduino e quel codice si incarica di capire i comandi che spedisci da Processing attraverso l'oggetto Arduino.xxxx
quindi in conclusione (spero mi funzioni)
su arduino carico lo sketch "standard firmata" e lo carico sull arduino UNO senza cambiamenti giusto?
, e su processing carico quello che mi hai postato, scrivendo 1 al posto di 0 nell array arduino list, e devo ancora cambiare qualcosa, perche non funziona?
Si esatto. Anche il tuo esempio va bene, solo che a video non mostri nulla su PC.
Questo io lo cambierei usando direttamente la COMx giusta (presumo da te sia COM2):
arduino = new Arduino(this, "COM2", 57600);
Processing di solito usa quell'array perchè su Linux le porte hanno un altro nome.
yuppieee funziona!!
Grazie mille, da solo non ce l avrei mai fatta =)
Nella draw() del mio esempio sopra, ho messo anche i numeri dei pin.