Arduino + Ruby + Gruff

  • por Lucas Campos

 

¿Recuerdan el post anterior que hablaba sobre controlar Arduino mediante Ruby?

 

 

En esta ocasión llevaremos esto un poco más allá, además de controlar nuestro arduino mediante Ruby, obtendremos datos y los graficaremos constantemente a medida que estos vayan siendo adquiridos. Para esto, utilizaremos Gruff, una gema que permite crear gráficos amigables en Ruby de manera rápida y sencilla.

Para este tutorial utilizaremos un sensor de temperatura TMP36 y así graficar temperatura vs tiempo.

 

Instalación de la gema Gruff:

Comenzaremos instalando la gema Gruff mediante el siguiente comando

gem install gruff

 

Obteniendo datos con arduino:

Llegó la hora de comenzar a leer datos con nuestro sensor de temperatura.

La conexión de nuestro sensor es muy sencilla (en los links de ayuda se encuentra el datasheet de este sensor). 

 

Cuando hayamos conectado nuestro sensor comenzaremos a medir simplemente la señal de entrada la que debemos transformar a ºC.

Para esto utilizaremos la siguiente formula:

lectura*(vAlimentación/1024)

**vAlimentación: voltaje de alimentación del sensor

En este caso el voltaje de alimentación que hemos utilizado es de 5V pero puede utilizarse de igual manera el pin de 3,3V sin problemas, solo se debe reemplazar vAlimentación en la ecuación por el que se haya utilizado.

 

Graficando los datos obtenidos:

Ya hemos medido temperatura con nuestro sensor por lo que ahora comenzaremos a graficar estos datos.

Para empezar configuraremos nuestro gráfico en el apartado visual.

Gruff cuenta con un sinfín de modificaciones y eso lo hace una gran complemento a la hora de personalizar nuestros gráficos. En este tutorial haremos uso de un grafico de lineas el cual tendrá 2 ejes: T(ºC) y t (temperatura y tiempo respectivamente).

 

Obteniendo datos y graficándolos:

La configuración de nuestro gráfico estára dado por el siguiente código:

g = Gruff::Line.new("2500x1500")

g.line_width = 2

g.show_vertical_markers = true

g.dot_radius = 1

g.theme_keynote

g.marker_font_size = 9

g.legend_font_size = 11

g.title_font_size = 12

g.title = 'Temperatura [ºC] vs Tiempo[t]'

g.labels = labels

g.x_axis_label = "Tiempo [s]"

g.y_axis_label = "Temperatura [ºC]"

g.data('Temp', data)

 

Como se puede observar hemos personalizado casi cada punto de nuestro gráfico: el tamaño de la fuente, el skin a utilizar, grosor de las lineas, etc…

El código final para realizar nuestra medición y graficarla se verá como lo siguiente:

 

require "rubygems"
require "arduino_firmata"
require "gruff"

arduino = ArduinoFirmata.connect

c = 1

loop do

    labels = {}

    (0..60).each_with_index do |key, value|
        labels[key] = value.to_s
    end

    data = []

    (0..60).each do |i|
        lectura = arduino.analog_read 0
        volts = ((lectura*5.0)/1024.0).round(2)
        temperatura = ((volts-0.5)*100.0).round(2)
        puts "Valor voltaje: "+volts.to_s
        puts "Valor temperatura ºC: "+temperatura.to_s
        puts "#########################################"
        data.push(temperatura)
        sleep 0.25
    end

    g = Gruff::Line.new("2500x1500")
    g.line_width = 2
    g.show_vertical_markers = true
    g.dot_radius = 1
    g.theme_keynote
    g.marker_font_size = 9
    g.legend_font_size = 11
    g.title_font_size = 12
    g.title = 'Temperatura [ºC] vs Tiempo[t]'
    g.labels = labels
    g.x_axis_label = "Tiempo [s]"
    g.y_axis_label = "Temperatura [ºC]"
    g.data('Temp', data)
    g.write('chart'+c.to_s+'.png')
    c += 1

end

 

Finalmente, como resultado obtendremos un gráfico así:

 

 

 

Links de ayuda:

Datasheet TMP36

Gema Gruff