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)
- 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.
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#.
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”.
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.
Ahora empleamos la barra de propiedades para cambiar el texto y el nombre tanto de los botones como del formulario.
Dejamos los valores como muestra la siguiente tabla.
Elemento | Name | Text |
---|---|---|
Formulario | frmMain | Basic C# |
Boton ON | btOn | ON |
Boton OFF | btOff | OFF |
Ahora, pulsamos F7 encima del formulario para acceder al código (o pulsamos con el botón derecho y elegimos “View code”).
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.
Usamos la paleta de propiedades para modificar las propiedades del Textbox y el botón restante. Dejamos los valores según la siguiente tabla.
Elemento | Name | Text |
---|---|---|
Formulario | frmMain | Basic C# |
Boton Send | btSend | Send |
Textbox | txNumber |
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.