Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-07-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 17
seoane Va por buen camino
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);
Responder Con Cita
  #2  
Antiguo 04-08-2006
RICHARIN RICHARIN is offline
Miembro
 
Registrado: ene 2006
Posts: 11
Poder: 0
RICHARIN Va por buen camino
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....
Responder Con Cita
  #3  
Antiguo 23-08-2006
pacocable pacocable is offline
Registrado
 
Registrado: ago 2006
Posts: 9
Poder: 0
pacocable Va por buen camino
¿Como se podria adaptar para poder leer tarjetas ISO7816?
Lo estoy intentado pero en el pxoenix no se me enciende ningun led
Muchas gracias
Responder Con Cita
  #4  
Antiguo 23-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 17
seoane Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 25-08-2006
Dalmine Dalmine is offline
No confirmado
 
Registrado: ago 2006
Ubicación: Argentina Campana Buenos Aires
Posts: 19
Poder: 0
Dalmine Va por buen camino
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__>>??
Responder Con Cita
  #6  
Antiguo 25-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 17
seoane Va por buen camino
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.

Responder Con Cita
  #7  
Antiguo 26-08-2006
Dalmine Dalmine is offline
No confirmado
 
Registrado: ago 2006
Ubicación: Argentina Campana Buenos Aires
Posts: 19
Poder: 0
Dalmine Va por buen camino
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!
Responder Con Cita
  #8  
Antiguo 28-08-2006
Dalmine Dalmine is offline
No confirmado
 
Registrado: ago 2006
Ubicación: Argentina Campana Buenos Aires
Posts: 19
Poder: 0
Dalmine Va por buen camino
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!
Responder Con Cita
  #9  
Antiguo 28-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 17
seoane Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 02-09-2006
Dalmine Dalmine is offline
No confirmado
 
Registrado: ago 2006
Ubicación: Argentina Campana Buenos Aires
Posts: 19
Poder: 0
Dalmine Va por buen camino
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
Responder Con Cita
  #11  
Antiguo 18-09-2006
XxEdwinxX XxEdwinxX is offline
Registrado
 
Registrado: dic 2005
Posts: 9
Poder: 0
XxEdwinxX Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 18-09-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 17
seoane Va por buen camino
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 ...
Responder Con Cita
  #13  
Antiguo 29-11-2006
jpardo25cl jpardo25cl is offline
Registrado
 
Registrado: oct 2006
Posts: 6
Poder: 0
jpardo25cl Va por buen camino
Gran Aporte domingo, mi pregunta , como lo harias para en vez de encender una luz o tal, encender un ordenador cualquiera de tu Lan
Responder Con Cita
  #14  
Antiguo 29-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 17
seoane Va por buen camino
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.
Responder Con Cita
  #15  
Antiguo 30-11-2006
jorllazo jorllazo is offline
Miembro
 
Registrado: sep 2006
Ubicación: Valencia, España
Posts: 83
Poder: 12
jorllazo Va por buen camino
Impresionante Seoane, lo usare para mi cometido, si no supiera hacerlo funcionar espero puedas ayudarme
Responder Con Cita
  #16  
Antiguo 10-01-2007
Avatar de javier7ar
javier7ar javier7ar is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 124
Poder: 12
javier7ar Va por buen camino
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
Responder Con Cita
  #17  
Antiguo 11-01-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 17
seoane Va por buen camino
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 ...
Responder Con Cita
  #18  
Antiguo 09-06-2016
ederfcr ederfcr is offline
Registrado
 
Registrado: jun 2016
Posts: 9
Poder: 0
ederfcr Va por buen camino
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

Última edición por Casimiro Notevi fecha: 09-06-2016 a las 09:57:11.
Responder Con Cita
  #19  
Antiguo 09-06-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.572
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ederfcr Ver Mensaje
Que debo hacer para...
Primero de todo, leer nuestra guía de estilo, gracias y bienvenido
Responder Con Cita
  #20  
Antiguo 09-06-2016
aarmalo aarmalo is offline
Miembro
 
Registrado: mar 2005
Ubicación: México
Posts: 46
Poder: 0
aarmalo Va por buen camino
Cita:
Empezado por ederfcr Ver Mensaje
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:47:25.


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