Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   Trucos (http://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Controlar dispositivos por el puerto serie (http://www.clubdelphi.com/foros/showthread.php?t=80753)

seoane 18-07-2006 22:54:27

Controlar dispositivos por el puerto serie
 
Si alguna vez has pensado en controlar algún dispositivo desde tu PC puede que este truco pueda servirte. En este caso se activa o desactiva un rele, que a su vez actúa como un interruptor que permite encender o apagar "cualquier cosa" (una luz, una puerta automática, etc.).

Para realizar esto vamos a usar el puerto serie del PC, mas concretamente el pin RTS que en un conector de 9 pines es el numero 7. El circuito se ha reducido para que resulte sencillo y no utilice demasiados componentes, su funcionamiento es muy básico cuando activamos RTS tendremos una tensión positiva que activara el rele, si desactivamos RTS tendremos una tensión negativa y el rele volverá a su estado de reposo. (Siento no entrar en más detalles, intento no utilizar palabras técnicas para que todos puedan entenderlo, pero resulta difícil)

El circuito sería el siguiente (no es fácil dibujar con letras):
Código:


                                  V+
                                  |
                          +------+
                          |      |
                          _  -------
                        D2 ^  |  /  |  RELE
                          |  -------
                          |      |
                          +------+
                                  |
                                  |
                                | /
        D1        R1            |/
RTS >--->|-+--/\/\/\/\----------|  T1
          |      R2            |\
          +--/\/\/\/\--+      | \
                        |        |
GND >-------------------+---------+-----< GND

R1,R2 10K
D1,D2 1N4007
T1 BC517
V+ 6V..12V

En cuanto al software, tenemos esta función que, pasándole como parámetros el puerto y el tiempo de espera en milisegundos, activa RTS y la mantiene activa durante el tiempo de espera para después volver a desactivarla.

Código Delphi [-]
function Activar_RTS(Puerto: String; Espera: Cardinal): String;
var
  hPort: THandle;
  DCB: TDCB;
begin
  Result:= '';
  Puerto:= Uppercase(Puerto);
  // Cambiar esto si es necesario un puerto diferente
  if (Puerto<>'COM1') and (Puerto<>'COM2') then
    exit;
  hPort:= CreateFile(PChar('\\.\'+Puerto), GENERIC_READ or GENERIC_WRITE,0, nil,
    OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if hPort<>INVALID_HANDLE_VALUE then
  begin
    DCB.DCBlength:= sizeof(DCB);
    if GetCommState(hPort,DCB) then
    begin
      with DCB do
      begin
        BaudRate := CBR_9600;
        ByteSize := 8;
        Parity   := NOPARITY;
        StopBits := ONESTOPBIT;
        Flags    := $01;
      end;
      if SetCommState(hPort, DCB) then
      begin
        EscapeCommFunction(hPort,SETRTS);
        Sleep(Espera);
        EscapeCommFunction(hPort,CLRRTS);
      end;
    end;
    CloseHandle(hPort);
  end;
end;

Ejemplo de uso:
Código Delphi [-]
  Activar_RTS('COM1',5000);

RICHARIN 04-08-2006 03:55:51

ES JUSTO EL TRUCO QUE ESTABA BUSCANDO... LO PROBARE Y LUEGO OPINO SOBRE LOS RESULTADOS DONDE LO QUIERO APLICAR YA QUE LO QUIERO USAR PARA UN INTERRUPTOR DE TIMBRE....

pacocable 23-08-2006 12:52:09

¿Como se podria adaptar para poder leer tarjetas ISO7816?
Lo estoy intentado pero en el pxoenix no se me enciende ningun led
Muchas gracias

seoane 23-08-2006 17:04:10

aplicable, phoenix es un lector de tarjetas smartcard que cuenta con sus propios drivers y software de programación. El hardware del lector no tienen nada que ver con el que pongo aquí, que es un simple interruptor para encender o apagar algún aparato eléctrico.

Siento no poder ayudarte

Dalmine 25-08-2006 03:05:09

hola que tal xme arme el circuito y anduvo 10 puntos!!
Ahora como se hace para apagar y prender sin tener en cuenta el tiempo que le paso.
Como se puede hacer para prender xmas de una luz, necesito otro tipo de circuito??
y puede ser que mientras este prendida el programa quede bloqueado.
gracias!!
como puedo empezar a estudiar todo esto de los puertos__>>??

seoane 25-08-2006 14:44:41

Me alegro de que te funcionara, ahora vamos a ver si puedo ayudarte con tus preguntas. Como tu bien dices, si lo que se quiere encender es una luz, lo ideal es una función que lo encienda y otra que lo apague. Pues bien lo primero que tenemos que hacer es declarar la variable hPort como global, y separar la función de arriba en 4:

Código Delphi [-]
var
  hPort: Thandle;

procedure AbrirPuerto(Puerto: String);
var
  DCB: TDCB;
begin
  Puerto:= Uppercase(Puerto);
  // Cambiar esto si es necesario un puerto diferente
  if (Puerto<>'COM1') and (Puerto<>'COM2') then
    exit;
  hPort:= CreateFile(PChar('\\.\'+Puerto), GENERIC_READ or GENERIC_WRITE,0, nil,
    OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if hPort<>INVALID_HANDLE_VALUE then
  begin
    DCB.DCBlength:= sizeof(DCB);
    if GetCommState(hPort,DCB) then
    begin
      with DCB do
      begin
        BaudRate := CBR_9600;
        ByteSize := 8;
        Parity   := NOPARITY;
        StopBits := ONESTOPBIT;
        Flags    := $01;
      end;
      if SetCommState(hPort, DCB) then
        Exit;
    end;
    CloseHandle(hPort);
    hPort:= INVALID_HANDLE_VALUE;
  end;
end;

procedure CerrarPuerto;
begin
  if hPort <> INVALID_HANDLE_VALUE then
  begin
    CloseHandle(hPort);
    hPort:= INVALID_HANDLE_VALUE;
  end;
end;

procedure ActivarRTS;
begin
  if hPort <> INVALID_HANDLE_VALUE then
    EscapeCommFunction(hPort,SETRTS);
end;

procedure DesactivarRTS;
begin
  if hPort <> INVALID_HANDLE_VALUE then
    EscapeCommFunction(hPort,CLRRTS);
end;

Antes de usar el puerto tienes que llamar la función AbrirPuerto y cuando dejes de usarlo CerrarPuerto. Las funciones ActivarRTS y DesactivarRTS hacen lo que parece activar y desactivar RTS, para que funcionen el puerto tiene que estar abierto.

En cuanto a lo de encender mas de una luz podemos utilizar además de la salida RTS la DTR con lo cual ya podemos encender 2 luces utilizando 2 circuitos como el anterior. Utilizando una combinación de ambas podríamos controlar hasta 3, pero si necesitas controlar mas ya seria necesario utilizar algún circuito que pueda establecer una comunicación serie, quizá con un microcontrolador PIC.


Dalmine 26-08-2006 06:41:24

hola nuevamente, donde puedo encontrar algo para entender esto de lso puertos seriales y paralelo y como manejarlo con delphi, ver que cosas se pueden hacer, entrar un poco en el tema como para desarrolar algo por mi cuenta!!
Gracias!

Dalmine 28-08-2006 05:51:14

Hola, ahora se me ocurre mandar alguna senal hacia el puerto para indicar que se prenda o apague la luz ya se por una simple llave de luz, algun sensor. Es para probar mandarle una señal a el puerto y cuando este la reciva active la funcion de apagar luz, o para que cuando reciba active la de prender. Espero que se entienda!

seoane 28-08-2006 22:13:36

Hola Dalmine, mandarle señales al puerto serie no es tan sencillo ya que funciona con voltajes desde +/-3V hasta +/-10V, pero lo mas importante es que se necesitan valores negativos y positivos. Algunos puertos interpretaran bien una señal de 0/5V pero esta no cumple el estándar y puede no funcionar. Un ejemplo de como mandar señales puede ser por este circuito pensado para recibir señales de un control remoto, aunque se puede reemplazar el sensor por cualquier otra señal digital entre 0 y 5V.

http://www.tb-electronic.de/vdr/lirc/lirc_rx.html

También puedes usar el circuito integrado Max232 para convertir las señales entre 0/5V a señales que cumplen con el estándar RS232, busca por internet, hay multitud de ejemplos de como usar este integrado.

Dalmine 02-09-2006 22:39:22

HOla que tal!! como va, encontre este dispositivo!!

http://www.pablin.com.ar/prod/placa32.htm

ahora me queda leer info para ver como es todo este protcolo del puerto serie y hacer unas pruebitas en delphi, hasta juntar la platita, que no es mucha!!
gracias por darme la iniciativa!!
rino

XxEdwinxX 18-09-2006 06:32:27

hola, me parese interesante esto que leo, justo lo que busco, estoy intentando controlar los controles de un playstation 2, seria posible habilitar y desabilitar su funcionamiento con ese circuito y su software en delphi??? espero me respondan bye

seoane 18-09-2006 14:43:02

Supongo que quieres hacer un sistema que impida usar el mando de la play. En ese caso se tendría que localizar el cable de alimentación, cortando ese cable y haciéndolo pasar a través del contacto del relé supongo que se podría conseguir lo que buscas. De todas formas yo haría el "arreglo" en una extensión para mandos (las hay a vender) así no destrozaría el propio mando. De todas formas, no te aseguro que todo funcione bien, recuerda que el mando de una playstation es un circuito digital bastante complejo y puede que no le "siente bien" que lo anden conectando y desconectando, tu veras ...

jpardo25cl 29-11-2006 16:36:05

Gran Aporte domingo, mi pregunta , como lo harias para en vez de encender una luz o tal, encender un ordenador cualquiera de tu Lan

seoane 29-11-2006 18:25:52

Hola jpardo25cl, este truco no creo que sea aplicable a encender ordenadores en una Lan. Creo que lo que tu necesitas es buscar información sobre el Wake-On-Lan, saber si las placas de los ordenadores de tu red lo soportan y como mandar el "magic packet" a un ordenador para encenderlo.

Seguro que si expones esta duda en el los foros alguien te ayudara.

jorllazo 30-11-2006 23:00:59

Impresionante Seoane, lo usare para mi cometido, si no supiera hacerlo funcionar espero puedas ayudarme

javier7ar 10-01-2007 23:20:47

Hola, antes que nada no se si es adecuada mi pregunta, pueden no responder
Estoy investigando el puerto Paralelo, y en una pagina encontre que cada pin se corresponde con un bit en una direccion de memoria especifica, y si el bit esta en 1 el pin tiene tension y si esta en 0 el pin no tiene tension. Hay una tablita explicandolo muy bien en:

http://www.pablin.com.ar/electron/info/varios/spp.htm

el tema es que no se como escribir en esas direcciones de memoria desde el Delphi, no se si tengo que usar alguna API del SO, y como vi que estaban con el puerto COM1 decidi preguntar (aunque usando funciones especificas para ese tipo de puertos)
Si alguien me puede tirar alguna pista se lo agradecere.
Desde ya muchas gracias
Saludos

Javier

seoane 11-01-2007 04:45:30

Hola javier7ar, en WindowsXP/200, y supongo que en los siguientes, no se puede acceder directamente a los puertos. Se tiene que utilizar un driver o como en este caso funciones de la API. Para el caso del puerto paralelo, existen varios drivers gratuitos en internet que podrás descargar y utilizar desde delphi. Busca en los foros y encontraras varios hilos tratando ese tema ...

ederfcr 09-06-2016 02:43:54

Ayuda con el DTR
 
Que debo hacer para usar el DTR en el codigo? el pin en db9 es el 6 creo, pero en delphi hay algo para modificar y abris y habilitar???

Mi proyecto es validar un usuario por biometria si está registrado enciende luz verde y si no esta registrado enciende luz roja y que ademas si esta registrado abra una puerta, aunque esto ultimo lo puedo obviar.

Gracias por la ayuda.

Eder

Casimiro Notevi 09-06-2016 09:58:09

Cita:

Empezado por ederfcr (Mensaje 506009)
Que debo hacer para...

Primero de todo, leer nuestra guía de estilo, gracias y bienvenido :)

aarmalo 09-06-2016 19:31:19

Cita:

Empezado por ederfcr (Mensaje 506009)
Que debo hacer para usar el DTR en el codigo? el pin en db9 es el 6 creo, pero en delphi hay algo para modificar y abris y habilitar???

Mi proyecto es validar un usuario por biometria si está registrado enciende luz verde y si no esta registrado enciende luz roja y que ademas si esta registrado abra una puerta, aunque esto ultimo lo puedo obviar.

Gracias por la ayuda.

Eder

No creo que esta sea la mejor opción para tu proyecto y en la actualidad creo que te serviría mejor usar un arduino. Al menos necesitas 3 pines: Luz Roja, Luz Verde y Puerta.

Un ejemplo muy simple del concepto esta en el siguiente código para el arduino:

Código:

char c;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(1,OUTPUT);  //Luz Roja
  pinMode(2,OUTPUT);  //Luz Verde
  pinMode(3,OUTPUT);  //Puerta
}

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available()>0)
  {
    c = Serial.read();
    switch(c) {
      case 'v':
          digitalWrite(2,HIGH);
          digitalWrite(3,HIGH);
          delay(1000);
          digitalWrite(2,LOW);
          digitalWrite(3,LOW);
          break;
      case 'i':
          digitalWrite(1,HIGH);
          delay(1000);
          digitalWrite(1,LOW);
          break;
      default:
          break;
    }
  }
}

Entonces desde tu programa le envías una 'v' para usuario valido o una 'i' para invalido.

Aclaro que este es sólo un ejemplo.


La franja horaria es GMT +2. Ahora son las 20:58:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi