Conexión PC-Arduino por USB

Conexión PC-Arduino por USB

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:

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

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.