h1

Comunicación de Perl con Arduino por puerto serie

22 marzo 2009

Después de haberme leído algunos tutoriales de Perl y el libro de O’Reilly me considero satisfecho con el nivel adquerido. Ahora es momento de demostrar los conocimientos. Como habíamos creado un pequeño programa para Arduino que esperaba que llegara por puerto serie un ‘H’ para encender un led, ahora vamos a hacer el programa en Perl que envíe esa ‘H’.

#!/usr/bin/perl -w
use strict; #Esta linea es para hacer obligatorio la declaracion de variablesuse
use Device::SerialPort; # Declaramos el Modulo para manejo de puertos
my $serial = Device::SerialPort->new(“/dev/ttyUSB0”) || die “No se pudo abrir el puerto”; # configuracion del Puerto serial USB
$serial->baudrate(9600); # Velocidad del Puerto o Razon de Bits(9600)
$serial->write_settings; #
# Envio de Datos por el Puerto Serial
$serial->write(chr(’H’)); # Envio de un A al puerto serial.
delay(0.5);
sub delay{ # Funcion para dar una pausa
my $time=shift; # Variable que indica el tiempo(segundos), Con shift se recoje un parametro a
select(undef, undef, undef, $time); # Funcion Real que hace la pausa
}

El ejemplo está comentado pero para cualquier aclaración podéis utilizar los foros de OpenDomotica.

Para la descarga del archivo: puertoSerie.pl

Anuncios

7 comentarios

  1. iNTERESANTE Y MUY BIEN EXPLICADO, MUCHAS GRACIAS.


  2. Hola, probé este código en perl junto con el código de Arduino que recibe una ‘A’ de entrada que publicaste tiempo atrás. Ejecuto el script en perl por terminal pero el led se prende por una milesima de segundo y se apaga inmediatamente, casi imperceptible. No debería mantenerse prendido el led??, como soluciono eso??. Gracias.


    • Hola,

      ¿Podrías decirme qué código es el que estás utilizando para Arduino?

      Un saludo.


      • int led =11;
        int intensidad =255;

        void setup()
        {
        Serial.begin (9600);
        pinMode (led, OUTPUT);
        }

        void loop()
        {

        char valor;

        if (Serial.available() )
        {
        valor =Serial.read();

        if (valor==’A’)
        {
        onled();
        }
        else if (valor==’B’)
        {
        offled();
        }
        }
        }

        void onled()
        {
        digitalWrite (led, intensidad);
        }

        void offled()
        {
        digitalWrite (led, 0);
        }

        Como verás es bastante similar al que esta publicado acá https://opendomotica.wordpress.com/2009/02/01/arduino-ii-empezando-con-arduino/ .

        Lo raro es que al utilizar el Serial Monitor del Arduino IDE funciona sin problemas, A prende y B apaga.


      • Hola de nuevo,

        Creo que se donde puede estar el problema, sino estoy equivocado: el código perl inicia una conexión con Arduino, envía el comando, Arduino lo interpreta y luego Perl cierra la conexión serie por lo que Arduino se reinicia y pierde el estado de encendido que se encuentra.

        Para solventar eso puedes guardar el estado en la EEPROM o no cerrar la conexión con Perl. Otra opción disponible es modificar Arduino para que no se resetee cuando se desconecta el serie.

        Espero haberte servido de ayuda.

        Un saludo.


  3. Ok gracias, veré que hago. A todo esto, obligadamente tengo que utilizar el pin 1 de Arduino o no necesariamente?. Estaba utilizando el pin 11 y ahora que veo en tu código estabas utilizando el pin 1.


    • No, puedes utilizar el pin que quieras para el led, pero es recomendable que dejes el 0 y el 1 libres para el puerto serie. En tu caso, es mejor que utilizaras el 11.



Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: