- Montaje realizado para probar la comunicación serie (USB) entre el PC y el Arduino Nano.
- En el Arduino Nano está conectado un LED, un botón PULSADOR y un display LCD de 16x2 caracteres.
- Desde el momento que se conectan el PC y el Arduino, el programa en el PC usa una thread o hilo de ejecución para estar escuchando constantemente lo que envía Arduino y lo muestra en pantalla.
- Desde el programa se puede activar o desactivar el led o enviar textos al display LCD y cuando en el Arduino se pulsa el botón, se envía un mensaje al PC para indicar que se ha pulsado el botón.
- El programa también tiene una opción para enviar preguntas o textos al Arduino que el microcontrolador reenvía luego nuevamente al PC para comprobar su correcta recepción.
- La programación se ha realizado en Lazarus y se ha probado en Linux tipo Debian de 64 bits y en Windows 11 de 64 bits.
- Se ha probado usando velocidades de 9.600 y 115.200 baudios. Es posible que en otros PC o con diferentes velocidades de transmisión haya que variar algunos "delay" o tiempos de espera en el código del programa para el PC.
- Para manejar las comunicaciones serie del lado del PC este programa usa la librería gratuita SYNAPSE (synaser) de Ararat http://www.ararat.cz/synapse/
- El programa no chequea la falta de conexión, al pulsar el botón "Conectar" da por hecho que hay conexión.
- El puerto (USB) de conexión hay que indicarlo manualmente, el programa no muestra los puertos existentes. En Linux el puerto USB tendrá algún nombre tipo "/dev/ttyUSB0" o "/dev/ttyS0", etc. El usuario de Linux que ejecute el programa tendrá que estar normalmente en el grupo "dialout" para tener permisos de manejo del puerto (Para agregar el usuario a este grupo se puede usar una orden como:
sudo usermod -a -G dialout "${USER}"
). En Windows el puerto se puede indicar como "COM4:" o "COM4" o también como "\\.\COM4", "COM5:", "COM6:", "COM7:", etc. Si se trata de un número de puerto superior al 9 hay que indicarlo con el siguiente formato: "\\.\COM10" (en el caso del COM10:). - El software realizado para Arduino y PC en esta prueba es libre. Su código fuente se puede descargar al final de esta página. Se puede usar y modificar libremente. No se ofrecen garantías de su funcionamiento, inexistencia de virus o cualquier perjuicio que su utilización pudiese ocasionar.
Pulsa en la siguiente imagen si quieres ver un vídeo del funcionamiento de este montaje (Archivo MP4. Tamaño: 49 MB)
Esquema de conexiones
Al poner en marcha el Arduino se muestran los siguientes datos en el LCD...
Programa del PC ejecutándose en Linux. Los datos recibidos desde el Arduino se muestran en la parte derecha de la pantalla. En la parte superior derecha se muestran los bytes recibidos (en formato decimal) y en la parte inferior derecha se muestran en forma de texto (en este caso solo se muestran aquellos bytes "imprimibles" o con valores > 27).
Programa realizado para el Arduino Nano
Se ha usado Arduino IDE para editar, compilar y subir el código al Arduino.
El PC envía diferentes comandos o instrucciones al Arduino a través del puerto serie (USB). El programa en el Arduino admite las siguientes instrucciones:
- "on" = Encender el led
- "off" = Apagar el led
- "pregunta" + texto de la pregunta = Arduino devuelve al PC el texto o pregunta recibida por el USB
- "lcd" + 16 caracteres a imprimir en la primera línea + 16 caracteres para imprimir en la línea 2 del LCD
Si se pulsa el botón conectado al Arduino, éste envía al PC mediante el USB un aviso para indicar que se ha pulsado el botón.
Contenido del fichero "arduinoseriallcdboton.ino" que se ejecuta en el Arduino Nano:
/* * Programa para probar la conexión entre PC y Arduino por puerto serie o USB * * Programa realizado para Arduino Nano. * * En el Arduino hay conectados un led, un botón-pulsador y un display LCD de 16 caracteres por * 2 líneas tipo HD44780U. * * El LED está conectado al pin 6 del Arduino. * * El PULSADOR está conectado al pin 7 del Arduino. * * El display LCD está conectado de la siguiente forma: * * PIN Arduino | PINs LCD * ------------|------------ * PIN2 | LCD4 (RS) * PIN3 | LCD5 (R/W) * PIN4 | LCD6 (E) * PIN8 | LCD11 (D4) * PIN9 | LCD12 (D5) * PIN10 | LCD13 (D6) * PIN11 | LCD14 (D7) * * JIDS 04/03/2023 https://alinos.sytes.net */ #include <LiquidCrystal.h> LiquidCrystal lcd(2, 3, 4, 8, 9, 10, 11); // Pins del LCD (RS, RW, E, D4, D5, D6, D7) const int led1 = 6; // Led conectado al pin 6 de Arduino const int pulsadorPin1 = 7; // Pulsador conectado al pin 7 de Arduino int valorPulsador1 = 0; void setup() { lcd.begin(16, 2); // Inicia un LCD 16x02 (columnas,filas) lcd.setCursor(0, 0); // Pone el cursor en las coordenadas (0,0) lcd.print("JIDS HD44780U"); // Escribe en el LCD lcd.setCursor(0, 1); // Pone el cursor en la segunda fila del LCD lcd.print("alinos.sytes.net"); // Escribe en el LCD pinMode(led1, OUTPUT); pinMode(pulsadorPin1, INPUT); Serial.begin(115200); Serial.flush(); } void loop () { valorPulsador1 = digitalRead(pulsadorPin1); // Comprueba si el botón está pulsado delay(150); if (valorPulsador1 == HIGH) { digitalWrite(led1, HIGH); // Si el botón está pulsado enciende el led Serial.println("PULSADOR1"); // y envía al PC la plabra "PULSADOR1" delay(50); digitalWrite(led1, LOW); // despues de 50 ms apaga el led } String input = ""; String st = ""; String linea1 = ""; String linea2 = ""; // El siguiente bucle lee cualquer entrada de datos por el puerto serie (USB) y la va almacenando en la cadena "input" while (Serial.available() > 0) { input += (char) Serial.read(); // Lee un caracter cada vez delay(5); // Espera 5 ms hasta que se reciba el siguiente caracter } // Cuando ya terminó de leer la cadena (input) comprueba si los datos recibidos incluyen alguna de las "instrucciones" // previstas en las siguientes líneas de código: "on", "off", "pregunta" y "lcd"... // Si la orden recibida es "on" enciende el led que permanece encendido if (input == "on") { digitalWrite(led1, HIGH); Serial.println("Recibido ON"); delay(2000); } // Si la orden recibida es "off" apaga el led if (input == "off") { digitalWrite(led1, LOW); Serial.println("Recibido OFF"); delay(20); } // Si la orden recibida es "pregunta", devuelve por el USB esos datos que le llegaron. La pregunta espera // que venga en la misma cadena, a continuación de la instrucción. Esto sirve para comprobar lo que le llega al Arduino st = ""; st = input.substring(0, 8); if (st == "pregunta") { Serial.println("Estos son los datos recibidos: " + input); delay(1000); } // Si la orden recibida es "lcd" le envía al display LCD de 16x2 caracteres los datos recibidos // La orden tiene que tener el formato: "lcd" + 16 caracteres para la primera línea del LCD + 16 caracteres para la fila 2 st = ""; st = input.substring(0, 3); if (st == "lcd") { linea1 = ""; linea2 = ""; linea1 = input.substring(3, 19); // Toma los 16 primeros carateres que vengan después de la palabra "lcd" para escribir en la línea1 linea2 = input.substring(19, 36); // y toma los siguientes 16 carateres que vengan para la escribir en la línea2 lcd.setCursor(0, 0); // Pone el cursor en las coordenadas (0,0) lcd.print(linea1); // Escribe el LCD los 16 caracteres de la línea 1 lcd.setCursor(0, 1); // Pone el cursor en las coordenadas (0,1) lcd.print(linea2); // Escribe el LCD los 16 caracteres de la línea 2 delay(1000); // A continuación le envía al PC por USB los textos que ha recibido para mostrar en el LCD Serial.println("Se va a imprimir en la línea 1 del LCD: " + linea1); delay(100); Serial.println("Se va a imprimir en la línea 2 del LCD: " + linea2); delay(1000); digitalWrite(led1, HIGH); // Enciende el led durante medio segundo delay(500); digitalWrite(led1, LOW); // y apaga el led delay(2000); } }
Pulsa aquí para descargar el programa para Arduino: programa-arduino.zip (Archivo ZIP. Tamaño: 1,8 KB)
Programa para el PC
- Descargar ejecutable del programa para el PC con Linux tipo Debian de 64 bits: programa-pc-linux-64bits.zip (Archivo ZIP. Tamaño: 6,7 MB)
- Descargar ejecutable del programa para el PC con Windows: programa-pc-windows-64bits.zip (Archivo ZIP. Tamaño: 5 MB)
- Descargar el código fuente del programa para el PC con Linux: codigo-fuente-linux-conexion-pc-arduino-usb.zip (Archivo ZIP. Tamaño: 131 KB)
- Descargar el código fuente del programa para el PC con Windows: codigo-fuente-windows-conexion-pc-arduino-usb.zip (Archivo ZIP. Tamaño: 131 KB)
- Descargar la librería SYNAPSE desde la web de Ararat: http://www.ararat.cz/synapse/lib/exe/fetch.php/file:synapse40.zip (Archivo ZIP. Tamaño 898 KB)
Compilar la aplicación
El programa para el PC se ha realizado en Lazarus (FreePascal) y utiliza la librería SYNAPSE (synaser) de Ararat http://www.ararat.cz/synapse/ para el manejo de las comunicaciones serie.
En las "Opciones del proyecto" hay que indicarle la ruta en la que estén las librerías SYNAPSE. En este caso esta librería estaba en una carpeta llamada: "synalist-code-r267-trunk"...
Identificar el puerto USB
Para localizar en Linux el puerto USB del PC en el que está conectado Arduino se puede usar una orden: ls /dev/tty*
Para localizar en Windows el número o nombre del puerto USB se puede consultar el "Administrador de dispositivos" en el "Panel de Control" o en "Configuración". También se podría ir a "Inicio", "Ejecutar" y escribir la instrucción "devmgmt.msc" que abre el "Administrador de dispositivos"...
En la imagen anterior muestra el puerto USB en el que está conectado el chip CH340 usado por Arduino.