Componentes
Para controlar la webcam que llevará el BereBere, utilizaremos un motor paso a paso controlado por arduino.
Conexion
Ver: http://altred.net/cgi-bin/moin.cgi/Como-ArduinoPAP
Código
V 0.0
arduino:
1 /* CONTROLA CAMARA
2 * ---------------
3 *
4 * Controla motor paso a paso, para robotizar una webcam
5 * para el BereBere
6 * http://berebere.randomlab.net
7 * Utiliza la libreria Stepper de Tom Igoe
8 * http://www.arduino.cc/en/Tutorial/Stepper
9 *
10 * copyleft 2007 by zea
11 * <http://randomlab.net>
12 * <mailto:zea@randomlab.net>
13 *
14 */
15
16
17 #include <Stepper.h> //llama la libreria Stepper
18
19 int llega = 0;
20 int giro = 1; //guarda la direccion de giro
21 int velocidad = 2; //velocidad del motor
22 Stepper myStepper; //crea una instancia de la libreria
23
24
25 void setup() {
26 myStepper.attach(8,10,11,9); //guarda los pines del stepper
27 Serial.begin (9600); //prepara la comunicacion serial
28 }
29
30 void loop() {
31
32 if (Serial.available() > 0) {
33 giro = Serial.read();
34
35 }
36
37
38
39 myStepper.speed = velocidad; //velocidad del motor
40 myStepper.direction = giro; //direccion del giro
41 Serial.println (giro);
42 myStepper.moveMotor (1); //mueve el motor un paso
43
44
45 }
46
47
p5:
1 /* CONTROLA CAMARA
2 * ---------------
3 *
4 * Controla motor paso a paso, para robotizar una webcam
5 * para el BereBere
6 * http://berebere.randomlab.net
7 *
8 * copyleft 2007 by zea
9 * <http://randomlab.net>
10 * <mailto:zea@randomlab.net>
11 *
12 */
13
14
15 import processing.serial.*; //importa la libreria serial
16
17 Serial puerto; //el puerto serial
18 int direccion;
19
20 void setup(){
21 println(Serial.list()); //imprime la lista de puertos disponibles
22 puerto = new Serial(this, Serial.list()[0], 9600); //se conecta al dispositivo 0 de la lista
23 }
24
25 void draw(){
26
27 }
28
29 void mousePressed() {
30 direccion = int (random (2));
31 println (direccion);
32 puerto.write(direccion);
33 }
34
V 0.1
Controla el motor una cantidad de pasos determinada desde processing. Para la interfaz de P5 utilizo ControlP5 una excelente librería de Andreas Sojamo.
arduino:
1 /* CONTROLA CAMARA
2 * ---------------
3 *
4 * Controla motor paso a paso, para robotizar una webcam
5 * para el BereBere
6 * http://berebere.randomlab.net
7 * Utiliza la libreria Stepper de Tom Igoe
8 * http://www.arduino.cc/en/Tutorial/Stepper
9 *
10 * copyleft 2007 by zea
11 * <http://randomlab.net>
12 * <mailto:zea@randomlab.net>
13 *
14 */
15
16
17 #include <Stepper.h> //llama la libreria Stepper
18
19 int pasos = 0;
20 boolean pas = true;
21 int giro = 1; //guarda la direccion de giro
22 int velocidad = 2; //velocidad del motor
23 Stepper myStepper; //crea una instancia de la libreria
24
25 void mueve(){
26 if (Serial.available() > 0) {
27 giro = Serial.read();
28 }
29
30 myStepper.speed = velocidad; //velocidad del motor
31 myStepper.direction = giro; //direccion del giro
32
33 if (Serial.available() > 0 ){
34 pasos = Serial.read();
35 if (pasos > 10){
36 myStepper.moveMotor (pasos); //mueve el motor los pasos enviadospor serial
37 }
38 }
39 }
40
41 void setup() {
42 myStepper.attach(8,10,11,9); //guarda los pines del stepper
43 Serial.begin (9600); //prepara la comunicacion serial
44 }
45
46 void loop() {
47 mueve();
48 }
49
p5:
1 /* CONTROLA CAMARA
2 * ---------------
3 *
4 * Controla motor paso a paso, para robotizar una webcam
5 * para el BereBere
6 * http://berebere.randomlab.net
7 *
8 * copyleft 2007 by zea
9 * <http://randomlab.net>
10 * <mailto:zea@randomlab.net>
11 *
12 */
13
14
15 import processing.serial.*; //importa la libreria serial
16 import controlP5.*; //importa la libreria controlP5
17
18 Serial puerto; //el puerto serial
19 int direccion;
20
21 //variables para el gui
22 int Color = color(0,0,0);
23 int botonDer = 1;
24 int botonIzq = 1;
25 int slider = 11;
26 ControlP5 controlP5;
27
28 void setup(){
29 //dibuja el gui
30 size(400,400);
31 controlP5 = new ControlP5(this);
32 controlP5.addButton("Derecha",1,100,160,80,20);
33 controlP5.addButton("Izquierda",0,100,190,80,20);
34 controlP5.addSlider("Cuanto",11,199,100,200,180,100,10);
35
36 println(Serial.list()); //imprime la lista de puertos disponibles
37 puerto = new Serial(this, Serial.list()[0], 9600); //se conecta al dispositivo 0 de la lista
38 }
39
40 void draw(){
41 background(Color);
42
43 }
44
45
46 void Derecha(int Valor) {
47 botonDer = Valor;
48 puerto.write(Valor);
49 println("Derecha"+ Valor);
50
51 }
52
53 void Izquierda(int Valor2){
54 botonIzq = Valor2;
55 puerto.write(Valor2);
56 println("Izquierda" + Valor2);
57 }
58
59 void Cuanto(int pasos){
60 slider = pasos;
61 puerto.write(pasos);
62 println("mueve_" + pasos + "_pasos");
63 }
64
Toma Foto
resumen: toma una foto cuando se presiona un boton
La idea es la siguiente: la imagen de la webcam esta siendo recibida en PD que esta esperando un mensaje vía OSC para guardar una foto en /tmp. Este mensaje es procesado y enviado por P5 quien recibe mensajes por el puerto serial enviados por Arduino quien a su vez esta leyendo el estado de un boton.
Arduino:
1 /* Lee Boton Para Tomar Foto en PD
2 * ---------------
3 *
4 * Lee un boton en un puerto digital
5 * manda la info a P5 quien envia un
6 * mensaje a PD via OSC para tomar una
7 * foto.
8 *
9 * copyLeft 2007 by zea
10 * <http://randomlab.net>
11 * <mailto:zea@randomlab.net>
12 *
13 */
14
15 //variables para guardar el pin y
16 //el estado del boton
17 int boton = 8; //pin del boton
18 int botonVal = 0;
19
20 int TomaFoto=100;
21
22 void setup(void) {
23 pinMode(boton, INPUT); //Declara el pin como entrada
24 Serial.begin(9600);
25 }
26
27 void LeeBoton(){
28 botonVal = digitalRead(boton); //lee el boton y guarda su estado
29
30 //Si el boton esta presionado envia el mensaje
31 if (botonVal == HIGH){
32 Serial.println(TomaFoto);
33 }
34 }
35
36 void loop(void) {
37 LeeBoton();
38 }
P5:
1 /**
2 * Lee el serial buscando un 100
3 * y envia mensaje por OSC
4 * para guardar una foto en PD
5 * Gabriel Zea zea@randomlab.net
6 * Usa la libreria:
7 * oscP5 website at http://www.sojamo.de/oscP5
8 */
9
10 //importa librerias
11
12 import oscP5.*;
13 import netP5.*;
14 import processing.serial.*;
15
16 //variables OSC
17 OscP5 oscP5;
18 NetAddress DireccionIP; //Direccion IP de envio
19 int puerto = 1958; //puerto de conexion
20
21 //variables serial
22 Serial puertoSerial; //el puerto serial
23 int llegaSerial;
24
25 void setup() {
26 oscP5 = new OscP5(this,puerto); //inicia oscP5 para recibir mensajes en el puerto 1958
27 DireccionIP = new NetAddress("127.0.0.1",1958); //Direccion y puerto de envio
28
29 println(Serial.list()); //imprime la lista de puertos disponibles
30 puertoSerial = new Serial(this, Serial.list()[0], 9600); //se conecta al dispositivo 0 de la lista
31 }
32
33
34 void draw() {
35 background(0);
36
37 while (puertoSerial.available() > 0) {
38 llegaSerial = puertoSerial.read();
39 }
40
41 if (llegaSerial == 100) {
42 enviaOSC();
43 }
44
45 }
46
47 void enviaOSC() {
48 OscMessage mensaje = new OscMessage("/foto"); //crea el mensaje con la cabecera foto
49 mensaje.add("bang"); //agrega "bang" al mensaje
50 oscP5.send(mensaje, DireccionIP); //envia el mensaje
51
52 }
53
54
55
PD: