Ir al contenido



Foto

Encender y apagar un Led con Delphi y Arduino


  • Por favor identifícate para responder
23 respuestas en este tema

#1 Meta

Meta

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 14 julio 2017 - 09:34

Hola:

 

Haciendo pruebas, tengo Delphi 10.2 y aquí por fin encontré un tutorial de como instalar el comport.

 

https://www.youtube....h?v=3_YIzPKii58

 

La librería comport:

https://sourceforge....ojects/comport/

 

Voy hacer la interfaz así:

delphi-led-1755606.PNG

 

Teniendo el código de Arduino abajo y funciona bien:


php
  1. const byte Led = 13; // Declaramos la variable pin del Led.
  2. char caracter;
  3. String comando;
  4.  
  5. void setup()
  6. {
  7. pinMode(Led, OUTPUT); // Inicializa el pin del LED como salida:
  8. Serial.begin(115200); // Puerto serie 115200 baudios.
  9. }
  10.  
  11. void loop()
  12. {
  13. /*
  14.   Voy leyendo carácter a carácter lo que se recibe por el canal serie
  15.   (mientras llegue algún dato allí), y los voy concatenando uno tras otro
  16.   en una cadena. En la práctica, si usamos el "Serial monitor" el bucle while
  17.   acabará cuando pulsamos Enter. El delay es conveniente para no saturar el
  18.   canal serie y que la concatenación se haga de forma ordenada.
  19.   */
  20. while (Serial.available() > 0)
  21. {
  22. caracter = Serial.read();
  23. comando.concat(caracter);
  24. delay(10);
  25. }
  26.  
  27. /*
  28.   Una vez ya tengo la cadena "acabada", compruebo su valor y hago que
  29.   la placa Arduino reacciones según sea este. Aquí podríamos hacer lo
  30.   que quisiéramos: si el comando es "tal", enciende un Led, si es cual,
  31.   mueve un motor... y así.
  32.   */
  33.  
  34. // Si le llega el mensaje Luz_ON.
  35. if (comando.equals("Luz_ON") == true)
  36. {
  37. digitalWrite(Led, HIGH); // Enciende el Led 13.
  38. Serial.write("ON - Led encendido."); // Envía este mensaje a C++.
  39. }
  40.  
  41. // Si le llega el mensaje Luz_ON.
  42. if (comando.equals("Luz_OFF") == true)
  43. {
  44. digitalWrite(Led, LOW); // Apaga el Led 13.
  45. Serial.write("OFF - Led apagado. "); // Envía este mensaje a C++.
  46. }
  47.  
  48. // Limpiamos la cadena para volver a recibir el siguiente comando.
  49. comando = "";
  50. }

Falta entender bien como se envía comandos desde Delphi:

 

Como puedes ver arriba en Arduino que hice, mi idea en enviar estos dos comandos.

Luz_ON
Luz_OFF


Lo que en Delphi sería así:


php
  1. begin
  2. if Puerto.Connected then Puerto.Write("Luz_ON"); // Enciende el Led.

En DElphi estoy demasiado oxidado, poco a poco vuelvo a los andares.

 

Cualquier información bienvenido sea.

 

Saludos.


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.604 mensajes
  • LocationMéxico

Escrito 15 julio 2017 - 01:29

Falta entender bien como se envía comandos desde Delphi:

 

Como puedes ver arriba en Arduino que hice, mi idea en enviar estos dos comandos.

Luz_ON
Luz_OFF


Lo que en Delphi sería así:


php
  1. begin
  2. if Puerto.Connected then Puerto.Write("Luz_ON"); // Enciende el Led.

En DElphi estoy demasiado oxidado, poco a poco vuelvo a los andares.

 

Cualquier información bienvenido sea.

 

Saludos.

 

Hola

 

Voy a escribir algo basado en tu código y lo comparto para que hagas pruebas.

 

Saludos


  • 0

#3 Meta

Meta

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 15 julio 2017 - 04:14

Tengo un problema, debo instalar la librería y me da error por todas partes.

Quiero instalar una librería que se llama comport que es el componeten para controlar el puerto serie.

ComPort Library

Estoy siguiendo el vídeo tutorial abajo que usa Delphi 10.1, sigo los paso y me da errores por todas partes.

Ver víeo.

Guardo la carpeta donde está los proyectos que hago como si fuera un proyecto más.
Selecciono la librería tal como indica en el vídeo.

delphi-1756020.PNG

Pulse el archivo que pulse para abrir, me sale este error.

delphi-2-1756024.PNG

¿Hay alguna solución?

Saludos.


  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.604 mensajes
  • LocationMéxico

Escrito 15 julio 2017 - 09:15

Preguntas

 

¿Ya agregaste el path a Delphi Options --> Library?

 

¿Estas utilizando Delphi 10.2 Starter?

 

 

Voy a intentarlo.

 

Saludos


  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.604 mensajes
  • LocationMéxico

Escrito 15 julio 2017 - 09:26

Hola

 

Algo estas haciendo mal, ya lo he instalado en Delphi 10.2 Tokio Starter sin problema alguno.

 

Saludos

Archivos adjuntos


  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.604 mensajes
  • LocationMéxico

Escrito 15 julio 2017 - 10:00

Hola

 

Pues ya hice una pequeña prueba con Hyperterminal, Mini Terminal y un emulador de puertos (mi maquina no tiene puertos seriales)

 

Con ésto ya solo es coser y cantar para que funcione con Arduino. :D

 

Saudos

Archivos adjuntos


  • 0

#7 Meta

Meta

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 16 julio 2017 - 12:32

Hola:

 

 

Preguntas

 

¿Ya agregaste el path a Delphi Options --> Library?

 

¿Estas utilizando Delphi 10.2 Starter?

 

 

Voy a intentarlo.

 

Saludos

 

Sí en las dos preguntas.

 

delphi-3-1756186.PNG

 

Se comporta como que no he hecho nada.

 

Entonces. ¿Cuál es el problema?

 

Justo en este otro vídeo en el minuto 2:17, no me aparece el archivo indicado a la derecha para selecconar el install pack.

 

Ver vídeo.

 

Saludos.


  • 0

#8 Meta

Meta

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 16 julio 2017 - 02:45

Hola de nuevo:
 
Ya me funciona en parte. Puedo encender y apagar el Led.
 
Formulario principal.
delphi-5-1756201.PNG
 
Código completo:

delphi
  1. unit Principal;
  2.  
  3. interface
  4.  
  5. uses
  6. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, CPort;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Button_ON: TButton;
  12. Button_OFF: TButton;
  13. Label1: TLabel;
  14. ComPort1: TComPort;
  15. Button_COM: TButton;
  16. Button_Abrir: TButton;
  17. Memo_Mensajes: TMemo;
  18. Label_Mensajes: TLabel;
  19. Button_Limpiar: TButton;
  20. procedure Button_COMClick(Sender: TObject);
  21. procedure Button_AbrirClick(Sender: TObject);
  22. procedure ComPort1AfterClose(Sender: TObject);
  23. procedure ComPort1AfterOpen(Sender: TObject);
  24. procedure Button_ONClick(Sender: TObject);
  25. procedure Button_OFFClick(Sender: TObject);
  26. procedure ComPort1RxChar(Sender: TObject; Count: Integer);
  27. procedure Button_LimpiarClick(Sender: TObject);
  28. private
  29. { Private declarations }
  30. public
  31. { Public declarations }
  32. end;
  33.  
  34. var
  35. Form1: TForm1;
  36.  
  37. implementation
  38.  
  39. {$R *.dfm}
  40.  
  41. procedure TForm1.Button_AbrirClick(Sender: TObject);
  42. begin
  43. if ComPort1.Connected then
  44. begin
  45. ComPort1.Close;
  46.  
  47. Button_COM.Enabled := True;
  48. Button_ON.Enabled := False;
  49. Button_OFF.Enabled := False;
  50. end
  51.  
  52. else
  53.  
  54. begin
  55. ComPort1.Open;
  56.  
  57. Button_COM.Enabled := False;
  58. Button_ON.Enabled := True;
  59. Button_OFF.Enabled := True;
  60. end;
  61. end;
  62.  
  63. procedure TForm1.Button_COMClick(Sender: TObject);
  64. begin
  65. ComPort1.ShowSetupDialog;
  66. end;
  67.  
  68. procedure TForm1.Button_LimpiarClick(Sender: TObject);
  69. begin
  70. Memo_Mensajes.Clear();
  71. end;
  72.  
  73. procedure TForm1.Button_ONClick(Sender: TObject);
  74. begin
  75. ComPort1.WriteStr('Luz_ON');
  76. end;
  77.  
  78. procedure TForm1.Button_OFFClick(Sender: TObject);
  79. begin
  80. ComPort1.WriteStr('Luz_OFF');
  81. end;
  82.  
  83. procedure TForm1.ComPort1AfterClose(Sender: TObject);
  84. begin
  85. if Button_Abrir <> nil then
  86. Button_Abrir.Caption := 'Abrir';
  87. end;
  88.  
  89. procedure TForm1.ComPort1AfterOpen(Sender: TObject);
  90. begin
  91. Button_Abrir.Caption := 'Cerrar';
  92. end;
  93.  
  94. procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
  95. var
  96. Str: String;
  97. begin
  98. ComPort1.ReadStr(Str, Count);
  99. Memo_Mensajes.Text := Memo_Mensajes.Text + Str;
  100. end;
  101.  
  102. end.

Si te fijas bien en la imagen de arriba ocurren dos cosas que no me gusta.
 
1. No hace el truco del #13#10 para que se muestre en cada línea en el Memo. Si incluyo el #13#10 como qu ea veces, los mensajes me vienen como partido en dos.

delphi
  1. procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
  2. var
  3. Str: String;
  4. begin
  5. ComPort1.ReadStr(Str, Count);
  6. Memo_Mensajes.Text := Memo_Mensajes.Text + Str + #13#10;
  7. end;

2. La barra de scroll del Memo, si se llena mucho de mensajes, se llena como es lógico, pero no muestra los datos recientes. ¿Se puede solucionar?
 
Saludos.
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.604 mensajes
  • LocationMéxico

Escrito 16 julio 2017 - 07:46

Yo cambiaría éste procedimiento:


delphi
  1. procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
  2. var
  3. Str: String;
  4. begin
  5. ComPort1.ReadStr(Str, Count);
  6. Memo_Mensajes.Text := Memo_Mensajes.Text + Str;
  7. end;

 por ésto
 


delphi
  1. procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
  2. var
  3. Str: String;
  4. begin
  5. ComPort1.ReadStr(Str, Count);
  6. Memo_Mensajes.Lines.Add( Str );
  7. end;

Dime que sucede.
 
Saludos


  • 0

#10 Meta

Meta

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 16 julio 2017 - 11:05

Buenas:

 

Funciona bien tal como lo quiero.

 

Falta un detalle, a veces las cadenas de texto como que saltan o no se muestra correctamente.

40-1756400.png

 

¿Qué puede ser y cómo se soluciona?

 

Probando en otro Terminal si funciona  de maravilla.

 

Saludos.


  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.604 mensajes
  • LocationMéxico

Escrito 17 julio 2017 - 07:57

Buenas:

 

Funciona bien tal como lo quiero.

 

Falta un detalle, a veces las cadenas de texto como que saltan o no se muestra correctamente.

40-1756400.png

 

¿Qué puede ser y cómo se soluciona?

 

Probando en otro Terminal si funciona  de maravilla.

 

Saludos.

 

Hola

 

El asunto es que no siempre se puede leer todos los caracteres enviados, quiero decir, no se están leyendo los paquetes completos, en tu imagen recibió el primer paquete sin el punto, despúes se reciubió el punto, el tercero se recibio completo y el cuarto se recibió la mitad y en otro paquete la otra mitad, para poder resolver el asunto hay que analizar lo que nos llega y determinar el inicio y el final de los paquetes enviados.

 

Si puedes guardar en un archivos de texto algunos paquetes te puedo ayudar a ordenar los paquetes. 

 

Saludos


  • 0

#12 Meta

Meta

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 17 julio 2017 - 08:39

Buenas:
 
Por lo que veo, usar esto.


delphi
  1. Memo1.Lines.SaveToFile(archivo.txt);
  2. Memo1.Lines.LoadFromFile(archivo.txt);

El resultado es el mismo que en el MEmo cuando lo guardas en el txt.


delphi
  1. ON - Led encendido.
  2. OFF - Led apagado.
  3. ON - Led encendido.
  4. OFF - Led
  5. apagado.
  6. ON - Led encendido.
  7. OFF -
  8. Led apagado.
  9. ON
  10. - Led encendido.
  11. OFF - Led apagado.
  12. ON - Led encen
  13. dido.
  14. OFF -
  15. Led apagado.
  16. ON - Led
  17. encendido.
  18. OFF - Led apagado.
  19. ON - Led encendido.
  20. OFF - Led apaga
  21. do.
  22. ON - Led encendido.
  23. OFF - Led apagado.
  24. ON - Led encendido.
  25. ON - Led encendi
  26. do.
  27. ON - Led en
  28. cendido.
  29. ON - L
  30. ed encendido.
  31. O
  32. N - Led encendido.
  33. ON - Led encendido.
  34. ON - Led encendido.
  35. ON - Led encendido.
  36. ON - Led encendido.
  37. ON - Led encendido.
  38. OFF - Led apagado.
  39. OFF - Led apagado.
  40. OFF - Led apagado.
  41. OFF - Led apagado.
  42. OFF - Led apa
  43. gado.
  44. OFF - Le
  45. d apagado.
  46. O
  47. FF - Led apagado.
  48. OFF - Led apagado.
  49. OFF - Led apagado.
  50. OFF - Led apagado.
  51. OFF - Led apagado.
  52. OFF - Led apagado.
  53. OFF - Led apagado.
  54. OFF - Led ap
  55. agado.
  56. OFF
  57. - Led apagado.
  58. O
  59. FF - Led apagado.
  60. ON
  61. - Led encendido.
  62. ON - Led
  63. encendido.
  64. ON - Le
  65. d encendido.
  66. ON - Led encendido.
  67. ON - Led encendido.
  68. ON - Led encendido.
  69. ON - Led encendido
  70. .
  71. ON - Led ence
  72. ndido.
  73. ON - Led encendido.
  74. ON - Led encendido.
  75. ON - Led encendido.
  76. OFF - Led apagado.
  77. OFF - Led apagad
  78. o.
  79. OF
  80. F - Led apagado.
  81. OFF - Led apagado.
  82. OFF - Led apagado.
  83. OFF - Led apagado.
  84. OFF - Led apagado
  85. .
  86. OFF - Led apa
  87. gado.
  88. ON - Led encendido.
  89. ON - Led encendido.
  90. ON - Led encendido.


delphi
  1. procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
  2. var
  3. Str: String;
  4. begin
  5. ComPort1.ReadStr(Str, Count); // Recibe caracteres desde el puerto.
  6. Memo_Mensajes.Lines.Add( Str ); // Muestra los textos en pantalla.
  7.  
  8. Memo_Mensajes.Lines.SaveToFile('archivo.txt');
  9.  
  10. end;

Salu2.


  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.604 mensajes
  • LocationMéxico

Escrito 17 julio 2017 - 09:00

Buenas:
 
Por lo que veo, usar esto.

 

El resultado es el mismo que en el MEmo cuando lo guardas en el txt.

 

Hola

 

Conecta tu Arduino a Hyperterminal y guarda todo lo que recibes en un archivo de texto. adjunta el archivo para poder descargarlo y revisar lo que contiene.

 

Saludos


  • 0

#14 Meta

Meta

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 17 julio 2017 - 09:10

20170717-160016-1756476.jpg

 

Para poder ver el Terminal de Windows, debo escribir Luz_ON y Hyperterminal no me deja.


  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.604 mensajes
  • LocationMéxico

Escrito 17 julio 2017 - 09:30

 

Para poder ver el Terminal de Windows, debo escribir Luz_ON y Hyperterminal no me deja.

 

Veamos, cierra tu aplicacion, abre Hyperterminal y conecta al puerto serial que está conectado a Arduino, presiona ENTER y luego escribe Luz_ON y presiona ENTER, no vas a ver nada en Hyperterminal, pero sí estás enviando a Arduino. Para apagar igual, escribe Luz_OFF y presiona ENTER. Antes de conectarte a Arduino, indicale a hyperterminal que guarde todo lo que pase por el puerto.

 

Saludos


  • 0

#16 Meta

Meta

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 17 julio 2017 - 12:04

Siguiendo los pasos, no me deja escribir nada, por mucho qu epulse Enter y sin pulsar también, no deja haga lo que haga.


  • 0

#17 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.604 mensajes
  • LocationMéxico

Escrito 17 julio 2017 - 12:42

Siguiendo los pasos, no me deja escribir nada, por mucho qu epulse Enter y sin pulsar también, no deja haga lo que haga.

 

Que raro, hyperterminal es una de las mejores terminales de windows para puertos seriales. 

 

Aquí el asunto es hacer que se lean paquetes definidos, con APro lo hago sin problema, necesito ver como se hace con comPort para poder decirte algo, llegando a casa hago unas pruebas.

 

Saludos


  • 0

#18 Meta

Meta

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 17 julio 2017 - 12:53

Hola:

 

Te paso el proyecto completo con DropBox.

 

Enlace.

 

Saludos.


  • 1

#19 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.604 mensajes
  • LocationMéxico

Escrito 17 julio 2017 - 12:54

Hola:

 

Te paso el proyecto completo con DropBox.

 

Enlace.

 

Saludos.

 

Muy bien. 

 

Saludos


  • 0

#20 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.604 mensajes
  • LocationMéxico

Escrito 17 julio 2017 - 10:00

Hola

 

Intenta con lo siguiente:

 

Agrega un componente TComDataPacket y configura las propiedades que te muestro en la imagen DataPacket.png

 

En el código eliminas el evento ComPort1RxChar  y agregas el evento OnPacket del componente ComDataPacket con el siguiente código:


delphi
  1. procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: string);
  2. begin
  3. Memo_Mensajes.Lines.Add( Str ); // Muestra los textos en pantalla.
  4. end;

Con eso ya estará solucionado el problema.

 

Saludos

Archivos adjuntos


  • 0