¿Cuáles son mis opciones para protocolos de red TCP / IP establecidos para usar entre arduino (c ++) / ruby?

Como descargo de responsabilidad, no soy ni un experto en Ruby ni un experto en Arduino (creo mis propios tableros ATMega, así que me salto ese nivel de abstracción).

Soy parcial al protocolo Modbus para cualquier comunicación simple de nivel bajo maestro / esclavo. Completamente abierto, muy fácil de implementar, y tiene mucha historia y soporte de la industria, y muchas herramientas gratuitas para probar su unidad. En comparación con la mayoría de los protocolos, tiene una sobrecarga muy baja y, sin embargo, incluye una forma de validar la integridad del mensaje. Se basa en la lectura y escritura de registros de 16 bits, que pueden contener cualquier tipo de datos que desee (aunque un entero de 16 bits sin signo es el valor predeterminado). En su caso, lo más probable es que el número de registro sea el selector de motor paso a paso y el valor de registro sea int16_t.

Una búsqueda rápida en la web muestra que ya hay implementaciones de Modbus para Ruby y Arduino. Tenga en cuenta que Modbus es un protocolo de sondeo diseñado para un maestro y varios esclavos, por lo que si desea que Arduino inicie la comunicación, debería ser el maestro, y el servidor Ruby debería ser el esclavo, con alguna forma de ejecutando múltiples instancias para manejar diferentes maestros que intentan conectarse.

De lo contrario, dado que ya está haciendo TCP / IP y, por lo tanto, tiene los beneficios de todas las pilas de bajo nivel que se ocupan de usted, un simple programa de socket personalizado que envíe 2 enteros y reciba un mensaje OK será suficiente.

Otro protocolo popular en Arduino parece ser Firmata. No lo he usado antes, pero parece que podría hacer lo que quieras.
http://firmata.org/wiki/Main_Page

Así que seguí adelante y creé mi propio protocolo realmente simple en su lugar … usando binario simple … funciona como un encanto:

module EchoServer def post_init puts "-- someone connected to the echo server!" id = 5; steps = 50; trans = [id,steps].pack('CS') send_data trans puts trans.length puts trans.unpack('CS') end end 

Esto utiliza la función Ruby Array # pack, y luego una simple lectura en el extremo arduino (versión optimizada del ejemplo de arduino ethernet “cliente web”):

  bucle vacío ()
 {
   if (client.available ()> = 3) {// char stepperID int y una rotación de 2 bytes    
     id de char = client.read (); 
     int pasos = client.read () |  (client.read () << 8);
     Serial.println (id);
     Serial.println (pasos);
     if (id == 5) {
       myStepper.step (pasos);
     }
   }

   // si el servidor está desconectado, detenga el cliente:
   if (! client.connected ()) {
     Serial.println ();
     Serial.println ("desconectando");
     client.stop ();
     para(;;);
   }
 }