unir vpt, processing, arduino
buenas a todos, les comento que hae unos dias realize un trabajo que consistia en usar la extencion de video trigger videoen vpt para mover 1 sevomotor. la idea del proyecto era simple, acad vez que alguien se hacercaba, una zona se actibaba y colocaba en una posicion en grados el servomotor.
para lograr eso toca unir por OSC el vpt, processing y arduino, debemos tener muy en cuenta que el vpt se conecta directamente con processing mientras que arduino recibe la informacion de processing, (no se conecta vpt con arduino directamente)
El servomor, tiene 3 salidas, polo tierra (color negro), 5v (rojo), y datos (amarillo), en caso de que no sea esos colores, es el mismo orden de oscuro a claro.
para este proyecto pasamos el amarillo del pin 9 al pin 4.
vpt lo deben tener de la siguiente forma.
1: las deben poner en OSC que es la manera en la que va a enviar datos al procesesing.
2: deben poner los nueros que van a enviar al processing cuando activan y desactivan la zona, en esta imagen, el 1, 2, 3, 4, 5, y 6 es cuando la zona esta desactivada, el 10, 20, 30, 40, 50, y 60 es cuando la zona esta activada.
3: la ip que en muchos casos les va tocar cambiar dependiendo del sitio del montaje
deben descargarse unas librerias que se encuentran en el siguiente link. processing-arduino , lo descomprimen y lo guardan en la libreria de processing, y este link que lo descargan y lo guardan en la libreria de arduino. libraries-oscP5
este codigo es el que tienen que poner en processing.
_______________________________________________________________________________
import netP5.*;
import oscP5.*; // Importamos la libreria oscP5
import processing.serial.*;
OscP5 oscP5; // Definimos/creamos un objeto oscP5
boolean primeraVez = true; // Esta variable despliega el títulito de este programa solo una vez.
//
//++++++++++++++++++++++++++ SECCION DE CONFIGURACION
//
Serial myPort;
void setup() {
size(200, 150);
// activa el objeto oscP5, escucha por mensajes entrantes en el puerto 10000
// (o el puerto que se quiera configurar)
myPort = new Serial(this, Serial.list()[1], 9600); //este numero serial puede cambiar.
oscP5 = new OscP5(this, 10000); // el 10000 debe ser el mismo que se encuentre en la ip del video trigger video
background(0); // Color de fondo: negro
}
//
//++++++++++++++++++++++++++ SECCION EN BUCLE (LOOP)
//
void draw() {
// Se dibuja un texto solo como título del programita y solamente una vez
if (primeraVez) {
tituloPrograma();
primeraVez = !primeraVez;
}
}
//
//++++++++++++++++++++++++++ LECTOR DE MENSAJES OSC PROVENIENTES DE VPT
//
void oscEvent(OscMessage elMensajeOSC) {
// Imprime el formato de la dirección y el tipo de daots recividos en el mensaje OSC
// println("### mensaje OSC recibido.");
// print(" addrpattern: "+elMensajeOSC.addrPattern());
//println(" typetag: "+elMensajeOSC.typetag());
//elMensajeOSC.print();
// Extraemos solo el valor númerico del mensaje recibido de VPT
// (el segundo número en la última columna) Ver imagen adjunta
float accionNumero = elMensajeOSC.get(0).floatValue();
//println(accionNumero);
int accionNumeroInt = (int) accionNumero;
println(accionNumeroInt);
if(accionNumeroInt==10){
myPort.write(72);
}
if (accionNumero == 1.0) {// Si el valor recibido es 1.0
accion_01(); // Ejecutar la acción 01... y asi con los demás casos
myPort.write(12);
}else if(accionNumero == 2.0){
myPort.write(22);
accion_02();
}else if(accionNumero == 3.0){
myPort.write(32);
accion_03();
}else if(accionNumero == 4.0){
myPort.write(42);
accion_04();
}else if(accionNumero == 5.0){
myPort.write(52);
accion_05();
}else if(accionNumero == 6.0){
myPort.write(62);
accion_06();
}else {
nada();
}
}
// ////////// // ---------> ACCIONES !
//
// En conexión con VPT Video Trigger
// es posible recibir 6 mensajes provenientes de 6 zonas sensibles
void accion_01() {// Aquí adentro tu pones lo que quieras que pase!
background(50);
text("acción 01 ", 5, 50);
}
void accion_02() {// Aquí adentro tu pones lo que quieras que pase!
background(100);
text("acción 02 ", 5, 50);
}
void accion_03() {// Aquí adentro tu pones lo que quieras que pase!
background(150);
text("acción 03 ", 5, 50);
}
void accion_04() {// Aquí adentro tu pones lo que quieras que pase!
background(200);
text("acción 04 ", 5, 50);
}
void accion_05() {// Aquí adentro tu pones lo que quieras que pase!
background(225);
text("acción 05 ", 5, 50);
}
void accion_06() {// Aquí adentro tu pones lo que quieras que pase!
background(250);
text("acción 06 ", 5, 50);
}
void nada() {// Acción cuando no hay nadie en la zona sensible
background(0);
text("ninguna acción ", 5, 50);
}
void tituloPrograma() {// El título de este programita... solamente una vez!
background(113,39,27);
text("Recibiendo", 5, 25);
text("mensajes OSC", 5, 55);
text("de VPT", 5, 85);
}
____________________________________________________________________________
este codigo es el que deben poner en arduino
_____________________________________________________________________________
#include <Servo.h>
Servo servo1;
int aux=0;
void setup()
{
Serial.begin(9600);
servo1.attach(4);
}
void loop()
{
while (Serial.available()) {
aux =Serial.read();
if(aux==10){
servo1.write(0); //angulo del servo
delay(500); //tiempo de duracion en los grados
servo1.write(200);//angulo del servo
delay(500);//tiempo de duracion en los grados
aux=0;
}
else if(aux==20){
servo1.write(0);//angulo del servo
delay(500);//tiempo de duracion en los grados
servo1.write(360);//angulo del servo
delay(500);//tiempo de duracion en los grados
aux=0;
}
else if(aux==30){
servo1.write(0);//angulo del servo
delay(500);//tiempo de duracion en los grados
servo1.write(360);//angulo del servo
delay(500);
aux=0;
}
else if(aux==40){
servo1.write(0);
delay(2000);//tiempo de duracion en los grados
servo1.write(360);
delay(2000);//tiempo de duracion en los grados
aux=0;
}
else if(aux==50){
servo1.write(0);//angulo del servo
delay(500);//tiempo de duracion en los grados
servo1.write(360);//angulo del servo
delay(500);//tiempo de duracion en los grados
aux=0;
}
else if(aux==60){
servo1.write(0);//angulo del servo
delay(500);//tiempo de duracion en los grados
servo1.write(360);//angulo del servo
delay(500);//tiempo de duracion en los grados
aux=0;
}
}
}
____________________________________________________________________________
si todo sale bien, no deberian tener ningun problema. los grados de los servos y los delay los pueden modificar sin ningun problema.
espero que todo quede muy claro y cualquier cosa me comentan.
para lograr eso toca unir por OSC el vpt, processing y arduino, debemos tener muy en cuenta que el vpt se conecta directamente con processing mientras que arduino recibe la informacion de processing, (no se conecta vpt con arduino directamente)
El servomor, tiene 3 salidas, polo tierra (color negro), 5v (rojo), y datos (amarillo), en caso de que no sea esos colores, es el mismo orden de oscuro a claro.
para este proyecto pasamos el amarillo del pin 9 al pin 4.
1: las deben poner en OSC que es la manera en la que va a enviar datos al procesesing.
2: deben poner los nueros que van a enviar al processing cuando activan y desactivan la zona, en esta imagen, el 1, 2, 3, 4, 5, y 6 es cuando la zona esta desactivada, el 10, 20, 30, 40, 50, y 60 es cuando la zona esta activada.
3: la ip que en muchos casos les va tocar cambiar dependiendo del sitio del montaje
deben descargarse unas librerias que se encuentran en el siguiente link. processing-arduino , lo descomprimen y lo guardan en la libreria de processing, y este link que lo descargan y lo guardan en la libreria de arduino. libraries-oscP5
este codigo es el que tienen que poner en processing.
_______________________________________________________________________________
import netP5.*;
import oscP5.*; // Importamos la libreria oscP5
import processing.serial.*;
OscP5 oscP5; // Definimos/creamos un objeto oscP5
boolean primeraVez = true; // Esta variable despliega el títulito de este programa solo una vez.
//
//++++++++++++++++++++++++++ SECCION DE CONFIGURACION
//
Serial myPort;
void setup() {
size(200, 150);
// activa el objeto oscP5, escucha por mensajes entrantes en el puerto 10000
// (o el puerto que se quiera configurar)
myPort = new Serial(this, Serial.list()[1], 9600); //este numero serial puede cambiar.
oscP5 = new OscP5(this, 10000); // el 10000 debe ser el mismo que se encuentre en la ip del video trigger video
background(0); // Color de fondo: negro
}
//
//++++++++++++++++++++++++++ SECCION EN BUCLE (LOOP)
//
void draw() {
// Se dibuja un texto solo como título del programita y solamente una vez
if (primeraVez) {
tituloPrograma();
primeraVez = !primeraVez;
}
}
//
//++++++++++++++++++++++++++ LECTOR DE MENSAJES OSC PROVENIENTES DE VPT
//
void oscEvent(OscMessage elMensajeOSC) {
// Imprime el formato de la dirección y el tipo de daots recividos en el mensaje OSC
// println("### mensaje OSC recibido.");
// print(" addrpattern: "+elMensajeOSC.addrPattern());
//println(" typetag: "+elMensajeOSC.typetag());
//elMensajeOSC.print();
// Extraemos solo el valor númerico del mensaje recibido de VPT
// (el segundo número en la última columna) Ver imagen adjunta
float accionNumero = elMensajeOSC.get(0).floatValue();
//println(accionNumero);
int accionNumeroInt = (int) accionNumero;
println(accionNumeroInt);
if(accionNumeroInt==10){
myPort.write(72);
}
if (accionNumero == 1.0) {// Si el valor recibido es 1.0
accion_01(); // Ejecutar la acción 01... y asi con los demás casos
myPort.write(12);
}else if(accionNumero == 2.0){
myPort.write(22);
accion_02();
}else if(accionNumero == 3.0){
myPort.write(32);
accion_03();
}else if(accionNumero == 4.0){
myPort.write(42);
accion_04();
}else if(accionNumero == 5.0){
myPort.write(52);
accion_05();
}else if(accionNumero == 6.0){
myPort.write(62);
accion_06();
}else {
nada();
}
}
// ////////// // ---------> ACCIONES !
//
// En conexión con VPT Video Trigger
// es posible recibir 6 mensajes provenientes de 6 zonas sensibles
void accion_01() {// Aquí adentro tu pones lo que quieras que pase!
background(50);
text("acción 01 ", 5, 50);
}
void accion_02() {// Aquí adentro tu pones lo que quieras que pase!
background(100);
text("acción 02 ", 5, 50);
}
void accion_03() {// Aquí adentro tu pones lo que quieras que pase!
background(150);
text("acción 03 ", 5, 50);
}
void accion_04() {// Aquí adentro tu pones lo que quieras que pase!
background(200);
text("acción 04 ", 5, 50);
}
void accion_05() {// Aquí adentro tu pones lo que quieras que pase!
background(225);
text("acción 05 ", 5, 50);
}
void accion_06() {// Aquí adentro tu pones lo que quieras que pase!
background(250);
text("acción 06 ", 5, 50);
}
void nada() {// Acción cuando no hay nadie en la zona sensible
background(0);
text("ninguna acción ", 5, 50);
}
void tituloPrograma() {// El título de este programita... solamente una vez!
background(113,39,27);
text("Recibiendo", 5, 25);
text("mensajes OSC", 5, 55);
text("de VPT", 5, 85);
}
____________________________________________________________________________
este codigo es el que deben poner en arduino
_____________________________________________________________________________
#include <Servo.h>
Servo servo1;
int aux=0;
void setup()
{
Serial.begin(9600);
servo1.attach(4);
}
void loop()
{
while (Serial.available()) {
aux =Serial.read();
if(aux==10){
servo1.write(0); //angulo del servo
delay(500); //tiempo de duracion en los grados
servo1.write(200);//angulo del servo
delay(500);//tiempo de duracion en los grados
aux=0;
}
else if(aux==20){
servo1.write(0);//angulo del servo
delay(500);//tiempo de duracion en los grados
servo1.write(360);//angulo del servo
delay(500);//tiempo de duracion en los grados
aux=0;
}
else if(aux==30){
servo1.write(0);//angulo del servo
delay(500);//tiempo de duracion en los grados
servo1.write(360);//angulo del servo
delay(500);
aux=0;
}
else if(aux==40){
servo1.write(0);
delay(2000);//tiempo de duracion en los grados
servo1.write(360);
delay(2000);//tiempo de duracion en los grados
aux=0;
}
else if(aux==50){
servo1.write(0);//angulo del servo
delay(500);//tiempo de duracion en los grados
servo1.write(360);//angulo del servo
delay(500);//tiempo de duracion en los grados
aux=0;
}
else if(aux==60){
servo1.write(0);//angulo del servo
delay(500);//tiempo de duracion en los grados
servo1.write(360);//angulo del servo
delay(500);//tiempo de duracion en los grados
aux=0;
}
}
}
____________________________________________________________________________
si todo sale bien, no deberian tener ningun problema. los grados de los servos y los delay los pueden modificar sin ningun problema.
espero que todo quede muy claro y cualquier cosa me comentan.
Comentarios
Publicar un comentario