Archivo de la categoría: sensor

Sensor capacitivo

Los sensores capacitivos se utilizan comúnmente para la detección de objetos. Pueden utilizarse, por ejemplo, para detectar el paso de un objeto en una cinta transportadora o para detectar el nivel de un líquido en un tanque. Los sensores capacitivos se usan en pantallas táctiles o como interruptores. En esta entrada veremos cómo crear un sensor capacitivo utilizando un simple conductor y un microcontrolador.

Principio de funcionamiento

Un sensor capacitivo funciona como una antena que genera un campo eléctrico. Cuando un material se acerca a la antena, cambiará la capacidad de este campo. El microcontrolador detecta esta diferencia y puede determinar la proximidad del objeto. Con esta tecnología, es posible transformar cualquier objeto conductor en un sensor.

capacitive-touch-principle

Sigue leyendo

Sensor Óptico infrarrojo TCRT5000

El  Sensor Óptico TCRT5000 es un sensor ideal para detectar un cambio en la superficie sobre la cual está trabajando, El módulo incluye un sensor TCRT5000 óptico reflectivo infrarrojo, incluye el circuito Integrado LM393 como comparador de voltaje, es ideal para la detección de productos en bandas transportadoras y líneas de producción, líneas en robots de carreras seguidores de línea y sumos, aunque podemos encontrarle utilidad en cualquier otro proyecto electrónico que deseemos realizar.

Captura de pantalla 2023-11-01 a las 12.40.03

El TCRT5000 es un sensor que incluye el emisor y el receptor en el mismo empaquetado. El módulo funciona con IR lo que lo hace inmune a la luz visible.

Sigue leyendo

ThingSpeak, NodeMCU y sensores LDR y DTH11.

Vamos a diseñar, cablear y programar una aplicación de manera que el microcontrolador NodeMCU ESP8266 lea la salida analógica del módulo del sensor de iluminación LDR.

También deberá leer la humedad relativa del aire y la temperatura en grados Celsius del módulo del sensor DTH11.

Toda esta información se mostrará de forma ordenada por el Monitor Serie del IDE de Arduino a intervalos de 20 segundos.

Cuando la lectura analógica del módulo LDR, esté por encima de 600 (luminosidad baja), mostraremos además el mensaje Iluminación: Desactivada y si está por debajo de 600 (luminosidad alta), mostraremos Iluminación: Activada. La salida del Monitor Serie podría tener el siguiente aspecto:

Captura de pantalla 2022-02-06 a las 20.22.36

Sigue leyendo

Sensor iluminación mediante LDR (LM393)

lDR

El módulo sensor de iluminación LM 393, mediante una resistencia dependiente de la
luz o fotoresistor (LDR o lightdependent resistor ), se presenta integrado en una placa con cuatro terminales, A0, D0, GND y Vcc (aunque existen versiones con solo tres terminales y D0 desaparece). Además, está provisto de un comparador de tensión LM 393 y un potenciómetro para el ajuste del disparo según el umbral de luz.

 

Sigue leyendo

Sensor MQ135

MQ135

OBJETIVOS

  1. Conocer el sensor analógico de medición de calidad del aire MQ135.
  2. Realizar el montaje de uso del sensor MQ135 para la detección de la concentración de determinados gases para medir la calidad del aire.
  3. Realizar un programa de control mediante Arduino, para la medición de la calidad del aire utilizando el sensor MQ135.
  4. Visualizar parámetros a través del monitor serie del IDE de Arduino.

El sensor MQ135, es un dispositivo con salida dual, analógico y digital TTL, que permite la medición de la calidad del aire mediante la detección de gases como el amoníaco, benceno, alcohol, dióxido de nitrógeno, dióxido y monóxido de carbono. Este sensor es de alta sensibilidad y respuesta rápida, aunque necesitará de un tiempo de calentamiento, entre 24 y 48h, para su correcto funcionamiento.

 

Sigue leyendo

Calibrar MPU6050

Para que las medidas del MPU6050 sean totalmente precisas es necesario ajustar, realizar una calibración para ajustar los valores de offset. Para esto tenemos este programa, que nos proporciona los valores de offset de nuestro sensor. Es necesario ejecutarlo para cada MPU6050, ya que puede haber una gran variación de uno a otro.

Las librerías I2Cdev y MPU6050 deben estar instaladas.

#include «I2Cdev.h»
#include «MPU6050.h»
#include «Wire.h»

//////////////////////////////// CONFIGURACIÓN /////////////////////////////
///Cambia estas 3 variables para ajustar el programa a tus necesidades.

// Cantidad de lecturas utilizadas para promediar,  más alto para obtener más precisión, pero el programa será más lento (predeterminado: 1000)

int buffersize=1000;

// Error de acelerómetro permitido,  más bajo para obtener más precisión, pero es posible que el programa no converja (predeterminado: 8)

int acel_deadzone=8;

// Error de giro permitido,  más bajo para obtener más precisión, pero es posible que el boceto no converja (predeterminado: 1)

int giro_deadzone=1;

// la dirección por defecto de  I2C es 0x68
// si queremos pasar la dirección como parámetro
// AD0 low = 0x68
// AD0 high = 0x69

MPU6050 accelgyro(0x68);

int16_t ax, ay, az,gx, gy, gz;

int mean_ax,mean_ay,mean_az,mean_gx,mean_gy,mean_gz,state=0;
int ax_offset,ay_offset,az_offset,gx_offset,gy_offset,gz_offset;

/////////////////////////////////// SETUP ////////////////////////////////////
void setup() {
Wire.begin();
// COMMENT NEXT LINE IF YOU ARE USING ARDUINO DUE
TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz). Leonardo measured 250kHz.

     // inicializamos comunicación serial
Serial.begin(115200);

    // inicializamos dispositivo
accelgyro.initialize();

// esperamos hasta que este preparado
while (Serial.available() && Serial.read()); // buffer vacío
while (!Serial.available()){
Serial.println(F(«Envia un caracter desde la consola serial»));
delay(1500);
}
while (Serial.available() && Serial.read()); // buffer vacío de nuevo

// mensajes de comienzo
Serial.println(«\nMPU6050 Programa de calibración»);
delay(2000);
Serial.println(«\nTu MPU6050 debe estar en posición horizontal,  \nNo lo toques hasta que veas un mensaje de finalización.\n»);
delay(3000);
// verifficar conexión
Serial.println(accelgyro.testConnection() ? «MPU6050 connection successful» : «MPU6050 connection failed»);
delay(1000);
// reset offsets
accelgyro.setXAccelOffset(0);
accelgyro.setYAccelOffset(0);
accelgyro.setZAccelOffset(0);
accelgyro.setXGyroOffset(0);
accelgyro.setYGyroOffset(0);
accelgyro.setZGyroOffset(0);
}

/////////////////////////////////// LOOP ////////////////////////////////////
void loop() {
if (state==0){
Serial.println(«\nLeyendo sensor por primera vez…»);
meansensors();
state++;
delay(1000);
}

if (state==1) {
Serial.println(«\nCalculando offsets…»);
calibration();
state++;
delay(1000);
}

if (state==2) {
meansensors();
Serial.println(«\nFINISHED!»);
Serial.print(«\nLeyendo sensor con offsets:\t»);
Serial.print(mean_ax);
Serial.print(«\t»);
Serial.print(mean_ay);
Serial.print(«\t»);
Serial.print(mean_az);
Serial.print(«\t»);
Serial.print(mean_gx);
Serial.print(«\t»);
Serial.print(mean_gy);
Serial.print(«\t»);
Serial.println(mean_gz);
Serial.print(«Tus  offsets:\t»);
Serial.print(ax_offset);
Serial.print(«\t»);
Serial.print(ay_offset);
Serial.print(«\t»);
Serial.print(az_offset);
Serial.print(«\t»);
Serial.print(gx_offset);
Serial.print(«\t»);
Serial.print(gy_offset);
Serial.print(«\t»);
Serial.println(gz_offset);
Serial.println(«\nDatos correspondes a: acelX acelY acelZ giroX giroY giroZ»);
Serial.println(«Check tu sensor leyendo  0 0 16384 0 0 0»);
Serial.println(«Si la calibración fue exitosa, anota tus compensaciones para que pueda sestablecerlas en tus proyectos usando algo similar a mpu.setXAccelOffset (youroffset)»);
while (1);
}
}

/////////////////////////////////// FUNCTIONS ////////////////////////////////////
void meansensors(){
long i=0,buff_ax=0,buff_ay=0,buff_az=0,buff_gx=0,buff_gy=0,buff_gz=0;

while (i<(buffersize+101)){
// read raw accel/gyro measurements from device
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

if (i>100 && i<=(buffersize+100)){ //First 100 measures are discarded
buff_ax=buff_ax+ax;
buff_ay=buff_ay+ay;
buff_az=buff_az+az;
buff_gx=buff_gx+gx;
buff_gy=buff_gy+gy;
buff_gz=buff_gz+gz;
}
if (i==(buffersize+100)){
mean_ax=buff_ax/buffersize;
mean_ay=buff_ay/buffersize;
mean_az=buff_az/buffersize;
mean_gx=buff_gx/buffersize;
mean_gy=buff_gy/buffersize;
mean_gz=buff_gz/buffersize;
}
i++;
delay(2); //Needed so we don’t get repeated measures
}
}

void calibration(){
ax_offset=-mean_ax/8;
ay_offset=-mean_ay/8;
az_offset=(16384-mean_az)/8;

gx_offset=-mean_gx/4;
gy_offset=-mean_gy/4;
gz_offset=-mean_gz/4;
while (1){
int ready=0;
accelgyro.setXAccelOffset(ax_offset);
accelgyro.setYAccelOffset(ay_offset);
accelgyro.setZAccelOffset(az_offset);

accelgyro.setXGyroOffset(gx_offset);
accelgyro.setYGyroOffset(gy_offset);
accelgyro.setZGyroOffset(gz_offset);

meansensors();
Serial.println(«…»);

if (abs(mean_ax)<=acel_deadzone) ready++;
else ax_offset=ax_offset-mean_ax/acel_deadzone;

if (abs(mean_ay)<=acel_deadzone) ready++;
else ay_offset=ay_offset-mean_ay/acel_deadzone;

if (abs(16384-mean_az)<=acel_deadzone) ready++;
else az_offset=az_offset+(16384-mean_az)/acel_deadzone;

if (abs(mean_gx)<=giro_deadzone) ready++;
else gx_offset=gx_offset-mean_gx/(giro_deadzone+1);

if (abs(mean_gy)<=giro_deadzone) ready++;
else gy_offset=gy_offset-mean_gy/(giro_deadzone+1);

if (abs(mean_gz)<=giro_deadzone) ready++;
else gz_offset=gz_offset-mean_gz/(giro_deadzone+1);

if (ready==6) break;
}
}

Mi resultado es:

01