comunicar-arduino-con-c

Controlar Arduino con C# y el puerto serie

Cuando vimos el uso del puerto serie en Arduino en esta entrada, ya adelantamos que era el medio principal del que disponíamos para comunicación con Arduino con otros dispositivos.

En esta entrada vamos a aprender a conectar Arduino con C#, el popular lenguaje de programación de Microsoft, que dispone de forma nativa objetos para usar de forma muy sencilla los puertos de serie.

Para ello es necesario tener instalado Visual Studio, el IDE de Microsoft. La versión “Community” es gratuita para uso personal, y puede ser descargada desde este enlace.

Para ver la forma de conectar Arduino con C# vamos a ver dos ejemplos sencillos, los mismos que vimos en la entrada Comunicación de Arduino con puerto serie. Pero esta vez realizaremos la comunicación desde un programa desarrollado en C#, en lugar de usar el Serial Monitor del IDE de Arduino.

El código de C# que vamos a mostrar es muy sencillo (casi me da vergüenza publicarlo) porque son ejemplos para ilustrar lo fácil que es usar el puerto serie para conectar Arduino con C#. Pero tener en cuenta que en un proyecto real deberíamos incluir algunas mejoras.

Por ejemplo, el uso del puerto serie estaría integrado en nuestros objetos y tendríamos independencia entre capa visual y modelo. Además, normalmente transmitiríamos bytes en lugar de texto, e incluiríamos verificaciones para asegurar que la transmisión se ha realizado correctamente.

Vemos esto en futuras entradas pero, de momento, nos conformamos con aprender a usar lo básico de los puertos de serie para comunicar Arduino con C#.

Encender y apagar un LED

En este ejemplo vamos a hacer un formulario simple con dos botones de ON y OFF, que nos permitirán encender el LED integrado en la placa de Arduino, conectado al Pin13.

En primer lugar arrancamos Visual Studio, y creamos un nuevo proyecto de C#. Para ello pulsamos en File/New/Project.

Elegimos el template “Windows Form Application”, la ubicación en la que queremos guardarlo en nuestro disco duro y como nombre del proyecto “BasicSerialPort”.

arduino-chsarp-1

Se abrirá un formulario vacio, que será la ventana principal de nuestro ejemplo. Arrastramos desde el Toolbox dos botones hasta nuestro formulario, y los ponemos uno encima del otro.

arduino-chsarp-2

Ahora empleamos la barra de propiedades para cambiar el texto y el nombre tanto de los botones como del formulario.

arduino-chsarp-3

Dejamos los valores como muestra la siguiente tabla.

ElementoNameText
FormulariofrmMainBasic C#
Boton ONbtOnON
Boton OFFbtOffOFF

Ahora, pulsamos F7 encima del formulario para acceder al código (o pulsamos con el botón derecho y elegimos “View code”).

arduino-chsarp-4

Reemplazamos todo el código por el siguiente.

using System;
using System.Windows.Forms;

namespace BasicSerialPort
{
    public partial class frmMain : Form
    {
        System.IO.Ports.SerialPort ArduinoPort;

        public frmMain()
        {
            InitializeComponent();

            //crear Serial Port
            ArduinoPort = new System.IO.Ports.SerialPort();
            ArduinoPort.PortName = "COM4";  //sustituir por vuestro 
            ArduinoPort.BaudRate = 9600;
            ArduinoPort.Open();

            //vincular eventos
            this.FormClosing += FrmMain_FormClosing;
            this.btOFF.Click += BtOFF_Click;
            this.btON.Click += BtON_Click;
        }

        private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            //cerrar puerto
            if (ArduinoPort.IsOpen) ArduinoPort.Close();
        }

        private void BtOFF_Click(object sender, EventArgs e)
        {
            ArduinoPort.Write("a");
        }

        private void BtON_Click(object sender, EventArgs e)
        {
            ArduinoPort.Write("b");
        }
    }
}

Recuerda sustituir el puerto serie del código, en el ejemplo “COM4”, por el puerto serie en el que tengas conectado Arduino.

Ahora cargamos este programa en Arduino.

const int pinLED = 13;

void setup()
{
  Serial.begin(9600);
  pinMode(pinLED, OUTPUT);
}

void loop() {/
  if (Serial.available() > 0)
  {
    int option = Serial.read();
    if (option == 'a')
    {
      digitalWrite(pinLED, LOW);    
    }
    if (option == 'b')
    {
      digitalWrite(pinLED, HIGH);
    }
  }
}

Ejecutamos el programa pulsando F5. Pulsamos los botones, y veremos que se enciende y se apaga el LED integrado de Arduino.

Hacer parpadear un LED

Vamos a modificar el programa anterior para enviar un número de 0 a 9 a Arduino. Arduino recibirá ese número, y hará parpadear el LED integrado el número de veces recibido.

Para ello comenzamos modificando el formulario del ejemplo anterior. Eliminamos uno de los dos botones y arrastramos desde la Toolbox un nuevo Textbox.

arduino-chsarp-5

Usamos la paleta de propiedades para modificar las propiedades del Textbox y el botón restante. Dejamos los valores según la siguiente tabla.

ElementoNameText
FormulariofrmMainBasic C#
Boton SendbtSendSend
TextboxtxNumber

Ahora editamos el código del formulario, y lo sustituimos por el siguiente.

using System;
using System.Windows.Forms;

namespace BasicSerialPort
{
    public partial class frmMain : Form
    {
        System.IO.Ports.SerialPort ArduinoPort;

        public frmMain()
        {
            InitializeComponent();

            //crear Serial Port
            ArduinoPort = new System.IO.Ports.SerialPort();
            ArduinoPort.PortName = "COM4"; //sustituir por vuestro 
            ArduinoPort.BaudRate = 9600;
            ArduinoPort.Open();

            //vincular eventos
            this.FormClosing += FrmMain_FormClosing;
            this.btSend.Click += BtSend_Click;
        }

        private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            //cerrar puerto
            if(ArduinoPort.IsOpen) ArduinoPort.Close();
        }

        private void BtSend_Click(object sender, EventArgs e)
        {
            //convertir texto de Textbox en integer
            int value;/
            bool rst = Int32.TryParse(txNumber.Text, out value);

            //si la conversion es válida, y número entre 0 y 9
						// enviar el número como texto
            if (rst == true && value > 0 && value < 9 )
            {
     /te(value.ToString());
            }
        }
    }
}

Cargamos este programa en Arduino.

const int pinLED = 13;

void setup() 
{
  Serial.begin(9600);
  pinMode(pinLED, OUTPUT);
}

void loop()
{
  if (Serial.available()>0) 
  {
    char option = Serial.read();
    if (option >= '1' && option <= '9')
    {
      option -= '0';
      for (int i = 0;i<option;i++) 
      {
        digitalWrite(pinLED, HIGH);
        delay(100);
        digitalWrite(pinLED, LOW);
        delay(200);
      }
    }
  }
}

Ejecutamos el programa en Visual Studio pulsando F5. Al introducir un número entre 0 y 9, veremos como el LED de la placa parpadea el número de veces indicado.

Hasta aquí una primera presentación de comunicación de Arduino con C#. En el futuro emplearemos métodos más avanzados para manejar servos y robots.

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full