Salve , fino ad ora sono riuscito a utilizzare un solo servo da processing caricando su Arduino firmata , vorrei commandare 7 servo con processing con il mouse ma non so come scrivere il programma per Arduino ho trovato questa guida sul sito di Arduino Arduino Playground - SingleServoExample è scritta per utilizzare solo 2 servo , vorrei capire il programma per poi andattarla per 7 servo . Grazie
..dai un piccolo sforzo, prova a scriverlo tu il programma ]![]()
Se con quel codice se ne pilotano due, significa che gli strumenti per pilotarne più di 1 ce li hai già. Ti basta solo scalare da 2 a 7.
Ora ci provo
e solo che non capisco la logica del codice da switch() in poi , ci provo :
#include <SoftwareServo.h>
SoftwareServo servo1;
SoftwareServo servo2;
SoftwareServo servo3;
void setup()
{
pinMode(13,OUTPUT);
// servo 1
servo1.attach(2);
servo1.setMaximumPulse(2200);
// servo 2
servo2.attach(4);
servo2.setMaximumPulse(2200);
// servo3
servo3.attach(5);
servo3.setMaximumPulse(2200);
//Seriale
Serial.begin(9600);
Serial.print("Ready");
}
void loop()
{
static int value = 0;
static char CurrentServo = 0;
if ( Serial.available()) {
char ch = Serial.read();
switch(ch) {
case 'A':
//servo1
servo1.attach(2);
CurrentServo='A';
digitalWrite(13,LOW);
break;
case 'B':
//servo2
servo2.attach(4);
CurrentServo='B';
digitalWrite(13,HIGH);
break;
//servo3
servo3.attach(5);
CurrentServo='C';
digitalWrite(13,HIGH);
break;
case '0' ... '9':
value=(ch-'0')*20;
if (CurrentServo=='A')
{
servo1.write(value);
}
else if (CurrentServo=='B')
{
servo2.write(value);
}else if (CurrentServo=='C')
{
servo3.write(value);
}
break;
}
}
SoftwareServo::refresh();
}
/code]
ho utilizzato l esempio che si trova nella cartella della libreria , quello postato sul sito di arduino non funziona !
caricando processing non funziona !
import processing.serial.*;
int gx = 15;
int gy = 35;
int spos=90;
float leftColor = 0.0;
float rightColor = 0.0;
Serial port; // The serial port
void setup()
{
size(720, 720);
colorMode(RGB, 1.0);
noStroke();
rectMode(CENTER);
frameRate(100);
println(Serial.list()); // List COM-ports
//select second com-port from the list
port = new Serial(this, Serial.list()[5], 19200);
}
void draw()
{
background(0.0);
update(mouseX);
fill(mouseX/4);
rect(150, 320, gx*2, gx*2);
fill(180 - (mouseX/4));
rect(450, 320, gy*2, gy*2);
}
void update(int x)
{
//Calculate servo postion from mouseX
spos= x/4;
//Output the servo position ( from 0 to 180)
port.write("A"+spos);
// Just some graphics
leftColor = -0.002 * x/2 + 0.06;
rightColor = 0.002 * x/2 + 0.06;
gx = x/2;
gy = 100-x/2;
}
/code]
dove è che sbaglio ?
Se ho capito bene, tu da processing invii una lettera più un numero (A+spos), ma hai programmato arduino affinchè ti legga il mex della seriale come char (lettera), ma lui riceverà una lettera + un numero. Quindi non penso che funzioni
Devo riprogrammare Arduino affinché legga un numero ? Oppure processing ?
prova a mettere la serial di processing a 9600 come quello di arduino
Ho provato non funziona
in teoria dovresti inviare o solo una lettera (x il servomotore) o solo un numero (x la posizione)
ho provato ora lo sketch su processing 2.1
è sbagliato (probabile che sia per una vecchia versione di processing),
lo ho modificato in qualche modo ora funziona.
arduino :
con libreria softwareservo con l'ide 1.5 non funziona
invece l'esempio che c'è nella cartella example con libreria "servo" funziona anche se non ho provato bene non avendo un servomotore ma un led.
se ci sei ancora ti posto lo sketch processing modificato
nessun errore ! ma non funziona quando muovo il mouse non succede niente ,il servo non si muove e ho notato che il led TX non si accede
ho modificato il post precedente mentre tu rispondevi ![]()
scusa se ho risposto
un po tardi grazie mille ,se puoi postarmelo e se vuoi mi spieghi dove ho sbagliato , come funziona grazie mille ![]()
modificato velocemente..ora non posso spiegarlo, guarda la parte sotto nella finestra nera i valori che invia spostando il mouse, sopra i 90 A +valore, sotto i 90 B+valore
lavoraci un po
import processing.serial.*;
int gx = 15;
int gy = 35;
int spos=90;
Serial port;
void setup()
{
size(720, 720); // dimensione schermo larghezza x altezza
// quindi mouseX avra valore da 0 a 720
colorMode(RGB, 1.0); // tutti i colori fino al massimo 1
noStroke(); // levo colore bordo
rectMode(CENTER); //le misure di inserimento rettangolo anzichè prese dallo spigolo
// in alto a sx come default, viene preso in centro
frameRate(100); //frequenza di aggiornamento
println(Serial.list()); //stampa le porte disponibili
port = new Serial(this, Serial.list()[5], 9600);// baud e numero della lista della porta di collegamento
delay (2000); //tempo che è sempre meglio mettere per dare il tempo alla connessione
}
void draw() // disegno gli oggetti
{
background(0); // sfondo
update(mouseX); // attivo una funzione che si basa sul valore del mouse
fill(1-(mouseX/4 )); // il colore varia in base allo spostamento del mouse, 720 /4 risultato 180
// quindi da destra a sinistra fill (colore dei rettangoli) varia di 180
rect(220, 320, gx*3, gx*3); // disegno rettangolo (coordinate x, coordinate y, larghezza, altezza)
// altezza e larghezza variano in base ai valori di x
// fill( 1-(mouseX/4));
rect(520, 320, gy*3, gy*3); //idem, però y
}
void update(int x) //entro nella funzione "update" per i calcoli che preleva i valori di mouseX e li mette in X
{
spos= x/4; //l'escursione dello schermo dove sposto il mouse sull'asse x è di 720,
//devo spedire ad arduino 180, quindi divido x che è da 0 a 720 per 4, diventa da 0 a 180,
//non so cosa devi fare con il servo o i servi
if (spos>90){ // spostando il mouse da sx a dx quando supera 90 e in poi quindi dal centro, invio
port.write("A"+spos); // una A e il valore da 90 a 180
}
else {
port.write("B"+spos); //se è da 0 a 90 mando una B e il valore da 0 a 90 in base alla posizione del mouse
}
gx = x/6; //gx che lo prendo per variare l'altezza e la larghezza di un rettangolo, varierà in base al valore di x lo divido per sei se no
// diventa gigante o non visibile
gy = 120-x/6; // per l'altro rettangolo, però in negativo e sposto di 120 pixel se no sono fuori schewrmo
println (spos);//stampo per vedere i valori di spos
}
questa è la modifica dell'esempio preso dalla rete
non riesco a testarlo, così dovrebbe funzionare, dimentica gli sketch precedenti
arduino:
#include <Servo.h>
Servo myservo;
void setup()
{
myservo.attach(9);
Serial.begin(9600);
}
void loop()
{
static int val = 0;
if ( Serial.available() > 0) {
char ch = Serial.read();
switch (ch) {
case 'A':
myservo.attach(9);
myservo.write(val);
val = 0;
break;
case '0' ... '9':
val = val * 10 + ch - '0';
break;
}
}
}
processing:
import processing.serial.*;
Serial port;
int spos =0;
void setup()
{
size(720, 720);
println(Serial.list());
port = new Serial(this, Serial.list()[5], 9600);
delay (2000);
}
void draw()
{
background(255); //sfondo bianco
textSize (20); //dimensione testo
strokeWeight (5); //spessore linea
fill (0); //colore nero per testo
spos = mouseX/4; //divido mousex/4 720/4 = 180
text (spos, 350, 400); //text (testo valori (oppure "testo"),coordinate x,coordinate y)
translate (360, 360); //sposto al centro quello che ci sta sotto
rotate (radians(spos)); //ruoto quello che ci sta sotto (converto in gradi con radians e
//muovo con spos che è mousex/4 fatto precedentemente
line (0, 0, - 200, 0); //linea parte dal centro lunga 200, meno perchè 200 pixel a
// sx rispetto lo 0 (centro), line( start coordinate x, start coordinate y, stop coordinate x, stop coordinate y)
port.write("A" + spos);
println (spos);
}
funziona , arriva il segnale e viene anche letto , il servo si muove , ma arrivato a 10 gradi, il servo ritorna come prima .
arduino senza processing,
con questo codice cosa succede?
#include <Servo.h>
Servo myservo;
void setup()
{
myservo.attach(9);
Serial.begin(9600);
}
void loop()
{
myservo.attach(9);
myservo.write(1);
delay (2000);
myservo.write(90);
delay (2000);
myservo.write(179);
delay (2000);
myservo.write(90);
delay (2000);
}
il servo si muove :
1.movimento +90 gradi
2.movimeto +90 gradi
3.movimento -90 gradi
4.movimento - 90 gradi
con questo codice funziona , per utilizzare più servo devo modificare i 2 sketch
import processing.serial.*;
Serial port;
int spos =0;
void setup()
{
size(720, 720);
println(Serial.list());
port = new Serial(this, Serial.list()[5], 9600);
delay (2000);
}
void draw()
{
background(255); //sfondo bianco
textSize (20); //dimensione testo
strokeWeight (5); //spessore linea
fill (0); //colore nero per testo
spos = mouseX/4; //divido mousex/4 720/4 = 180
text (spos, 350, 400); //text (testo valori (oppure "testo"),coordinate x,coordinate y)
translate (360, 360); //sposto al centro quello che ci sta sotto
rotate (radians(spos)); //ruoto quello che ci sta sotto (converto in gradi con radians e
//muovo con spos che è mousex/4 fatto precedentemente
line (0, 0, - 200, 0); //linea parte dal centro lunga 200, meno perchè 200 pixel a
// sx rispetto lo 0 (centro), line( start coordinate x, start coordinate y, stop coordinate x, stop coordinate y)
port.write("A" + spos);
println (spos);
}/code]