[Risolto] Invio dati da Processing

Vorrei realizzare un programma in Processing che sia in grado di comandare dei motori DC collegati ad Arduino tramite un ponte H.
Negli unici programmi che sono finora riuscito a realizzare in Processing che comunica con Arduino ho utilizzato la libreria "Firmata" sulla scheda, ora se io non volessi utilizzare la libreria Firmata come dovrei fare?
Potreste postarmi un esempio di programma Processing che comunica con Arduino senza la libreria Firmata,così poi da modificarlo alle mie esigenze?Grazie in anticipo per le risposte.

Qui, secondo me, c'e' un ottimo esempio di comunicazione Arduino<->Processing.
L'esempio usa una fotoresistenza.

In generale, su PC, qualsiasi linguaggio che possa ricevere/spedire dati da/sulla seriale va bene.
Logicamente sarai tu a stabilire i dati tra i due e a stabilire cosa significano (praticamente ti crei un tuo "protocollo" di comunicazione, cosa che Firmata ha il suo, non deciso da te).
Esempio da Processing ad Arduino mandi su seriale "led1=on" e vuol dire accendi led numero 1 oppure un comando tipo "L1ON"

Ho scritto il seguente programma in Processing:

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

Arduino arduino;

PFont f;

int switchPin = 2;    // switch input
int motor1Pin = 3;    // H-bridge leg 1 (pin 2, 1A)
int motor2Pin = 4;    // H-bridge leg 2 (pin 7, 2A)
int enablePin = 9;    // H-bridge enable pin
int ledPin = 13;      //LED

void setup() {
  size(500,500);
  background(0);
  f = createFont("Arial",27);
  textFont(f);
  //println(Arduino.list());
  arduino = new Arduino(this, Arduino.list()[0], 57600);
  arduino.pinMode(switchPin, Arduino.INPUT);
  arduino.pinMode(motor1Pin, Arduino.OUTPUT);
  arduino.pinMode(motor2Pin, Arduino.OUTPUT);
  arduino.pinMode(enablePin, Arduino.OUTPUT);
  arduino.pinMode(ledPin, Arduino.OUTPUT);
  
  arduino.digitalWrite(ledPin, Arduino.HIGH);
  delay(1000);
  arduino.digitalWrite(ledPin, Arduino.LOW);
  delay(1000);
  arduino.digitalWrite(ledPin, Arduino.HIGH);
  delay(1000);
  arduino.digitalWrite(ledPin, Arduino.LOW);
  delay(1000);
  }
void draw() {
  arduino.analogWrite(enablePin, Arduino.HIGH);
  background(0);
  fill(255);
  stroke(255);
  rect(200,100,130,75);
  fill(255);
  stroke(255);
  rect(200,325,125,75);
  
  if (mousePressed  && (mouseButton == LEFT) && mouseY < 175 && mouseY > 100 && mouseX < 330 && mouseX > 200) {
    arduino.digitalWrite(motor1Pin, Arduino.LOW);
    arduino.digitalWrite(motor2Pin, Arduino.HIGH);
    println("orario");
    }
  if (mousePressed  && (mouseButton == LEFT) && mouseY < 400 && mouseY > 325 && mouseX < 330 && mouseX > 200) {
    arduino.digitalWrite(motor1Pin, Arduino.HIGH);
    arduino.digitalWrite(motor2Pin, Arduino.LOW);
    println("antiorario");
    }
  }

Secondo il quale il motore se sipreme nel primo rettangolo gira in un verso se si preme nell altro gira nel senso opposto solo che non accade nulla una volta che lancio il programma.
Dove sbaglio?

PS: Su Arduino ho caricato lo sketch di esempio standardFirmata.

@Hertz:
ti pregherei di non aprire 2 thread per lo stesso problema. Stavolta ho fuso insieme le 2 discussioni perché erano iniziate da poco ma la prox volta potrei vedermi costretto a chiuderne/cancellarne una delle due.

OK. Scusa!!
Comunque ho risolto sbagliavo a scrivere:

arduino.analogWrite(enablePin, Arduino.HIGH)

invece di:

arduino.digitalWrite(enablePin, Arduino.HIGH)

Sono riuscito finalmente a scrivere questo programma in Processing:

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

ControlP5 controlP5;
Arduino arduino;
PFont f;

color[] colors = new color[7];
int switchPin = 2;    // switch input
int motor1Pin = 3;    // H-bridge leg 1 (pin 2, 1A)
int motor2Pin = 4;    // H-bridge leg 2 (pin 7, 2A)
int enablePin = 9;    // H-bridge enable pin
int ledPin = 13;      //LED

int valore;

void setup() {
  size(440,360);
  smooth();
  f = createFont("Arial",27);
  textFont(f);
  //println(Arduino.list());
  arduino = new Arduino(this, Arduino.list()[0], 57600);
  arduino.pinMode(switchPin, Arduino.INPUT);
  arduino.pinMode(motor1Pin, Arduino.OUTPUT);
  arduino.pinMode(motor2Pin, Arduino.OUTPUT);
  arduino.pinMode(enablePin, Arduino.OUTPUT);
  arduino.pinMode(ledPin, Arduino.OUTPUT);
  
  arduino.digitalWrite(ledPin, Arduino.HIGH);
  delay(1000);
  arduino.digitalWrite(ledPin, Arduino.LOW);
  delay(1000);
  arduino.digitalWrite(ledPin, Arduino.HIGH);
  delay(1000);
  arduino.digitalWrite(ledPin, Arduino.LOW);
  delay(1000);
  
  controlP5 = new ControlP5(this);
  
  controlP5.addSlider("speed'",0,255,128,30,90,20,200);
  }
void draw() { 
  arduino.digitalWrite(enablePin, Arduino.HIGH);
  background(0);
  stroke(255);
  fill(255);
  text("DC Motor Control",100,40);
  fill(255);
  stroke(255);
  rect(240,70,110,50);
  fill(255);
  stroke(255);
  rect(240,170,110,50);
  fill(255);
  stroke(255);
  rect(240,270,110,50);
  
   if (mousePressed  && (mouseButton == LEFT) && mouseY < 120 && mouseY > 70 && mouseX < 350 && mouseX > 240) {
    arduino.digitalWrite(motor1Pin, Arduino.LOW);
    arduino.digitalWrite(motor2Pin, Arduino.HIGH);
    println("anticlockwise");
    }
  if (mousePressed  && (mouseButton == LEFT) && mouseY < 220 && mouseY > 170 && mouseX < 350 && mouseX > 240) {
    arduino.digitalWrite(motor1Pin, Arduino.HIGH);
    arduino.digitalWrite(motor2Pin, Arduino.LOW);
    println("clockwise");
    }
  if (mousePressed  && (mouseButton == LEFT) && mouseY < 320 && mouseY > 270 && mouseX < 350 && mouseX > 240) {
    arduino.digitalWrite(motor1Pin, Arduino.LOW);
    arduino.digitalWrite(motor2Pin, Arduino.LOW);
    println("stop motor");
    }
  for(int i=0;i<7;i++) {        // loop through colors array
    stroke(255);
    fill(colors[i]);            // use color to fill
  }  
}
void controlEvent(ControlEvent theEvent) {
   if(theEvent.isController()) { 
     if(theEvent.controller().name()=="speed") {
     
    }
  }
}

che mi permette di controllare un motore DC (orario,antiorario e stop). Ho anche implementato la libreria controlP5 che mi permette di creare GUI, così ho creato una slider con la quale dovrei controllare la velocità del motore solo che non so come fare. Qualcuno potrebbe dirmi come devo fare?

Non conosco bene quella libreria, ma da questo esempio (che c'e' nella libreria):
http://www.sojamo.de/libraries/controlP5/examples/controllers/ControlP5slider/ControlP5slider.pde

sembra che il nome del controllo si usi anche per ricevere l'evento quando cambi posizione nello slider:

...
  // add a vertical slider
  cp5.addSlider("slider")
     .setPosition(100,305)
     .setSize(200,20)
     .setRange(0,200)
     .setValue(128)
     ;
...
void slider(float newValue) {
  myColor = color(newValue);
  println("a slider event. setting background to "+newValue);
}

Il parametro dovrebbe essere il valore del range (nell'esempio tra 0-200)

Ho scritto questo sketch ma continua a non funzionare:

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

ControlP5 controlP5;
Arduino arduino;
PFont f;

color[] colors = new color[7];
int switchPin = 2;    // switch input
int motor1Pin = 3;    // H-bridge leg 1 (pin 2, 1A)
int motor2Pin = 4;    // H-bridge leg 2 (pin 7, 2A)
int enablePin = 9;    // H-bridge enable pin
int ledPin = 13;      //LED

int valore;

void setup() {
  size(440,360);
  smooth();
  f = createFont("Arial",27);
  textFont(f);
  //println(Arduino.list());
  arduino = new Arduino(this, Arduino.list()[0], 57600);
  arduino.pinMode(switchPin, Arduino.INPUT);
  arduino.pinMode(motor1Pin, Arduino.OUTPUT);
  arduino.pinMode(motor2Pin, Arduino.OUTPUT);
  arduino.pinMode(enablePin, Arduino.OUTPUT);
  arduino.pinMode(ledPin, Arduino.OUTPUT);
  
  arduino.digitalWrite(ledPin, Arduino.HIGH);
  delay(500);
  arduino.digitalWrite(ledPin, Arduino.LOW);
  delay(500);
  arduino.digitalWrite(ledPin, Arduino.HIGH);
  delay(500);
  arduino.digitalWrite(ledPin, Arduino.LOW);
  delay(500);
  
  controlP5 = new ControlP5(this);
  
  controlP5.addSlider("speed'",0,255,128,30,90,20,200);
  }
 
    
void draw() { 
  arduino.digitalWrite(enablePin, valore);
  background(0);
  stroke(255);
  fill(255);
  text("DC Motor Control",100,40);
  fill(255);
  stroke(255);
  rect(240,70,110,50);
  fill(255);
  stroke(255);
  rect(240,170,110,50);
  fill(255);
  stroke(255);
  rect(240,270,110,50);
  
   if (mousePressed  && (mouseButton == LEFT) && mouseY < 120 && mouseY > 70 && mouseX < 350 && mouseX > 240) {
    arduino.digitalWrite(motor1Pin, Arduino.LOW);
    arduino.digitalWrite(motor2Pin, Arduino.HIGH);
    println("anticlockwise");
    }
  if (mousePressed  && (mouseButton == LEFT) && mouseY < 220 && mouseY > 170 && mouseX < 350 && mouseX > 240) {
    arduino.digitalWrite(motor1Pin, Arduino.HIGH);
    arduino.digitalWrite(motor2Pin, Arduino.LOW);
    println("clockwise");
    }
  if (mousePressed  && (mouseButton == LEFT) && mouseY < 320 && mouseY > 270 && mouseX < 350 && mouseX > 240) {
    arduino.digitalWrite(motor1Pin, Arduino.LOW);
    arduino.digitalWrite(motor2Pin, Arduino.LOW);
    println("stop motor");
    }
  for(int i=0;i<7;i++) {        // loop through colors array
    stroke(255);
    fill(colors[i]);            // use color to fill
  }  
}

void slider(float speed) {
  valore = (int)speed;
  println("a slider event. setting speed to "+speed);
  }

Cioè quando vado a premere i tasti antiorario o orario il motore non si muove. Dove sbaglio?

Il nome del controllo deve essere uguale all'evento:

controlP5.addSlider("slider",0,255,128,30,90,20,200);
...
void slider(int speed) {
  valore = speed;
  println("a slider event. setting speed to "+speed);
  }

Fra l'altro se il parametro è float, vedrai lo slider con le virgole (es. 128.00) se int vedi solo numeri interi (0-255)

Ho fatto come dici tu ma continua a non funzionare.
Cioè quando la slider è a 0 il motore si ferma ma poi se aumento non varia la velocità. Perché?

Dal punto di vista di Processing, non vedo errori. Però ad esempio dentro la nuova funzione dello slider, dovrai farci qualcosa con la velocità.
Per ora la stampi solo a video.

Mi sembra molto utile che alleghi anche lo schema del tuo hardware. Utilizzi due pin per muovere il motore, ma sai come variarne la velocità?
Con quale comando in Arduino? Prima di replicare i comandi Arduino in Processing con la libreria Firmata, hai provato il ponte h e il motore solo con Arduino?

Per muovere il motore usi questo codice, l'hai provato in Arduino (logicamente adattandolo) ?

arduino.digitalWrite(motor1Pin, Arduino.HIGH);
arduino.digitalWrite(motor2Pin, Arduino.LOW);
println("clockwise");

Lo schema hardware che uso è il seguente:
http://scuola.arduino.cc/it/content/controlla-motore-dc-ponte-h-l293d
Prima di replicare i comandi di Arduino in Processing ho provato il ponte H con il motore e per variarne la velocità utilizzavo un potenziometro da 10K collegato sul pin A0 ecco il codice:

const int switchPin = 2;    // switch input
const int motor1Pin = 3;    // H-bridge leg 1 (pin 2, 1A)
const int motor2Pin = 4;    // H-bridge leg 2 (pin 7, 2A)
const int enablePin = 9;    // H-bridge enable pin
const int ledPin = 13;      // LED 
const int potPin = 0;
const int redLED = 12;
const int greenLED = 11;

int potVal = 0;
int potMap = 0;
 
  void setup() {
    // set the switch as an input:
    pinMode(switchPin, INPUT); 
 
    // set all the other pins you're using as outputs:
    pinMode(motor1Pin, OUTPUT); 
    pinMode(motor2Pin, OUTPUT); 
    pinMode(enablePin, OUTPUT);
    pinMode(redLED, OUTPUT);
    pinMode(greenLED, OUTPUT);
    pinMode(ledPin, OUTPUT);
    pinMode(potPin, INPUT); 
 
    // blink the LED 3 times. This should happen only once.
    // if you see the LED blink three times, it means that the module
    // reset itself,. probably because the motor caused a brownout
    // or a short.
    blink(ledPin, 3, 100);
  }
 
  void loop() {
    potVal = analogRead(potPin);                              // Rileva valore potenziometro
    potMap = map(potVal, 0, 1023, 0, 255); 
      // set enablePin high so that motor can turn on:
    analogWrite(enablePin, potMap);
    // if the switch is high, motor will turn on one direction:
    if (digitalRead(switchPin) == HIGH) {
      digitalWrite(redLED, LOW);
      digitalWrite(greenLED, HIGH);
      digitalWrite(motor1Pin, LOW);   // set leg 1 of the H-bridge low
      digitalWrite(motor2Pin, HIGH);  // set leg 2 of the H-bridge high
    } 
    // if the switch is low, motor will turn in the other direction:
    else {
      digitalWrite(greenLED, LOW);
      digitalWrite(redLED, HIGH);
      digitalWrite(motor1Pin, HIGH);  // set leg 1 of the H-bridge high
      digitalWrite(motor2Pin, LOW);   // set leg 2 of the H-bridge low
    }
  }
 
  /*
    blinks an LED
   */
  void blink(int whatPin, int howManyTimes, int milliSecs) {
    int i = 0;
    for ( i = 0; i < howManyTimes; i++) {
      digitalWrite(whatPin, HIGH);
      delay(milliSecs/2);
      digitalWrite(whatPin, LOW);
      delay(milliSecs/2);
    }
  }

In questo modo vedevo una variazione della velocità ben evidente in processing invece non la noto proprio, sembra che sia costante e solo quando arrivo a 0 il motore si ferma. E' solo una mia impressione oppure la velocità è realmente costante?

Prova ad aggiungere la stampa a video della variabile "valore" cosi:

text("DC Motor Control "+valore,100,40);

La variabile valore inoltre all'inizio deve essere inizializzata a 128 come lo slider. Oppure lo slider deve partire da 0.

int valore=128;

A video valore cambia? se si e non la velocità del motore, forse non hai settato il pin giusto?

EDIT: trovato !!!!

Guarda il tuo codice Arduino come lavori con il pin enablePin e guarda come hai scritto il comando in Processing... :grin:

Ecco dove sbagliavo!!!!!

arduino.digitalWrite(enablePin, valore);

invece di:

arduino.analogWrite(enablePin, valore);

Giusto?

Si, con analogWrite() su un pin digitale come il 9 utilizzi il PWM per comandare la velocità del motore (0-255).
Usando digitalWrite() mandi o 0 o 1 (ovvero 255 per il PWM)

Grazie a tutti per gli aiuti!!!!!!