Ayuda con processing y servo motores


#1

Hola :slight_smile:
estoy haciendo un proyecto para poder controlar unos servo motores con processing y arduino
pero estoy teniendo problemas con algo nuevo que añadi, lo que pasa es que ahora añadí un boton para que no me “ejecute” de golpe las posiciones de los servos si no que primero yo ponga las nuevas posiciones y luego yo oprima el boton para que las ejecute pero aun no se como, alguna idea?
a aqui les dejo mi código

import processing.serial.*;
import cc.arduino.*;
import controlP5.*;
Arduino arduino;
ControlP5 cp5;
PFont font;
Serial port;

Slider Servo1;
Slider Servo2;
Slider Servo3;

Button Boton1;
Button Boton2;
Button Boton3;

void setup()
{
size(950, 900);//Definir el tamano de la pantalla
cp5 = new ControlP5(this);
font = createFont("calibri light bold", 20); // custom fonts for buttons and title

cp5.addButton("Enviar") //"red" is the name of button
.setPosition(650, 125) //x and y coordinat
.setSize(120, 70) //(width, height)
.setFont(font)
;

println(Arduino.list());// Mostrar los puertos COM disponibles
arduino = new Arduino(this, Arduino.list()[0], 57600);//En los corchetes debes introducir el numero del COM empezando de 0,1,2,3 dependiendo los dispositivos que aparescan en la lista
cp5 = new ControlP5(this);

arduino.pinMode(10, Arduino.SERVO);//Definir el pin 2 para la conexion de un servomotor
arduino.pinMode(11, Arduino.SERVO);//Definir el pin 3 para la conexion de un servomotor
arduino.pinMode(12, Arduino.SERVO);//Definir el pin 4 para la conexion de un servomotor
Servo1 = cp5.addSlider("1").setRange(0, 180).setValue(90).setPosition(110, 110).setSize(270, 25).setNumberOfTickMarks(270).setLabelVisible(false).setColorForeground(color(255, 0, 0)).setColorBackground(color(0, 255, 0)).setColorActive(color(0, 0, 255));
Servo2 = cp5.addSlider("2").setRange(0, 180).setValue(90).setPosition(110, 210).setSize(270, 25).setNumberOfTickMarks(270).setLabelVisible(false).setColorForeground(color(255, 0, 0)).setColorBackground(color(0, 255, 0)).setColorActive(color(0, 0, 255));
Servo3 = cp5.addSlider("3").setRange(0, 180).setValue(90).setPosition(110, 310).setSize(270, 25).setNumberOfTickMarks(270).setLabelVisible(false).setColorForeground(color(255, 0, 0)).setColorBackground(color(0, 255, 0)).setColorActive(color(0, 0, 255));
}

void draw()
{
background(color(10, 10, 10));
arduino.servoWrite(10, int(Servo1.getValue()));
arduino.servoWrite(11, int(Servo2.getValue()));
arduino.servoWrite(12, int(Servo3.getValue()));

textSize(50);
text("Panel de control para robot Scara", 100, 75);

textSize(25);
text("Servo1", 20, 125);
text("Servo2", 20, 225);
text("Servo3", 20, 325);

textSize(18);
text("[Pin 2]", 25, 150);
text("[Pin 3]", 25, 250);
text("[Pin 4]", 25, 350);

textSize(25);
text(int(Servo1.getValue())+"°", 390, 130);
text(int(Servo2.getValue())+"°", 390, 230);
text(int(Servo3.getValue())+"°", 390, 330);
}

void red() {
port.write('r');
}

#2

Nota que en setup() has instanciado controlP5 dos veces. Debes remover una de esas lineas.

Veo que en la function red() llamas la function port() pero no veo donde la has inicializado. Creo que no lo necesitas. No tengo experiencia con la libreria de Arduino pero creo que lo que necesitas hacer es quitar port y quitar las siguientes lineas de draw()y las mueves para red() asi:

arduino.servoWrite(10, int(Servo1.getValue()));
arduino.servoWrite(11, int(Servo2.getValue()));
arduino.servoWrite(12, int(Servo3.getValue()));

Kf


#3

Hola! podrías utilizar la función keyPressed() en donde utilices algo como:
if(key == 'a'){//permitir una opcion para ingresar los valores a los servos if(key == ENTER){//para que una vez presiones enter mandes tus valores}}

saludos!