QT Creator y Arduino conexión con QSerialPort

En este tutorial te mostraremos como hacer una comunicación serial con QT Creator y Arduino con QSerialPort. La conexión ser hará mediante un puerto serial. Entonces el puerto serial se creará virtualmente en QT usando la clase QSerialPort. En este ejemplo se usará una configuración de 115200 Bauds, 8bits y no-paridad. Por lo tanto se tendrá un programa tanto en Arduino como en QT con la misma configuración de su puerto serial.

Se diseñará una aplicación gráfica en QT Creator para comunicar mediante el puerto serie a un Arduino. Entonces para este propósito se creará un «protocolo de comunicación» que usará el puerto serial. El protocolo que se diseño utiliza una cadena de caracteres ASCII en donde cada mensaje que se enviará al Arduino finaliza con \n. Este carácter es un fin de línea. Por ejemplo, la función de dicho protocolo será la de crear un lenguaje entre las instrucciones del Arduino y de QT.

Para este tutorial se requiere el siguiente conocimiento:

QT Creator y Arduino conexión con QSerialPort

 

Programa de Arduino para QT Creator

Para este tutorial se diseño un programa de Arduino para QT Creator. Esta aplicación tiene la función principal de recibir datos mediante la función de Arduino serialEvent. Por ejemplo, esta función se encarga de recibir cada byte serial en cada iteración de la función loop. Entonces cuando se recibe el carácter \n *fin de línea, la tarjeta esta lista para ejecutar una tarea. El protocolo que se diseño se basa en la recepción de números ascii que se terminan por convertir en una variable entera. Por ejemplo, a continuación se indican las acciones que se ejecutan al recibirse la siguiente información.

Programa de Arduino para QT Creator

 

Entonces la tarea principal del código de Arduino, será la de leer los datos seriales recibidos y convertirlos a una variable entera. Después, se usará a esta variable para determinar la acción para realizar. Si por ejemplo, llega el 1, esto significaría la acción de: encender el led 13. Por el contrario, si se recibe el 2, se apagaría el led 13. Finalmente si se recibe el numero 3, entonces Arduino escribirá por el puerto serial la lectura analógica del canal 0 del ADC. Esto último se escribirá como caracteres, por ejemplo, si en A0 se tiene 5VDC, entonces la acción imprimirá 4 bytes («1023») uno para cada carácter. A continuación se presenta el código completo.

Código de QT Creator y Arduino conexión con QSerialPort

El código de QT Creator para Arduino hará lo opuesto que el código de Arduino. Entonces la función principal de QT será el «escribir» en el puerto serial a la cadena de caracteres: «1\n, 2\n y3\n». Estas tres cadenas se estarán escribiendo dependiendo de la acción que se quiera realizar. Por ejemplo, se contará con un botón con memoria (PushButton con la opción «checkable» ), dicho botón enviara el 1 y el 2. Esto le permitirá a la tarjeta Arduino, el ejecutar las acciones que enciendan o apaguen el led.

El código de QT esta dividido en 2 secciones principales:

mainwindow.h

Aquí se declarará el puerto serial para Arduino con las siguientes instrucciones:

  • Clase privada QSerialPort:
    • QSerialPort *arduino;    //Esta será la declaración principal. Permitirá el usar el puerto serial (Arduino) en cualquier función de mainWindow.cpp.
  • Variables privadas:
    • static const quint16 arduino_uno_vendor_id = 9025;  //Permite identificar a un arduino.
    • static const quint16 arduino_UNO = 66;  //Codigo del Arduino uno.
    • static const quint16 arduino_MEGA = 67;  //Codigo del Arduino mega.
    • QString arduino_puerto;  //Variable para guardar el nombre del puerto de QSerialPort.
    • bool arduino_esta_disponible;   //Variable que indicaría si el Arduino se conecta o no.
  • Funciones privadas:
    • void buscaYconectaArduino(); Esta función incluye a las instrucciones para buscar los puertos que coincidan con un id de arduino y su conexión.
  • Bibliotecas:
    • #include <QSerialPort>.

mainWindow.cpp

En mainWindow.cpp se encuentran cinco funciones.

  1. void MainWindow::buscaYconectaArduino();  esta función tiene las instrucciones para conectar a un Arduino y modificar el texto de la etiqueta para indicar la conexión.
  2. MainWindow::MainWindow(QWidget *parent) : Está es la función principal que se genera al abrir la ventana. Entonces el proposito de esta función es ejecutar dos instrucciones importantes:
    1. ui->setupUi(this);   indica el inicio del código al cargar la ventana.
    2. buscaYconectaArduino();  busca y conecta si existe al Arduino con la siguiente configuración.
      1. Velocidad 115200 BAUDs.
      2. 8 bits de datos.
      3. 1 bit de parada.
      4. Sin bit de Paridad.
      5. Sin control de flujo.
      6. Lectura/Escritura.
  3. void MainWindow::on_pushButton_clicked() está función es la que se ejecutaría con el click del botón que tiene el texto «buscar». El propósito de la función es buscar y conectar un Arduino. Por ejemplo, se utilizaría en el caso de que la tarjeta se desconectara y se quisiera hacer una conexión manual. Por lo tanto, esta función en realidad sólo manda a llamar a la función: buscaYconectaArduino();
  4. void MainWindow::on_pushButton_2_clicked(bool checked). Está función es la que activa o apaga el led 13 de la tarjeta Arduino. El propósito de esta función es escribir en el puerto serial de Arduino, los caracteres 1 o 2. Si el Arduino recibe estos datos entonces activara o apagara el led.
  5. void MainWindow::on_pushButton_3_clicked() está función permite escribir el carácter «3» y además leerá el puerto serial. Dado que la instrucción que tiene la tarjeta Arduino, es que al recibir el 3, envíe los caracteres que correspondan al valor binario del ADC a0, entonces esta función también leerá y convertirá el valor para poder mostrarlo en el display LCD.

Proceso para crear el proyecto de QT Creator y Arduino con QSerialPort

A continuación se mostrará el proceso paso a paso para crear una GUI que permita una comunicación con Arduino y QT.

Paso # 1

El primer paso será crear un proyecto nuevo que llamaremos QT-Arduino. Después agregaremos a la interfaz gráfica (QT-Arduino.ui) los siguientes elementos:

  • Un Label (etiqueta) que se encuentra en la categoría «display widgets».
  • Tres botones del tipo (pushButton).
    • pushButton. El primer botón lo usaremos para crear una conexión con Arduino. Entonces para este botón, se creará la función clicked().
    • pushButton_2 nos permitirá enviar el 1 y el 2, por lo tanto se configurará para tener memoria (habilitar opción checkable). También se creará la función clicked, pero con la opcion (bool), es decir: clicked(bool).
    • pushButton_3, lo usaremos para leer el puerto serial, esta opción enviara la letra «3» y por lo tanto leerá la información que envíe Arduino y para representarla en el lcd.
    • lcdNumber, este elemento de salida nos representara la información binaria en el canal del ADC A0.

QT Creator con Arduino y QSerialPort

Paso # 2

Para el paso # 2 se modificará el archivo de configuración (QT-Arduino.pro) para agregar la compatibilidad para el puerto serial. Esto seria modificando la primera línea para que este como:

  • QT += core gui serialport

Paso # 3

Modificar el archivo mainwindow.h para que este como el siguiente:

Código de mainWindow.h

El código de mainWindow.h se modificará agregando alas clases, variables, bibliotecas y funciones indicadas en la primera sección.

Paso # 4

Se creará la función: void MainWindow::buscaYconectaArduino() dicha función tiene 3 elementos principales:

  1. La declaración inicial de las siguientes variables:
    1. arduino_esta_disponible = false;   //Si el arduino se puede conectar, se cambiará a true.
    2. arduino_puerto = «»;   //En esta variable se guardará el nombre del puerto serial («COMX» para windows o TTYUSB0 para Linux). Esta variable esta declarada como QString privada en mainwindow.h. Por lo tanto la puede ver cualquier función local a mainwindow.cpp.
    3. arduino = new QSerialPort; // Es la principal variable, ya que permite crear un puerto serial virtual en QT, se llamará arduino. Esta variable esta declarada en mainwindow.h.
    4. String nombreDispositivoSerial = «»;  //Permitirá guardar el ultimo puerto que encuentre la sección 2 de esta función, la cual se encarga de buscar todos los puertos arduino que estén actualmente conectados a la computadora.
    5. int nombreProductID = 0;  //En esta variable se guardará el numero del «product ID» que corresponda a un Arduino UNO o un Arduino MEGA.
  2. Buscar a todos los puertos que correspondan con el vendor ID de un Arduino UNO.
  3. Si se encontró un puerto con los números que lo identifican como un Arduino, entonces se realiza la conexión y apertura del puerto.

Paso # 5

Se crearán las funciones clicked para los tres botones. En cada uno de ellos se escribirá el siguiente código:

    • pushButton
  • pushButton_2
  • pushButton_3

Paso # 6

Para la función principal, aquella después de la instrucción:  ui->setupUi(this); se agregará la siguiente instrucción:

  • buscaYconectaArduino();

 

Código de mainWindow.cpp

Descarga el código de Arduino y QT completo

https://hetpro-store.com/TUTORIALES/EjemplosProgramas/QT-Arduino-1.zip 

Escríbenos tus dudas o comentarios

Usamos Cookies en nuestro sitio WEB

Por favor confirma, si aceptas nuestras cookies de rastreo. También puedes negar el uso de cookies de rastreo y seguir navegando sin que ninguna información sea enviada a servicios de terceros.