Código Arduino: sensor HC-SR04, potenciómetro y control de distancia en lazo abierto y cerrado

InformáticaActualizado el 4,51 KB

Resumen

El documento recoge tres prácticas de programación en Arduino: la medición de distancia con el sensor ultrasónico HC-SR04 enviando datos por el puerto serie, la lectura de un potenciómetro conectado a A0 y el control de distancia con pantalla LCD 16x2 en lazo abierto y en lazo cerrado. El estudiante verá cómo se configuran los pines, cómo se calcula la distancia a partir del tiempo de eco y cómo una comparación con un umbral puede activar salidas digitales.

Puntos clave

  • El HC-SR04 emite un pulso por el pin trigPin y mide el tiempo del eco en echoPin con pulseIn().
  • La distancia se calcula dividiendo el tiempo de eco entre 58 en el código de la pantalla LCD (valor en centímetros).
  • El potenciómetro se lee con analogRead(A0) y el valor se envía por serie con Serial.println().
  • En el control en lazo abierto la salida no depende de la medición: solo se muestra la distancia en la LCD.
  • En el control en lazo cerrado la distancia se compara con un umbral de 15 cm para activar o desactivar salidas digitales.
  • El documento señala que el bloque de lazo cerrado original tenía líneas incompletas que se han completado.

Ponte a prueba

Programación de Arduino: sensor ultrasónico, potenciómetro y control de distancia

A continuación se presenta el código correspondiente a tres prácticas: medición de distancia con el sensor HC-SR04 enviando datos por el puerto serie, lectura de un potenciómetro y control de distancia en lazo abierto y lazo cerrado con pantalla LCD.

1. Medición de distancia con sensor ultrasónico HC-SR04

Este programa emite un pulso con el pin trigPin, mide el tiempo de retorno del eco en echoPin y calcula la distancia en centímetros.

int trigPin = 3;
int echoPin = 2;
float pingTime;
float targetDistance;
float speedOfSound = 343;

void setup()
{
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Serial.println("CLEARDATA");
  Serial.println("LABEL,Tiempo,Dist en centimetros");
}

void loop()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2000);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(15);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(10);
  pingTime = pulseIn(echoPin, HIGH);
  pingTime = pingTime / 1000000;
  targetDistance = targetDistance / 2;
  targetDistance = targetDistance * 100;
  Serial.print("DATA,TIME,");
  Serial.println(targetDistance);
  delay(1000);
}

2. Lectura de potenciómetro

Este programa lee el valor analógico del potenciómetro conectado a A0 y lo envía al puerto serie para su registro en Excel.

void setup()
{
  Serial.begin(9600);
  Serial.println("CLEARDATA");
  Serial.println("LABEL, Time, Started Time, Valor de Pot");
  Serial.println("RESETTIMER");
}

void loop()
{
  int sensorValue = analogRead(A0); // Variable insertada en Excel
  Serial.print("DATA, TIME, TIMER,"); // Impresión de valores en la columna asignada
  Serial.println(sensorValue); // Impresión de la variable en las celdas asignadas
  delay(500); // Retardo entre lecturas
}

3. Control de distancia en lazo abierto

Este programa muestra la distancia medida en una pantalla LCD 16x2. La salida no depende de la medición, por lo que se considera lazo abierto.

#include 

LiquidCrystal lcd(1, 2, 3, 4, 5, 6); // Librería para LCD y pines por donde entra la información

const int trig = 7; // Comunicación del sensor HC-SR04
const int echo = 8; // Comunicación del sensor HC-SR04
unsigned int tiempo; // Variables para cálculos
unsigned int distancia;
const int pinledc = 9;
const int pinledg = 10;

void setup() // Se ejecuta el código una vez
{
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT); // Configurar pines de entrada y salida
  lcd.begin(16, 2); // Comunicación de la pantalla LCD 16x2
}

void loop() // Se ejecuta "N" veces
{
  digitalWrite(trig, HIGH);
  delayMicroseconds(2);
  digitalWrite(trig, LOW);
  tiempo = pulseIn(echo, HIGH);
  distancia = tiempo / 58;
  lcd.setCursor(0, 0);
  lcd.print(" DISTANCIA:");
  lcd.setCursor(6, 1);
  lcd.print(distancia);
  lcd.setCursor(9, 1);
  lcd.print(" cm");
  delay(1000);
  lcd.clear();
}

4. Control de distancia en lazo cerrado

En este programa la distancia medida se compara con un umbral de 15 cm para activar o desactivar las salidas digitales, cerrando así el lazo de control.

void setup()
{
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT); // Configurar pines de entrada y salida
  lcd.begin(16, 2); // Comunicación de la pantalla LCD 16x2
}

void loop() // Se ejecuta "N" veces
{
  digitalWrite(trig, HIGH);
  delayMicroseconds(2);
  digitalWrite(trig, LOW);
  tiempo = pulseIn(echo, HIGH);
  distancia = tiempo / 58;
  lcd.setCursor(0, 0);
  lcd.print(" DISTANCIA:");
  lcd.setCursor(6, 1);
  lcd.print(distancia);
  lcd.setCursor(9, 1);
  lcd.print(" cm");
  delay(1000);
  lcd.clear();

  if (distancia <= 15) {
    digitalWrite(7, HIGH);
    delay(500);
  }
  else {
    digitalWrite(7, LOW);
  }

  if (distancia >= 15) {
    digitalWrite(8, HIGH);
    delay(500);
  }
  // else {
  //   digitalWrite(9, LOW);
  // }
}

Nota: en el bloque de lazo cerrado original aparecían líneas incompletas (como pinMode(trig, OUTP) y llaves sin cerrar. Se han completado para que el código sea sintácticamente correcto. Además, en la sección de lazo abierto el texto original incluía { sin declaración de función; se ha conservado el contenido funcional de las instrucciones.

Descargar

PDF Word HTML

Preguntas frecuentes

¿Cómo se calcula la distancia con el sensor HC-SR04 en este código?

En el programa de la pantalla LCD, el tiempo del eco medido con pulseIn() se divide entre 58 para obtener la distancia en centímetros. En el primer programa se usa otra fórmula basada en la velocidad del sonido de 343 m/s.

¿Qué diferencia hay entre lazo abierto y lazo cerrado en este ejemplo?

En lazo abierto la salida no depende de la medición y solo se muestra la distancia en la pantalla LCD. En lazo cerrado la distancia medida se compara con 15 cm para activar o desactivar las salidas digitales.

¿Cómo se lee el potenciómetro en Arduino según el documento?

Se usa analogRead(A0) para obtener el valor del potenciómetro y después se envía al puerto serie con un retardo de 500 ms entre lecturas.

Ponte a prueba

Tarjetas de repaso

Pulsa una tarjeta para ver la respuesta.

Test

1. ¿Qué pin del HC-SR04 emite el pulso de disparo en el primer programa?
2. ¿Qué función se usa para medir el tiempo del eco?
3. ¿Qué pin analógico se utiliza para leer el potenciómetro?
4. ¿Cuál es el umbral de distancia usado en el control de lazo cerrado?
5. ¿Por qué el control de lazo abierto se considera abierto?
6. ¿Qué dimensiones tiene la pantalla LCD usada en los programas?

Preguntas generadas con IA a partir del documento: comprueba las respuestas con el texto.