Controlar Arduino con C# y el puerto serie


arduino-con-csharp

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.

Esta comunicación tienen la ventaja de que puede ser realizada con gran variedad de dispositivos (como un ordenador, un tablet, un móvil), es independiente del sistema operativo (incluyendo Windows, Linux, Mac y Android) y puede realizarse en multitud de lenguajes de programación.

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.

Anuncio:

La comunicación puede realizarse tanto por cable como de forma inalámbrica por bluetooth, como vimos en la entrada Conectar Arduino por Bluetooth con los módulos HC-05 ó HC-06

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#.

También puedes usar Visual Studio para programar Arduino directamente, como vimos en la entrada
El mejor IDE para Arduino, Visual Studio con Visual Micro

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 )
            {
                ArduinoPort.Write(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.

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección Tutoriales de Arduino
5 2 votes
Article Rating

Anuncio:

Previous El mejor IDE para Arduino. Visual Studio con Visual Micro
Next Nuestro primer programa en Python
11 Comments
oldest
newest
Inline Feedbacks
View all comments
Adrian Ramirez n.n
4 years ago

muy padre, no podras hacer un ejemplo pero con MR522 ?

luisllamas
4 years ago

Supongo que te refieres al lector RFID MRC522.
Tienes el tutorial aquí https://www.luisllamas.es/arduino-rfid-mifare-rc522/
Un saludo!

Miguel
3 years ago
Reply to  luisllamas

¿Qué sentido tiene el código para la vinculación de eventos?, en el lenguaje c# es innecesario cuando ya estas asignando el código de cada tecla, este responderá al evento sin necesidad de nada mas

Perla Elizabeth Jimarez Rocha
3 years ago

Hola! tienes al libreria de Arduino para cominucar con C#? puedes poner algun tutoria de como instalarlo hehe gracias! tu pagina es muy buena 😀

luisllamas
3 years ago

Dentro de unas pocas entradas quiero compartir una librería para comunicación Arduino con C#. Pero sera de la zona de tutoriales avanzados osea que... ¡no va a ser tan fácil como esta entrada! Espero que te guste

Bladimir
3 years ago

Cómo seria para hacer un contador ascendente y descendente con display de 7 segmentos que se controlen por botones virtuales en C#?

Rolando
3 years ago

y para recivir datos del puerto serial? a c# como se le puede hacer

Kristian
2 years ago

como puedo encender varios leds, no, al mismo tiempo, si no cuando yo lo requiera

Emy
2 years ago

¿Cómo hacer que estas dos funciones de led funcionen en un solo programa?

marcos
1 year ago

hola como estas me gustaria realizar este proyecto,apagar una pc desde arduino ,estaba pensando hacerlo desde la comunicacion serial,y que el apagado este dado por el exceso de temperatura del procesador.Si me podrias dar una idea de como hacerlo estaria buenisimo.GRACIAS