Arduino servo + processing

non ho trovandolo in rete, la parte processing te la ho preparata...molto scarna e se vuoi migliorabile.
per la parte arduino provaci, non so neanche io se così può funzionare

import processing.serial.*;  
Serial port;          
int spos =0;
int spos2 =180;
int spos3;
int muovoSX;
int muovoDX = 360;
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

  text (spos, 180, 400);  //text (testo valori (oppure "testo"),coordinate x,coordinate y)
  text (spos2-180, 540, 400);  //text (testo valori (oppure "testo"),coordinate x,coordinate y)

  rect (0, 450, 720, 50);//  rettangolo nero
  fill( 255, 0, 0); //colore rosso

  rect (360, 450, 10, 50); //piccolo rettangolo divisione
  rect (muovoDX, 450, 10, 50);//  piccolo rettangolo a dx che si muove con il mouse
  rect (muovoSX, 450, 10, 50); //  piccolo rettangolo a sx che si muove con il mouse

  spos3 =spos2-180; //la parte a sx il mouse va da 360 fino a 720...devo togliere 180 per calibrare

  if (mouseX > 0 && mouseX < 360 && mouseY > 450 && mouseY < 500 && mousePressed) { //se clicco e muovo all'interno del rettangolo nero a dx
    muovoSX= mouseX; //muovosx fa quello che fa il mousex
    spos = mouseX/2;//divido mousex/2 720/2 = 360 l'escursione totale 
    port.write("A"+spos);//invio ad arduino quando clicco e muovo
  }

  if (mouseX > 360 && mouseX < 720 && mouseY > 450 && mouseY < 500&& mousePressed) {//se clicco e muovo all'interno del rettangolo nero a sx
    muovoDX= mouseX;//muovodx fa quello che fa il mousex
    spos2 = mouseX/2 ; //divido mousex/2 720/2 = 360, l'escursione totale
    port.write("B"+spos3); // invio ad arduino quando clicco e muovo
  } 
  translate (180, 360); //sposto al centro quello che ci sta sotto

  ///////////////////
  pushMatrix(); // pushMatrix inizia, popMatrix finisce, serve per racchiudere in una nuova tela, se no tutto il restante codice ruota
  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, - 100, 0); //linea parte dal centro lunga 100, meno perchè 200 pixel a
  // sx rispetto lo 0 (centro),  line( start coordinate x, start coordinate y, stop coordinate x, stop coordinate y)
  popMatrix();
  //////////////////////

  translate (360, 0);
 
  /////////////////////
  pushMatrix(); // pushMatrix inizia, popMatrix finisce, serve per racchiudere in una nuova tela, se no tutto il restante codice ruota
  rotate (radians(spos2)); //ruoto quello che ci sta sotto (converto in gradi con radians e 
  //muovo con spos che è mousex/4 fatto precedentemente
  line (0, 0, 100, 0); //linea parte dal centro lunga 100, 100 pixel a
  // dx rispetto lo 0 (centro),  line( start coordinate x, start coordinate y, stop coordinate x, stop coordinate y)
  //differente a quella precente per il mousex che si trova dalla metà alla fine
   popMatrix();
  //////////////////////

  print (spos); //debug
  print ("  "); //debug
  println (spos3); //debug
}

ho modificato il programma per due servo e funziona con il mouseX muovo un servo con il mouseY un altro :

#include <Servo.h>
Servo myservo;
Servo myservo1;
void setup()
 {
  myservo.attach(9);
  myservo1.attach(6);
  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;
        case 'B':
         myservo1.attach(6);
        myservo1.write(val);
        val = 0;
        break;
      case '0' ... '9':
        val = val * 10 + ch - '0';
        break;
    }
  }
}/code]

bene :slight_smile:
se vuoi si potrebbe provare a migliorare facendo girare le lancette di processing da arduino e non da processing stesso,
così è sicuro che arduino ha ricevuto i dati, quindi la posizione sicura.

import processing.serial.*;  
Serial port;
int spos1 = 0;
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)

 
    spos1 = mouseY/4;
 
 
 port.write("A" + spos1);
  port.write("B" + spos);
   port.write("C" + up);
   port.write("D" + up1);
   //port.write("G" + up2);
} int up , up1 ,up2 = 0;
  
 

    void mouseWheel(MouseEvent event) {
  float e = event.getCount();
  float c = event.getCount();
  if(e>0 && mousePressed && mouseButton == RIGHT){
    up = up+10;
  }if (e<0 && mousePressed && mouseButton == RIGHT) {
    up = up-10;
  
    
    
  
    
    
    
    
    // forchetta
    }else if(e>0 && mousePressed && mouseButton == LEFT){
    up1 = up1+10;
  
    }else if(e<0 && mousePressed && mouseButton == LEFT){
    up1 = up1-10;
    }
  
 //limiti up 
 
 if(up > 180){
   up = 180;
 }if (up <0 ){
   up = 0;
 }
 
 
 // limiti up1
 
 if(up1 > 180){
   up1 = 180;
 } if (up1 <0 ){
   up1 = 0;
 }
 
   
   
   

      // limiti up2
 if(up2 > 180){
   up2 = 180;
 } if (up2 <0 ){
   up2 = 0;
 }

    
    }

questo è il codice processing , i servo vengono comandati da un mouse , hanno un movimento rabbioso , lo hanno tutti tranne i servo che vengono comandati dalla rotellina del mouse, ho provato a utilizzare un alimentazione esterna da 6v ma niente .

prova fare una cosa del genere

 int dato = 0;
 if (dato< spos){
    dato++;
    }
       if (dato> spos){
    dato--;
    }

e spedisci "dato" anzichè spos
così non salta ma fa tutti i cicli

salve , anche io sto provando ad usare processing per comandare dei servi.
ho un problema con la seriale (in processing, su arduinofunziona tutto) penso.
mi da sempr eerrore: ArrayIndexOutOfBound appena cerco di creare l'oggetto seriale: es port = new Serial(this, Serial.list()[5], 9600);
non capisco come uscirne. mi dareste una mano per cortesia?

al posto del "5" devi mettere il numero della lista corrispondente alla porta di arduino,
lo vedi sotto nella parte debug di processing quando avvii lo sketch.

se non è elencata una lista ma solo una sequenza di porte, la prima è 0 (es,COM1) poi 1 ecc..

oppure puoi fare al posto di
port = new Serial(this, Serial.list()[5], 9600);
fare, se la porta di arduino è la 3
port = new Serial(this, "COM3", 9600);

il monitor seriale di arduino deve essere spento

Se vuoi vedere quali seriali ci sono

void setup(){
       println(Serial.list());
}

grazie, avevorisolto mettendo"COM3", il programma però doveva trovare lui la cam giusta, senza che io gli e lo dicessi con quel codice no?
come si può ovviare se cambia la com libera?