Llegó el momento de conectar los dos módulos de software que he estado preparando: el controlador de servos de arduino y un programa ruby para detectar la presencia online de un usuario.
Para enviar mensajes por el puerto serie desde un programa ruby, estoy usando la librería ruby-serialport. Se trata de una librería relativamente antigua, que no se actualiza desde 2004, pero que funciona bien, aunque con algún problema que he encontrado.
Cómo se puede ver en un ejemplo de la documentación de arduino, la librería es muy sencilla de usar:
1.- Primero se incluye la dependencia:
require «serialport.so»
2.- Después se inicializa la comunicación con el puerto serie:
#params for serial port
port_str = «/dev/ttyUSB0» #may be different for you
baud_rate = 115200
data_bits = 8
stop_bits = 1
parity = SerialPort::NONE
sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)
3.- Se leen y/o escriben datos según se necesite:
sp.putc(GO_UP_SYMBOL)
printf(«%c», sp.getc)
4.- Por último se se cierra el puerto cuando se deja de usar:
sp.close
El problema que he encontrado con esta librería, es que para leer y escribir en el puerto serie, he creado una clase específica. Al incluir la clase en mi programa principal, no podía acceder al puerto serie, ya que se obtenía el siguiente error:
(eval):1: (eval):1:in `private_class_method’: undefined method `create’ for class `Class’ (NameError)
from (eval):1
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require’
from ./serialpresencebot.rb:1
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require’
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require’
from ./presencebotlauncher.rb:3
Finalmente, he tenido que incluir la librería en el programa principal y eliminar el «require» de la clase que controla el puerto serie para que funcionase. Quizá se trate de un problema de funcionamiento de ruby, pero parece más probable que se trate de un problema con la librería ruby-serialport. En cualquier caso, es sencillo de resolver.