Comunicación entre Android / Rasperry PI para comandar arduino

Hola,
llevo más de 1 año liao con ducumentación y aún sigo sin decidir la forma de comunicación para hacer un servidor domótico en casa.
La idea es la siguiente: APP Android->RasperryPI->Arduino
¿ Podríais ayudarme en saber cúal es la opción más adecuada para dar ordenes al Arduino desde Android pasando por el servidor en la RPI ?.
Mediante sockets TCP entre Android/RPI
Mediante sockets UDP entre Android/RPI
Mediante cliente servidor PHP entre Android/RPI

Alguien tiene experiencia en el tema y me puede orientar ? :roll_eyes:

Muchas gracias.

Saludos

Buenas,

Si lo que quieres es controlar un único Arduino a través del USB, yo usaría Firmata Arduino Playground - Firmata

Si lo que quieres es controlar un conjunto de Arduinos, primero, conectaría a la Raspberry una antena de las baratas para comunicación inalámbrica, la NRF24L01 se puede encontrar en Ebay muy barata. Luego con este sistema me podría comunicar con cualquier Arduino por la casa sin necesidad de cables y a bajo coste (menos incluso que un xbee). De esta manera ya no tienes que tocar el servidor físicamente en el futuro y no tienes 300 conexiones a los GPIO de la rPi que, dentro de lo que cabe, son sólo a 3.3v y no están protegidos de ninguna manera.

Luego montaría un servidor REST de operaciones para el arduino dentro de la Raspberry pi (si te manejas con PHP, Slim framework podría ser una opción sencilla, rápida y ligera).

Por ejemplo el servicio para encender y apagar luces podría ser: http://miServidor.local/conmutar-luz que lo que haría sería ejecutar en segundo plano un script que se comunicaría con el arduino correspondiente para ejecutar la acción (obviamente el arduino correspondiente debe tener también una antena NRF24L01 para recibir datos y un identificador único, ya que la recepción va a ocurrir en todos los arduinos que tengan una antena en la misma frecuencia).

Es bastante sencillo, lo único que es un poco largo de hacer.

Espero haberte podido orientar un poco

Muchas gracias por tu explicación. Me has ayudado bastante sobre todo con lo del protocolo Firmata que lo desconocía. Lo malo es que el protocolo parece que requiere USB, aunque hay gente que está trabajando en sacarle interfaz WIFI que sería más interesante para lo que necesito.

Lo dicho, gracias
Saludos

He estado dando una vuelta al tema de hacer el servidor REST de la RaspBerry con PHP devolviendo los JSON al cliente Android, pero para el tema de la domótica ocurre un aspecto a tener en cuenta . Supongamos que cuando se da una orden desde el cliente (POST) obtenemos una respuesta normalmente mediante JSON y actualizamos los parámetros (por ejemplo subo persiana al 50%); si desde otro cliente inmediatamente se baja la persiana al 100% no es posible actualizar en tiempo real, es decir que el servidor REST comunicara al cliente sobre un cambio de estado. ¿ Esto es posible ?

Gracias de nuevo.

Saludos

Podrías pero requiere montar un servidor de notificaciones PUSH, lo cual creo que sería inmensamente mas complejo, sobre todo teniendo en cuenta el alcance de tu proyecto.

La manera lógica de hacerlo sería haciendo que los arduinos manden mensajes de estado constantemente cada ciertos segundos al servidor de la rPi y que esta los guarde en una BDD o en alguna web tipo xively. Luego desde el Android podrías ver cual fue el último mensaje de estado para qué Arduino.

El problema de esto es que los Arduinos van a necesitar una manera de saber en que estado se encuentran. Para el ejemplo de la persiana tendrías que poner algún tipo de encoder en la tira de la persiana, por poner un ejemplo.

Todo dependerá del alcance y complejidad que le quieras dar al proyecto.

Gracais Loctar, tienes razón, montando alguna lógica PUSH podría notificar en sentido servidor-> cliente, aunque no sé si eso sería lo más eficiente.
La cuestión es que desde el smartphone una vez que se actulice estado, la tablet de casa también debe actualizar el estado automáticamente, así como el smartphone de otra persona que esté conectada al sistema domótico. En esencia, es como implementr un chat donde se actulice en tiempo real en todos los clientes conectados al servicio (la rPI). He estado dando vueltas a implementar:

  1. sockets TCP entre Android - PHP Server, pero me da mucha guerra a la hora del trasiego de información, he montado un server PHP en linux (Ubuntu) y cliente Android, y el paso de strings bidireccional me da ciertos problemas.

  2. sockets entreTCP entre Android - JAVA Server. En este caso lo he probado igual que el anterior, va mucho mejor, el sochet se mantiene estable y el paso de strings va OK

  3. servicio Websocket entre Android - Node JS (es de lo mejor que podría implementar ya que Node va muy bien para tiempo real)

  4. Servicio WebSocket entre Android - PHP Server (no lo he probado y no he visto mucha documentación al respecto, así que lo descarto)

Desde luego que un server RESTfull en la rPI con cliente Android es de lo más fácil y útil, pero hacer PUSH es vital para mi desarrollo, así que me queda bastante por estudiar. Implementar algo similar a Long Pooling como se hace en AJAX pudiera ser otra opción. :frowning:

Saludos