Delphi - Encender y apagar un Led con Delphi y Arduino

   
Vista:

Encender y apagar un Led con Delphi y Arduino

Publicado por Meta (10 intervenciones) el 14/07/2017 20:08:47
Hola:

Hace un tiempo, hice un tutorial controlando Arduino y puerto serie en C++ con C++ Builder Starter entre otros compiladores.

Ahora ya de unos meses de descanso sobre programación, quiero retomar hacer algo similar pero con Windows Form y el lenguaje Delphi.

Primera parte:
La idea es, añadir dos botones desde el formulario, que al pulsar un botón envíe carácteres por el puerto serie. Esto hace encender un Led o apagarlo.

Segunda parte:
Cuando acabe la primera parte, seguimos en que por el puerto serie entras letras o carácteres para leer.

La interfaz Windows Form en Delphi Tokio 10.2 hay que enviar caracteres al puerto serie y que sea capaz de recibir datos también. Les dejo un ejemplo de una plantilla.

delphi-led-1755606

Los tutoriales que he encontrado son muy antiguos y con Delphi 7, no me interesa. Si encuentra algo para esta época, mejor, nos podemos ayudar.

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

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder

Encender y apagar un Led con Delphi y Arduino

Publicado por E.T. (1136 intervenciones) el 14/07/2017 20:38:35
Los tutoriales de delphi 7, si se hace uso de componentes nativos, funcionan a la perfeccion con las versiones nuevas de delphi





http://mc-computing.com/Languages/Delphi/Delphi_SerialIO.htm

No se porque dices antiguo, si en realidad el lenguaje no ha cambiado, al igual que los demás. Talvez el entorno de desarrollo sea distinto pero la sintaxis sigue siendo igual
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Víctor

Encender y apagar un Led con Delphi y Arduino

Publicado por Víctor (15 intervenciones) el 14/07/2017 22:35:05
he usado la unidad:

1
2
3
4
5
6
7
8
9
10
11
12
(******************************************************
 * ComPort Library ver. 4.11                          *
 *   for Delphi 5, 6, 7, 2007-2010,XE  and            *
 *   C++ Builder 3, 4, 5, 6                           *
 * written by Dejan Crnila, 1998 - 2002               *
 * maintained by Lars B. Dybdahl, 2003                *
 * Homepage: http://comport.sf.net/                   *
 *                                                    *
 * Brian Gochnauer Oct 2010                           *
 *     Removed ansi references for backward compat    *
 *     Made unicode ready                             *
 *****************************************************)

para programas de comunicación con arduino (UNO y MEGA), con excelentes resultados.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Encender y apagar un Led con Delphi y Arduino

Publicado por Meta (10 intervenciones) el 14/07/2017 23:41:48
Antes que nada, gracias a los dos por los enlaces.

Como estoy oxidado con Delphi.

¿Pueden ayudar en cómo se envía esta palabra "Luz_ON" en el botón de Delphi ON?

Creo que este mini ejemlo que pido es suficiente para saber si puedo enviar comandos. Espero que me haga caso Arduino.

Hace meses hice un turorial en C++ win32 con Arduino y me funciona, con Delphi no me entero mucho, en este lenguaje quiero ser capaz de enviar comandos y recibirlos.

Ver turorial.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Víctor

Encender y apagar un Led con Delphi y Arduino

Publicado por Víctor (15 intervenciones) el 15/07/2017 02:14:57
renombrado el componente:

1
Puerto : TComPort;

y usando las siguientes constantes:

1
2
3
4
5
6
7
8
9
Desconectar:Array[1..8]of char=('1',#255,#255,#255, #255, #255, #255,  #0);
  Detener    :Array[1..8]of char=('1',  #0,  #0,  #0,   #0,   #0,   #0,  #0);
  Lectura    :Array[1..8]of char=('0',  #0,#255,#255,   #0, #255, #255,  #0);
  Reset      :Array[1..8]of char=('2',  #0,  #0,  #0,   #0,   #0,   #0,  #0);
  Pinza_0    :Array[1..8]of char=('3',  #0,  #0,  #0,   #0,   #0,   #0, '0');
  Pinza_1    :Array[1..8]of char=('3',  #0,  #0,  #0,   #0,   #0,   #0, '1');
  Sonido_1   :Array[1..8]of char=('4',  #0,  #0,  #0,   #0,   #0,   #0, '1');
  Sonido_2   :Array[1..8]of char=('4',  #0,  #0,  #0,   #0,   #0,   #0, '2');
  Sonido_3   :Array[1..8]of char=('4',  #0,  #0,  #0,   #0,   #0,   #0, '3');

entonces me basta lo siguiente para enviar una orden desde mi programa hacia el arduino:

1
2
3
4
procedure TFrmBase.VrPinzaLowerClick(Sender: TObject);
begin
  if Puerto.Connected then Puerto.Write(Pinza_0,8)
end;

Esto es parte de un programa que hice para controlar al viejo robot "Monty", al cual le adapté un arduino en lugar del pic16f84 original, el programa lo hice hace años, en delphi 10, y estaba pensado para controlar al robot desde la computadora así cómo recibir desde el robot del estado de los sensores.

En arduino:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
void loop(){
  if(Serial.available() > 7){
 
    // Lectura de Buffer de entrada
    Accion= Serial.read();
    VelM1 = Serial.read(), DrM1A = Serial.read(), DrM1B = Serial.read();
    VelM2 = Serial.read(), DrM2A = Serial.read(), DrM2B = Serial.read();
    Aux   = Serial.read();
    Serial.flush();
 
    switch(Accion){
    case '0': // Informar estado de los sensores
      Serial.print(digitalRead(SnsIz)); //Interruptores
      Serial.print(digitalRead(SnsDr));
      /*
      Serial.print(analogRead(Anal_5)/4);  Serial.print(analogRead(Anal_4)/4); Serial.print(analogRead(Anal_3)/4);  
      Serial.print(analogRead(Anal_2)/4);  Serial.print(analogRead(Anal_1)/4);  Serial.print(analogRead(Anal_0)/4);
      */
 
      //Reflexivos
      if(analogRead(Anal_5) < 512) Serial.print('0'); else Serial.print('1');
      if(analogRead(Anal_4) < 512) Serial.print('0'); else Serial.print('1');
 
      if(analogRead(Anal_3) < 512) Serial.print('0'); else Serial.print('1');
      if(analogRead(Anal_2) < 512) Serial.print('0'); else Serial.print('1');
      if(analogRead(Anal_1) < 512) Serial.print('0'); else Serial.print('1');
      if(analogRead(Anal_0) < 512) Serial.print('0'); else Serial.print('1');
      break;
    case '1': // Accionar los actuadores 
      ActualizarMotor(pinEN1, pinA1, pinB1, VelM1, DrM1A, DrM1B);
      ActualizarMotor(pinEN2, pinA2, pinB2, VelM2, DrM2A, DrM2B);
      break;
    case '2': // Reset
      setup();
      break;
    case '3': // Pinza
      if(Aux == '1') AccionarPinza(HIGH, LOW);
      else AccionarPinza(LOW, HIGH);
      delay(150);
      AccionarPinza(LOW, LOW);
      break;
    case '4': // Sonido
      switch(Aux){
      case '1': // Primera mitad de la melodía
        Tonos(0, Medio);
        break;
      case '2': // Segunda mitad de la melodía
        Tonos(Medio + 1, MAX_COUNT);
        break;
      case '3': // Melodía completa
        Tonos(0, MAX_COUNT);
        break;
      case '4': // Una nota, alarma
        Tonos(DrM2B, DrM2B);
        break;
      }
      break;
    case '5': // Consulta de estado
      Serial.print('.');Serial.print('L');Serial.print('I');Serial.print('S');Serial.print('T');Serial.print('O');Serial.print('!');Serial.print('.');
      break;
    }
  }
}

espero te sea de utilidad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Encender y apagar un Led con Delphi y Arduino

Publicado por Meta (10 intervenciones) el 15/07/2017 04:08:17
Buenas:

Me mola lo del robot. Voy a mirar bien tu idea.

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í:
1
2
3
4
procedure TFrmBase.VrPinzaLowerClick(Sender: TObject);
begin
  if Puerto.Connected then Puerto.Write("Luz_ON"); // Enciende el Led.
end;

No se si tengo algo mal en Delphi, le puse doble comilla y ; al final.

En Visual C# funciona de forma sencilla así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
using System.IO.Ports; // No olvidar.
 
namespace Arduino_Led
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            // Abrir puerto mientras se ejecuta esta aplicación.
            if(!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Open(); // Abrir puerto.
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
        }
 
        // Si pulsas el botón
        private void button_Encender_Click(object sender, EventArgs e)
        {
            // Envía la codificación en ASCII 
            byte[] mBuffer = Encoding.ASCII.GetBytes("Led_ON");
            // el comando "Led_ON".
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }
 
        private void button_Apagar_Click(object sender, EventArgs e)
        {
            byte[] mBuffer = Encoding.ASCII.GetBytes("Led_OFF");
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }
    }
}

Así te haces una idea para hacerlo yo en Delphi en este caso encender y apagar el Led.

Voy hacer experimentos sobre la explicación que me diste si sirve de algo.

Antes que nada, descargar el comport.

Comport Library

Vídeo de instalar comport en Delphi 7, no encuentro vídeo para instalar en Delphi 10.


Ya les contaré hasta donde he llegado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Encender y apagar un Led con Delphi y Arduino

Publicado por Meta (10 intervenciones) el 15/07/2017 05:13:12
Hola de nuevo:

He conseguido un vídeo que si está el tutorial de como se instala la librería comport para el Delphi 10.1 que es igual.



Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Víctor

Encender y apagar un Led con Delphi y Arduino

Publicado por Víctor (15 intervenciones) el 15/07/2017 16:57:40
lo del robot tiene cómo defecto que la comunicación es vía cabe, eso de andar corriendo con una netbook detrás del robot... siempre dije que debería hacer la conexión vía BT, pero ahí está, durmiendo desde el 2011...

éxitos!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Encender y apagar un Led con Delphi y Arduino

Publicado por Meta (10 intervenciones) el 15/07/2017 18:31:04
Hola:

Lo del robot, hoy en día en vez de dejarlo dormir, cuando tengas ánimos puedes hacer modificaciones. Tendrás que usar dos Arduinos con su RF. La ventaja, que el estandar RS232 es la misma, así que ni tienes que tocar los códigos Delphi para nada.

Transmitter_Receiver_Fritzing_V2

Ya creé la primera parte de solo enviar comandos al puerto serie.
delphi-led-2-1756006

¿Puedes ayudar?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Encender y apagar un Led con Delphi y Arduino

Publicado por E.T. (1136 intervenciones) el 15/07/2017 19:50:42
Esta linea no marca error cuando intentas compilar
1
if Puerto.Connected then Puerto.Write("Luz_ON");
porque segun yo debería ser
1
if Puerto.Connected then Puerto.Write('Luz_ON');
con coma sencilla, si es que el componente escribe una cadena
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Encender y apagar un Led con Delphi y Arduino

Publicado por Meta (10 intervenciones) el 17/07/2017 02:53:32
Hola:

Haciendo esta interfaz con Delphi 10.2, al recibir datos, el scroll se queda arriba y no veo los datos actualizados.

aaaaaaaa-1756345

Tengo que bajar el scroll manualmente para ver los datos actualizados. Quiero saber, si es posible, que el scroll de la barra se quede abajo siempre, así se muestran los datos nuevos del Memo actualizado.

Como muestra en la imagen de abajo, debe mostrar la barra siempre abajo. Si existe la posibilidad de hacerlo. ¿Cómo se hace?

aaaaaaaa-1756347

Saludos.

PD: He tardado en respodner porque ya me funciona menos lo que he escrito arriba.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Encender y apagar un Led con Delphi y Arduino

Publicado por E.T. (1136 intervenciones) el 17/07/2017 17:25:04
Es un Memo lo que estas usando, pues al hacer esto:
1
Memo1.Lines.Add('hola');
automáticamente se va a la última línea
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar