Sonómetro de aula con arduino.


ESQUEMAS DE CONEXIÓN.


ESQUEMA GENERAL


ESQUEMA DE CONEXIÓN Y ALIMENTACIÓN DE LOS LED'S




CÓDIGOS DEL PROGRAMA.

VERSIÓN 1. POR MUESTREO O POLLING


/**********************************************************************/
/*                                                                    */
/*             SONÓMETRO PARA EL CONTROL DE RUIDO EN EL AULA          */
/*         VERSIÓN 1: POR MUESTREO DE LA SALIDA DIGITAL (POLLING)     */
/*                                                                    */
/*                 www.fpbasicaelectricidad.blogspot.com              */
/*                                                                    */
/*                             mayo 2016                              */
/**********************************************************************/  

// DEFINICIONES //
#define PIN_LED_ROJO      4
#define PIN_LED_AMARILLO  5
#define PIN_LED_VERDE     6
#define PIN_SONIDO        3
#define PIN_V_POTENC      9

// VARIABLES GLOBALES //
long veces_leido = 0;
long veces_on = 0;
int Potenciometro_A0 = A0;
long Valor_Potenciometro = 0;
long para_rango_led_verde, para_rango_led_rojo;

// INICIALIZACIÓN DE LA PLACA ARDUINO NANO V3.0//
void setup() {
   pinMode(PIN_LED_ROJO, OUTPUT); 
   pinMode(PIN_LED_AMARILLO, OUTPUT); 
   pinMode(PIN_LED_VERDE, OUTPUT);
   pinMode(PIN_V_POTENC, OUTPUT); 
   pinMode(PIN_SONIDO, INPUT_PULLUP);
   digitalWrite(PIN_LED_VERDE, HIGH);
   
   Serial.begin(9600);
}

// PROGRAMA PRINCIPAL //
void loop() {

  // Primeramente se lee el valor del PIN DIGITAL del MÓDULO DE SONIDO //
  // 200.000 veces y se contabilizan las que superan el umbral         //
  for ( veces_leido = 0, veces_on=0; veces_leido <= 200000; veces_leido++){
    if (!digitalRead(PIN_SONIDO)) veces_on++;
  }
  
  // Se lee el valor del potenciómetro escribiendo primeramente un bit en PIN_V_POTENC //
  digitalWrite(PIN_V_POTENC, HIGH);
  Valor_Potenciometro = analogRead(Potenciometro_A0);
  digitalWrite(PIN_V_POTENC, LOW);

  // Se calculan los umbrales para iluminar los led's correspondientes          //
  // en función de la sensiblidad ajustada en el potenciómetro       //

  para_rango_led_rojo  = long (1000 + Valor_Potenciometro * 165);
  para_rango_led_verde = long (  2 + Valor_Potenciometro *  50);
 
  
  if (veces_on <= para_rango_led_verde){                                   
      digitalWrite(PIN_LED_ROJO, LOW);
      digitalWrite(PIN_LED_AMARILLO, LOW);
      digitalWrite(PIN_LED_VERDE, HIGH);
      Serial.write(20);                     // SE ENVÍA ESTE CÓDIGO PARA EL USO CON PROCESSING. 
                                            // NO SE USA SI SOLO TENEMOS SALIDAS A LED'S
  }
  else if (veces_on >= para_rango_led_rojo){                      
      digitalWrite(PIN_LED_ROJO, HIGH);
      digitalWrite(PIN_LED_AMARILLO, LOW);
      digitalWrite(PIN_LED_VERDE, LOW);
      Serial.write(22);                     // SE ENVÍA ESTE CÓDIGO PARA EL USO CON PROCESSING. 
                                            // NO SE USA SI SOLO TENEMOS SALIDAS A LED'S
  }
  else {
      digitalWrite(PIN_LED_ROJO, LOW);
      digitalWrite(PIN_LED_AMARILLO, HIGH);
      digitalWrite(PIN_LED_VERDE, LOW);
      Serial.write(21);                     // SE ENVÍA ESTE CÓDIGO PARA EL USO CON PROCESSING. 
                                            // NO SE USA SI SOLO TENEMOS SALIDAS A LED'S
  }

  // ESTAS LLAMADAS A FUNCIONES SE HAN UTILIZADO PARA LA PUESTA A PUNTO PARA LEER LOS DATOS DESDE EL MONITOR SERIE//
  Serial.print(" VECES_ON= "); Serial.print(veces_on);
  Serial.print(" VALOR POTENCIOMETRO= "); Serial.print(Valor_Potenciometro);
  Serial.print(" PARA_RANGO_ROJO= "); Serial.print(para_rango_led_rojo);
  Serial.print(" PARA_RANGO_VERDE= "); Serial.print(para_rango_led_verde);
  Serial.println("--");
}

VERSIÓN 2. MEDIANTE INTERRUPCIONES ASÍNCRONAS


/**********************************************************************/
/*                                                                    */
/*             SONÓMETRO PARA EL CONTROL DE RUIDO EN EL AULA          */
/*                    VERSIÓN 2: POR INTERRUPCIONES                   */
/*                                                                    */
/*                 www.fpbasicaelectricidad.blogspot.com              */
/*                                                                    */
/*                             mayo 2016                              */
/**********************************************************************/  

// DEFINICIONES //
#define PIN_LED_ROJO      4
#define PIN_LED_AMARILLO  5
#define PIN_LED_VERDE     6
#define PIN_SONIDO        3
#define PIN_V_POTENC      9

// VARIABLES GLOBALES //
long veces_leido = 0;
long veces_on = 0, int_veces_on;
int Potenciometro_A0 = A0;
long Valor_Potenciometro = 0;
long para_rango_led_verde, para_rango_led_rojo;

// INICIALIZACIÓN DE LA PLACA ARDUINO NANO V3.0//
void setup() {
   pinMode(PIN_LED_ROJO, OUTPUT); 
   pinMode(PIN_LED_AMARILLO, OUTPUT); 
   pinMode(PIN_LED_VERDE, OUTPUT);
   pinMode(PIN_V_POTENC, OUTPUT); 
   pinMode(PIN_SONIDO, INPUT_PULLUP);
   // INICIALIZACIÓN DE LA INTERRUPCCIÓN EN EL PIN_SONIDO = D3
   attachInterrupt(digitalPinToInterrupt(PIN_SONIDO), funcion_interrupcion, HIGH);
   
   digitalWrite(PIN_LED_VERDE, HIGH);
   
   Serial.begin(9600);            // SOLO PARA PRUEBAS
}

// RUTINA DE INTERRUPCIÓN //
  void funcion_interrupcion(){ 
    int_veces_on++;
  }

// PROGRAMA PRINCIPAL //
void loop() {

  delay (1000);             // PAUSA ESTABLECIDA PARA TOMAR UN RANGO DE TIEMPO //
  veces_on = int_veces_on;  // SE COPIA EL VALOR DE VECES_ON DE LA INTERRUPCIÓN PARA UNA SIGUIENTE PUESTA A 0
  int_veces_on=0;           // SE INICIALIZA EL VALOR DE LA VARIABLE QUE SE INCREMENTA EN CADA RUTINA DE INTERRUPCIÓN
  
  // Se lee el valor del potenciómetro escribiendo primeramente un bit en PIN_V_POTENC //
  digitalWrite(PIN_V_POTENC, HIGH);
  Valor_Potenciometro = analogRead(Potenciometro_A0);
  digitalWrite(PIN_V_POTENC, LOW);
  
  // Se calculan los umbrales para iluminar los led's correspondientes          //
  // Se utiliza un rango logaritmico por las características logaritmicas       //
  // de percepción por el oido humano y ya que se ha utilizado un potenciómetro lineal //

  para_rango_led_rojo  = long (100 + Valor_Potenciometro * 5);
  para_rango_led_verde = long (  2 + Valor_Potenciometro / 2);
 
  
  if (veces_on <= para_rango_led_verde){                                   
      digitalWrite(PIN_LED_ROJO, LOW);
      digitalWrite(PIN_LED_AMARILLO, LOW);
      digitalWrite(PIN_LED_VERDE, HIGH);
      Serial.write(20);
  }
  else if (veces_on >= para_rango_led_rojo){                      
      digitalWrite(PIN_LED_ROJO, HIGH);
      digitalWrite(PIN_LED_AMARILLO, LOW);
      digitalWrite(PIN_LED_VERDE, LOW);
      Serial.write(22);
  }
  else {
      digitalWrite(PIN_LED_ROJO, LOW);
      digitalWrite(PIN_LED_AMARILLO, HIGH);
      digitalWrite(PIN_LED_VERDE, LOW);
      Serial.write(21);
  }
}     // FIN DEL PROGRAMA  

Programa de Processing:

El enlace al código fuente y los ejecutables es: 
https://drive.google.com/file/d/0B4q99Yx8xfl2VWxSWTZhd2tVUm8/view?usp=sharing

(incluye ejecutables para Windows y Linux)
Los drivers para el arduino nano chino puedes descargarlo desde: 
http://www.geekfactory.mx/sin-categoria/driver-ch340-para-arduino-chinos-o-genericos/

/*   fpbasicaelectricidad.blogspot.com   Arduino + Processing: Semáforo de ruido   ARCHIVOS DE PROCESSING CON POTENCIÓMETRO DE NIVEL      MAYO DE 2016 */ import processing.serial.*; //Importamos la librería Serial Serial port; //Nombre del puerto serie import controlP5.*; ControlP5 cp5; int dato_puerto; PImage imagen_rojo, imagen_amarillo, imagen_verde; void setup() {      port = new Serial(this, Serial.list()[0], 9600); //Abre el puerto serie COM3   size(450, 450); //Creamos una ventana de 450 píxeles de anchura por 450 píxeles de altura   imagen_rojo = loadImage("triste.jpg");   imagen_amarillo = loadImage("indiferente.jpg");   imagen_verde = loadImage("riyendo.jpg");   background(255,255,255);//Fondo de color blanco      crea_potenciometro(); } void crea_potenciometro() {      cp5 = new ControlP5(this);            cp5.addSlider("Sensibilidad")      .setPosition(10,10)      .setSize(100,20)      .setRange(0,100)      .setValue(50)      ; }   void draw() {   float s1=0, s2=0;      // Mandar datos del potenciometro al arduino   s1 = cp5.getController("Sensibilidad").getValue();   if (s1 != s2) {     port.write(int (s1));     s2=s1;   }         //Recibir datos del sonido del Arduino   if(port.available() > 0) // si hay algún dato disponible en el puerto    {      dato_puerto = port.read();//Lee el dato y lo almacena en la variable "dato_puerto"      if (dato_puerto == 20) image(imagen_verde, 0, 0);      else if (dato_puerto == 22) image(imagen_rojo, 0, 0);      else image(imagen_amarillo, 0, 0);      //println(dato_puerto);    }    //else print (" Arduino desconectado del puerto USB"); }

Los iconos para el programa de Processing:

Vídeos:

:


Fotos del proceso de construcción:




















PRESENTACIÓN DEL SONÓMETRO EN LAS JORNADAS PROVINCIALES DE BUENAS PRÁCTICAS EN LA FORMACIÓN PROFESIONAL.

EL PÓSTER

0 Comentarios:

Publicar un comentario en la entrada