Arduino servo + processing

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 http://playground.arduino.cc/Learning/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 :slight_smile: 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 :astonished:

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]