Control de dispositivos reales. PARTE 2: El puerto de Serie

Aquí pueden poner todos los programas y utilidades que hayan creado con AMS.
Hola chicos, aqui vengo con la segunda parte del control de dispositivos REALES, y para ello traigo un ejemplo al que seguro que todos le veis alguna que otra increible utilidad.

Se trata de una implementación de un mando a distancia, solo he hecho interfaz de 1 boton de los 12, a modo breve y explicativo del funcionamiento



Bueno vamos al grano:

Para el que tenga alguna experiencia en microcontroladores, crear un puente usb-serie o serie-serie con el pc no será nada complicado, para los mas profanos, existen dispositivos muy sencillos de usar y que incorporan una serie de potentes capacidades de entrada/salida.

En este caso he utilizado un UBW: http://www.sparkfun.com/products/762
Al modico precio de 18 euros, dispones de una diminuta placa con unas cuantas entradas y salidas, presta y dispuesta para actuar como puente entre tu software->usb->serie->dispositivos externos

Existe una ampliiiiiiisima gama de actuadores externos que se pueden acoplar a este cacharro, os dejo unna interesante colección aqui: http://www.ucontrol.com.ar/wiki/index.p ... ada/salida

Os invito a preguntar en este hilo cualquier duda que pueda surgir para fabricar alguno de estos cacharros.

Por lo general, vamos casi siempre a querer controlar cargas, con lo que un elemento como un rele nnor sirve de maravilla, ya que es como un interruptor pero activado electronicamente, en la pagina anterior teneis algun diagrama de conexion de reles, he de decir que el UBW esta limitado a la tension que puede entregar el usb, que es mas bien poquita, por lo que recomiendo encontrar alguna fuente de alimentacion externa, como cables sacados de la propia fuente del pc para conectar algo que consuma mas que un led, y aconsejo optoisolar la salida (buscar rele optoisolado)

Recomiendo disponer de una placa de prototipos como la que muestro en el video para hacer pequeñas pruebas sin soldar nada

El sistema de mando a distancia usado es este: http://www.virtualvillage.com/12-channe ... 1-031.html Antes lo usaba para controlar la subida y bajada de varios grupos de motores para espectaculos y cosas asi...

La parte de AMS es mas bien... sencillisima.

-Descargar luaRS232: http://github.com/ynezz/librs232/downloads
-Colocar la dll en la carpeta scripts de nuestro proyecto

Una vez hecho esto, por ejemplo dejo el codigo del programa que veis en el video:
ONSHOW:


rs232 = require("luars232")

port_name = "COM3"

e, p = rs232.open(port_name)
if e ~= rs232.RS232_ERR_NOERROR then

Dialog.Message('',string.format("can't open serial port '%s', error: '%s'\n",
port_name, rs232.error_tostring(e)))
return
end

assert(p:set_baud_rate(rs232.RS232_BAUD_9600) == rs232.RS232_ERR_NOERROR)
assert(p:set_data_bits(rs232.RS232_DATA_8) == rs232.RS232_ERR_NOERROR)
assert(p:set_parity(rs232.RS232_PARITY_NONE) == rs232.RS232_ERR_NOERROR)
assert(p:set_stop_bits(rs232.RS232_STOP_1) == rs232.RS232_ERR_NOERROR)
assert(p:set_flow_control(rs232.RS232_FLOW_OFF) == rs232.RS232_ERR_NOERROR)

p:write([[c,0,0,0,0
]])
Application.Sleep(100);
ex,ec=p:read(20,100)
Dialog.Message('',ec)

Page.StartTimer(100, 10);



ON TIMER:

ex,ec=p:read(20,100)
if (ec~=nil) then
Label.SetText("Label2", ec);
ecx = String.DelimitedToTable(ec, ",");
--Dialog.Message('',tostring(ec))
if (ecx[3]=="000") then
	Shape.SetFillColor("Plugin1", 255);
else
	Shape.SetFillColor("Plugin1", 65280);
end end


p:write("i\n")
Una vez abierto el puerto y configurado en velocidad, todo esta listo para usar las funciones :read(longitud_a_leer, timeout) y :write(cadena_a_escribir,timeout)

Tan sencillo como eso. no hay complicadas cosas que hacer ni nada de nada.

Aqui dejo el ejemplo oficial de luars232 que enseña un poquito mas la funcionalidad y el chequeo de errores, cosas mas opcionales pero que nunca vienen mal:
rs232 = require("luars232")

port_name = "COM1"

--local out = io.stderr

-- open port
local e, p = rs232.open(port_name)
if e ~= rs232.RS232_ERR_NOERROR then
-- handle error
Dialog.Message('',string.format("can't open serial port '%s', error: '%s'\n",
port_name, rs232.error_tostring(e)))
return
end

-- set port settings
assert(p:set_baud_rate(rs232.RS232_BAUD_115200) == rs232.RS232_ERR_NOERROR)
assert(p:set_data_bits(rs232.RS232_DATA_8) == rs232.RS232_ERR_NOERROR)
assert(p:set_parity(rs232.RS232_PARITY_NONE) == rs232.RS232_ERR_NOERROR)
assert(p:set_stop_bits(rs232.RS232_STOP_1) == rs232.RS232_ERR_NOERROR)
assert(p:set_flow_control(rs232.RS232_FLOW_OFF) == rs232.RS232_ERR_NOERROR)

Dialog.Message('',string.format("OK, port open with values '%s'\n", tostring(p)))

-- read with timeout
local read_len = 1 -- read one byte
local timeout = 100 -- in miliseconds
local err, data_read, size = p:read(read_len, timeout)
assert(e == rs232.RS232_ERR_NOERROR)

-- write without timeout
err, len_written = p:write("test")
assert(e == rs232.RS232_ERR_NOERROR)

-- write with timeout 100 msec
err, len_written = p:write("test\n", timeout)
assert(e == rs232.RS232_ERR_NOERROR)
En unas horas publico una aplicacion para controlar el UBW con la mayor parte de sus caracteristicas, entradas (digitales y analogicas) y salidas

Estos post no son un tutorial, sino un punto de partida y un sitio para que quien quiera, pueda escribir acerca de lo que quiere hacer y yo le pueda asesorar en el diseño y construcción
very good Mr  Pabloko
can you give us an apz file please ?

i search the download section for an example
i found nothing
ese pabloko , genial!

thanks ;)

الريح في الربح :demo: :demo: