This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Espacios interactivos con arduino. Spacebrew IF Lab
#1
[Imagen: ua0m.png]

A petición popular, abrimos un espacio de trabajo colaborativo basado en spacebrew, un servidor para objetos interactivos bajo node.js

Hemos habilitado un servidor de pruebas al que podréis conectaros para testear los ejemplos, lab.interactionfactory.es/demos, y una interface admin para enlazar los objetos, admin interface.

Pero.... que es Spacebrew?
Según sus creadores:

Cita:Spacebrew is an open, dynamically re-routable software toolkit for choreographing interactive spaces. Or, in other words, a simple way to connect interactive things to one another. Every element you hook up to the system is identified as either a subscriber (reading data in) or a publisher (pushing data out). Data is in one of three standardized formats: a boolean (true/false), a number range (0-1023) or a string (text). Once these elements are set up, you can use a web based visual switchboard to connect or disconnect publishers and subscribers to each other.

- Flexible routing & re-routing entre objetos utilizando websockets.
- Una interfaz dinámica que permite cambios y proporciona información en tiempo real.
- Accesibilidad online y contra la red local.
- De código abierto y totalmente gratuito.

Si abrimos cualquier ejemplo, podréis ver como aparecéis conectado a la interface de admin.

Si hay otros usuarios, podréis enlazaros simplemente haciendo click en publisher y en un subscriber y verás como se realiza el enlace.

El pub/sub o publisher subscriber podríamos traducirlo por "el que habla"y "el que escucha", ya que la definición de cliente/servidor no acaba de encajar ya que normalmente se hace de las 2 partes, y lo veremos de forma muy visual.

Hay librerias para processing, arduino, web, js, java etc... por lo que se puede conectar desde muchísimos sistemas y hardware, básicamente si soporta websockets.

Pero vamos a jugar... por donde empezamos?

Si abrimos el admin y no hay nadie, aparecerá en blanco. Cuando abráis un ejemplo, os veréis en esa pantalla con las opciones que publicáis y que escucháis, pudiendo realizar los enlaces.
En los ejemplos, veréis si estáis conectados y el nombre en la parte inferior izquierda.

[Imagen: z0pm.png]

La forma más sencilla es abriendo el ejemplo de string o slider, y unir el pub con el sub.
Solo podréis unir objetos con características iguales, string con string, boolean con boolean etc...

Si conectáis los sliders, y unís el primero con el segundo, veréis como reaccionan, pero lo mejor es que si lo hacéis con otro cliente, moveréis el slider en el navegador del otro usuario :dale2:

[Imagen: cyqk.png]

Podrémos publicar un led, un zumbador (no recomendable xD), un servo etc... y cualquier persona desde cualquier lugar del mundo podrá interactuar con el. Sin apertura de puertos, sin firewall... directamente.
También podréis publicar interacciones sin hardware, como los strings de texto para chat, cambiar el color del fondo del navegador, mover sliders, cambiar imágenes en el navegador etc...

Esto abre un nuevo abanico de posibilidades en cuanto a interacciones, tanto web como físicas.

Si hay interés iremos explicando los ejemplos y mejorándolos entre todos, para poder juguetear Guiño
Los ejemplos los podemos ir colgando en el server para que los tengamos accesibles todos, aunque para probarlos los podéis abrir en local.

Para abrirlos en local, doble clicl en el archivo y cuando lo abra el navegador, añadís después del index.html el siguiente código
Código:
?server=lab.interactionfactory.es&name=LoQueQuieras

el parámetro name es muy importante para que no haya conflictos. Los ejemplos llevan una función para generar un número random para que se conecten sin personalizarlo, pero la gracia está en saber con quien estás conectado.

En los ejemplos esta indicado también como cambiar el nombre Mola

Web del proyecto: spacebrew
Getting Started: docs.spacebrew.cc/gettingstarted/
Ejemplos varios: docs.spacebrew.cc/examples/

En los ejemplos que encontréis por ahí, muchos se conectan al sandbox de spacebrew, pero si añadís el ?server=lab.interactionfactory.es os conectaréis al de la web.

Como intro para hoy, es suficiente. Mañana más :zpalomitas:
  Responder
#2
jajajajaja, batalla campal por el control del slider xD

dejamos frito al ardu, pero aguantó un buen rato en test de stress jajajaja
  Responder
#3
Aun no he podido entrar. A ver si llega el finde y veo el bixo
-> Mi CNC de escritorio CNCDesktop 500 -> https://www.spainlabs.com/foros/tema-Fresadora-Desktop-CNC-500
-> Laboratorio de Fabricación Digital Maker www.lowpower.io 
--> Twitter: https://twitter.com/Grafisoft_ES  | IG: https://www.instagram.com/lowpowerio/
  Responder
#4
Te bajo un poco la luz, que estás consumiendo electricidad.. xD.

Masmola el rollo interacción. Puede dar mucho juego.
  Responder
#5
bastante interesante el tema,

y la inerfaz fisica puede ser cualquiera que tenga acceso a internet? como una raspi o una yun, etc
  Responder
#6
Efectivamente, se puede montar sobre una raspi, ya que funciona sobre node.js a nivel de servidor, y para clientes tienes librerias java, processing etc... Guiño

ahora mismo tengo desactivado el led, estoy peleandome con un rgb ws2801 de 36mm como los de adafruit.
Espero tenerlo listo en un rato Guiño
  Responder
#7
ya entiendo porque le pusiste 3 slider Lengua
  Responder
#8
Me acabo de quedar atorado.... las horas puede que ayuden xD

os pego un sketch de arduino

Código:
#include "FastLED.h"
#include <Bridge.h>
#include <SpacebrewYun.h>

// Definimos el n de leds y los pines de la tira
#define NUM_LEDS 1
#define DATA_PIN 3
#define CLOCK_PIN 13


// Definimos un array para los leds
CRGB leds[NUM_LEDS];

// Definimos y asignamos nombre y descripcion
SpacebrewYun sb = SpacebrewYun("Interaction Led Lamp", "Controla el led ;)");

void setup() {
      Serial.begin(57600);

    // Para debug, espera a que inicies la consola
    delay(4000);
    while (!Serial) { ; }

        //Iniciamos los leds
        FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, GRB>(leds, NUM_LEDS);
    // Iniciamos el bridge
    Bridge.begin();
        // Agregamos los subscribers y asignamos nombre, que se usara como ruta
    sb.addSubscribe("Red", "range");
        sb.addSubscribe("Green", "range");
        sb.addSubscribe("Blue", "range");

    // registramos el string
    sb.onRangeMessage(handleRange);

    // Conectamos a nuestro servidor
    sb.connect("192.168.0.4");
}


void loop() {
    // Abrimos monitor a la espera de datos
    sb.monitor();
}

float convertStringtoFloat(String route)
{
   char cadena[route.length()+1];
   route.toCharArray(cadena, route.length()+1);
   float myFloat = atof(cadena);
   return myFloat;
}


// Se llama cada vez que recibimos un string
void handleRange (String route, int value) {
    // Debug
        Serial.println(route);
        Serial.println(value);
      
        switch (route) {
            case 'Red':
                  leds[0] = CRGB::Red;
          FastLED.show();
                     break;
            case 'Green':
                  leds[0] = CRGB::Green;
          FastLED.show();
                     break;
            case 'Blue':
                  leds[0] = CRGB::Green;
          FastLED.show();
                     break;
            
        }
        }

// Se llama cada vez que recibimos un string
void handleRange (String route, int value) {
// Debug
//Serial.println(route);
//Serial.println(value);

Esto devuelve en el string Red, Green o Blue. ¿Como utilizo ese string para un if o un case para ejecutar los comandos para asignar los colores? Necesito convertir el string, ya que no puedo meterlo en un if directamente, o me he comido algo de sintaxis.

Normalmente uso char o int, pero en este caso no doy con la tecla....

Alguien me echa una mano? xD
  Responder
#9
Seguro que no es la mejor forma, pero funciona xD

Código:
String readString = String(route);
        char buffer[2];
        readString.toCharArray(buffer, 2);
        int nRead= atoi(buffer);
        long nReadLong= atol(buffer);
        unsigned long nReadHex= strtoul(buffer, NULL, 0);
        //Serial.println(nReadHex);
        if (nReadHex == 1) {    
            leds[0] = CRGB::Red;
            FastLED.show();
            }
        else if (nReadHex == 2) {    
            leds[0] = CRGB::Green;
            FastLED.show();
           }
       else {
            leds[0] = CRGB::Blue;
            FastLED.show();
            }
          }
  Responder
#10
Bueno, ya está el rgb listo, aunque por el momento en digital Guiño

Si alguien sabe como utilizar un string de forma fácil en un control de flujo.... ya sea con case, if else o como sea, que se pronuncie ;-P

Estoy haciendo ahora una barra de 40 pixel led RGB, por lo que la fiesta puede ser buena jajajaja
  Responder
#11
no entendí cual es tu problema.

no puedes leer de 0 a 255 en un string?, yo lo divido en 3 partes RGB [2, 5, 5]
y en arduino recibo

RGB [2, 5, 5] // en string, luego lo convierto a decimal y sumo todo
variable = RGB[2]*100+RGB[1]*10+RGB[0]
donde la variable quedaría

variable=255 // en decimal, aki ya lo puedes aplicar al control aanalogo del led de 0 a 255 para 1 color

yo lo haria algo así para los 3 colores
RGB [R,R,R,G,G,G,B,B,B] para que puedas tener de 0 a 255 en cada color en la misma string

nose si es eso a lo que te referias
  Responder
#12
Buenas, esa función me devuelve 2 parámetros, un string con la ruta o slider accionado, y un int con el valor del mismo, pero al intentar hacer un flujo de control con un if no me dejaba por ser un string de texto.

De todas formas, tengo que rehacerlo de nuevo para dejarlo ya ok, ya que tiene mucha guarrada por el medio, aunque funciona ;-P
  Responder
#13
recuerda que un 0 en string es un 42 en decimal si no estoy mal

string = 0
al pasar a decimal sería
dec = string (ya pasado a decimal) - 42
dec = 0

espero haberme hecho entender

EDIT:
stringTexto[050]
aki inicio un ciclo que me encacilla los datos en una variable tipo array

varString [(strinTexto[0]), (strinTexto[0]), (strinTexto[0])]

luego conviertes a decimal cada valor

varString [42, 47, 42]

luego restas el 42 para que te quede el valor deseado en decimal

varString [0, 5, 0]

ahora lo pasas todo a una sola variable tipo int.

varInt= (varString [2]*100)+(varString [1]*10)+(varString [0]*1)
quedaría asi
varInt=(0*100)+(5*10)+(0*1)

varInt=050

ahora ya tienes una variable en decimal y le puedes aplicar las condiciones IF para hacer el control


a mi esto me funcionó, yo tube ese problema que el if no me leia y se volvia loco,
  Responder
#14
Uff, me perdí xD

Podrías ponerme un ejemplo con el código de arriba?

A mi la salida que me da es string X value X . Cambié los nombres de los sliders por números ya que me es mas sencillo luego hacer la conversión, pero seguro que hay una forma mucho más sencilla de como lo estoy haciendo, pero no encuentro nada, y creo que es por que tampoco estoy realizando la búsqueda correcta...

Con los value no tengo problema, pero me lío con que la librería me devuelva la ruta del suscriber en texto. No suelo trabajar con sketch similares, y la verdad es que me ha cogido con la guardia baja jajajaja

Imprimiendo por el serial, me devolvía esto:

Código:
Red
547
Red
465
Green
354

Con el sketch actual, me devuelve ya un número

Código:
1
547
1
465
2
354

Aún tendría que realizar las funciones para el brillo, pero solo es dividir el value / 4 para tenerlo ya listo, por lo que no me preocupa. Sigo buscando para hacerlo de la forma más sencilla y rápida, ya que el sketch recibe muchísimos datos, y a nada que lo cargue de trabajo me lo deja colgado :elrisas: :elrisas: :elrisas:

También es verdad que recibe cada uno de los 1024 comandos cuando se mueve el slider... la consola es una locura. Al slider dándole rápido, lo puedes mover 3 veces de un extremo al otro en 1 segundo, el otro día le dieron una caña al led increible la gente que se conectó Mola
  Responder
#15
Bueno, pues ya está la lampara rgb terminada!!!!

Lámpara web y para conectar, Admin

Ahora a terminar la 3D y hacer una lámpara rgb conectada Guiño

El trozo de la conversión del string no tengo muy claro lo que hace, pero me funciona... aunque estoy seguro de que se puede mejorar. Si alguien le ve otra opción que avise Mola

Código:
//
//  Interaction Factory RGB moonlight for demo
//  InternetOfThings on Arduino yun
//
#include "FastLED.h"
#include <Bridge.h>
#include <SpacebrewYun.h>

// Definimos el n de leds y los pines de la tira
#define NUM_LEDS 1
#define DATA_PIN 3
#define CLOCK_PIN 13

// Definimos un array para los leds
CRGB leds[NUM_LEDS];

// Definimos y asignamos nombre y descripcion
SpacebrewYun sb = SpacebrewYun("Interaction Led Lamp RGB Beta", "Controla el led, ahora RGB ;)");

void setup() {
      //Serial.begin(57600);

    // Para debug, espera a que inicies la consola
    //delay(4000);
    //while (!Serial) { ; }

        //Iniciamos los leds
        FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, GRB>(leds, NUM_LEDS);
    // Iniciamos el bridge
    Bridge.begin();
        // Agregamos los subscribers y asignamos nombre, que se usara como ruta
    sb.addSubscribe("1", "range");
        sb.addSubscribe("2", "range");
        sb.addSubscribe("3", "range");

    // registramos el string
    sb.onRangeMessage(handleRange);

    // Conectamos a nuestro servidor
    sb.connect("lab.interactionfactory.es");
}


void loop() {
    // Abrimos monitor a la espera de datos
    sb.monitor();
}


// Se llama cada vez que recibimos un string
void handleRange (String route, int value) {
      // Debug
      //Serial.println(route);
      //Serial.println(value);
      //hacemos magia con el string...
      //hay que mejorar esto.
        String readString = String(route);
        char buffer[2];
        readString.toCharArray(buffer, 2);
        int nRead= atoi(buffer);
        long nReadLong= atol(buffer);
        unsigned long nReadHex= strtoul(buffer, NULL, 0);
        //Debug
        //Serial.print("salida: ");
        //Serial.println(nReadHex);
        
        //comprobamos el canal de color (route), y le pasamos (value)
        //dividido entre 4 para adaptarla a los 255
        if (nReadHex == 1) {    
              leds[0].r = value / 4;
              //leds[0].g = 0;
              //leds[0].b = 0;
            FastLED.show();
            }
        else if (nReadHex == 2) {    
              //leds[0].r = 0;
              leds[0].g = value / 4;
              //leds[0].b = 0;
            FastLED.show();
           }
       else {
              //leds[0].r = 0;
              //leds[0].g = 0;
              leds[0].b = value / 4;
            FastLED.show();
            }
}
  Responder
#16
disculpa que no te lei antes.

que bueno que ya lo tengas listo, aunque a mi no me funciona Lengua, ya los conecté en la parte del Admin pero nada, quiza lko tengas fuera de servicio, o el LED esta en huelga por tanto maltrato via web LOL.

con respecto al ejemplo para explicarte mejor no lo tengo presente aki, tendria que buscarlo en mi casa y luego te lo muestro.

EDIT: ya pude, conecta despues de mil intentos y todo muy bien, esa lamparita esta kool :zplatano2:
  Responder
#17
Si, no se por que pero si queda mucho tiempo sin nadie conectado no le gusta mucho.... xD

En cambio, si está en uso va perfecto. Tengo que mirar bien el servidor, ya que el sketch es sencillo y no creo que venga de ahí el fallo.

La lámpara es una tarrina de cd con un papel por dentro Guiño
  Responder
#18
si eso vi lo de los CDs y el papel, y me gusta que cuando dejas solo el rojo, parece que fuera a prender en llamas LOL
  Responder
#19
Efecto Candle xD.

Ahora estoy preparando lo mismo, pero llevándolo un paso más alla como siempre.... ;-P

Una barra de 36 Pixel Led RGB, y tendrá un cuarto slider con el que podrás controlar los leds que se encienden, y según lo vas deslizando van encendiendo más leds.

Algo similar a esto:



Eso si, esa ya irá para el despachito, que en la sala me podéis volver loco, o dejarme epiléptico jajajaja
  Responder
#20
jajajaja.

bueno tu eres mago? haces aparecer el dinero? poruqe tienes todos los artilugios que a nosotros nos gustaría tener.

esa plataforma de spacebrew esta muy buena, estoy pensando en comprar una beaglebone black, con esa tambien debe funcioar full verdad?
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  ¿Arduino MEGA o Arduino ADK? igargi 7 3,274 25-08-2013, 04:58 PM
Último mensaje: cansi22