Ejercicio 19: Sensor de ángulo

El nº de LEDs iluminados indica cuánto ha girado el potenciómetro.

Novedades hardwareNovedades software
Potenciómetro.Lectura de señales analógicas.
Entradas analógicas.Mapeado de señales analógicas en valores digitales discretos.

Requisitos:

  • 4 LEDs, 4 resistencias de 220 ohmios
  • Un potenciómetro (ej.:100K)

Planteamiento: Tenemos un elemento que gira una vuelta y queremos una información visual de cuánto ha girado.

Presentación:

  • Lectura de señales analógicas.
  • Mapeado de señales analógicas en valores digitales discretos.

Las señales analógicas en las entradas analógicas toman valores entre 0 y 1024 cuando son tratadas por el conversor analógico-digital (DAC) que incorpora el microprocesador (que es de 10 bits).

El primer paso en el tratamiento de dichas señales es acotarlas y obtener una salida digital que nos indique entre qué cotas están.

Esto se consigue muy fácilmente con varios condicionales sobre el el valor de la entrada. Loe ejercicios plantean una progresión en en cuanto a la forma de representar los resultados:

  • El primero lo hace explícitamente
  • El segundo usa el límite de la iteración que recorre la cadena de posiciones de los LEDs.
  • El tercero usa una función para obtener el mismo resultado.

Lo único que hay que tener en cuenta es que si queremos que responda no sólo al aumento del ángulo, sino también a su disminución hay que apagar expresamente los LEDs cada vez.

Variantes:

  • Aumenta el nº de intervalos y el nº de LEDs para tener una lectura más precisa.
  • Supón que no dispones de más LEDs y necesitas una lectura más precisa, te sugiero 2 opciones:

    -->muestra la lectura en dos momentos, el primero indica en qué cuarto estamos y el segundo vuelve a dividir ese cuarto en cuatro. Tendrás que usar una iteración o un contador.
    -->separa las unidades, decenas y centenas del valor leído y muéstralas a través del número de parpadeos de los LEDs. Puedes hacer parpadear los 4 para el millar, 3 a la vez para las centenas, 2 a la vez para las decenas y 1 para las unidades.

VIDEO DEL EJERCICIO 19

CODIGO FUENTE

 Copyright (C) 2006  Juan Carlos Alonso de Mena
 This program is free software; you can redistribute it and/or modify it under the terms
 of the GNU General Public License as published by the Free Software Foundation;
 See the GNU General Public License for more details?

EJERCICO 19.1

 int cadenaLeds[]={6,7,8,9};
 int pot=0;                                 //nº de la entrada analógica a la que va conectado el potenciómetro 
 int n=0;
 int medida=0;                              //variable que guarda la lectura de la señal en la  entrada

 void setup(){                              //no es necesario configurar las entradas analógicas
   for(n=0;n<4;n++){
     pinMode(cadenaLeds[n],OUTPUT);
   }
 }
 void loop(){
   medida=analogRead(pot);                  //guardamos el valor de la entrada analógica en la variable medida
   if(medida<1024/4){                       //la señal analógica está comprendida entre 0 y 1024. 
                                            //La dividimos en 4 partes.
     digitalWrite(cadenaLeds[0],HIGH);      //se enciende el primer LED si la señal está en el primer cuarto
     digitalWrite(cadenaLeds[1],LOW);       //los demás se apagan para que cuando la señal disminuya 
     digitalWrite(cadenaLeds[2],LOW);       //no se queden encendidos
     digitalWrite(cadenaLeds[3],LOW);
   }
   if((medida>=1024/4)&&(medida<1024/2)){   //señal en el segundo cuarto, 2 LEDs encendidos
     digitalWrite(cadenaLeds[0],HIGH);
     digitalWrite(cadenaLeds[1],HIGH);
     digitalWrite(cadenaLeds[2],LOW);
     digitalWrite(cadenaLeds[3],LOW);
   }
   if((medida>=1024/2)&&(medida<1024*3/4)){ //señal en el tercer cuarto, 3 LEDs encendidos
     digitalWrite(cadenaLeds[0],HIGH);
     digitalWrite(cadenaLeds[1],HIGH);
     digitalWrite(cadenaLeds[2],HIGH);
     digitalWrite(cadenaLeds[3],LOW);
   }  
   if(medida>=1024*3/4){                    //señal en el último cuarto, 4 LEDs encendidos
     digitalWrite(cadenaLeds[0],HIGH);
     digitalWrite(cadenaLeds[1],HIGH);
     digitalWrite(cadenaLeds[2],HIGH);
     digitalWrite(cadenaLeds[3],HIGH);
   }
 }

EJERCICO 19.2

 int cadenaLeds[]={6,7,8,9};
 int pot=0;                                   //variable que guarda la lectura de la señal  en la entrada
 int n=0;
 int m=0;
 int c=0;
 int medida=0;                                //variable que guarda la lectura de la señal en la entrada

 void setup(){
   for(n=0;n<4;n++){
     pinMode(cadenaLeds[n],OUTPUT);
   }
 }
 void loop(){
   medida=analogRead(pot);
   if(medida<1024/4){
     m=1;
   }
   if((medida>=1024/4)&&(medida<1024/2)){
     m=2;
   }
   if((medida>=1024/2)&&(medida<1024*3/4)){
     m=3;
   }
   if(medida>=1024*3/4){
     m=4;
   }
   for(n=0;n<m;n++){                          //según en que cuarto estemos se encienden m LEDS
     digitalWrite(cadenaLeds[n],HIGH);
   }
   for(c=4;c>m;c--){                          //y se apaga el resto
     digitalWrite(cadenaLeds[n],LOW);
   }
 }

EJERCICO 19.3

 int cadenaLeds[]={6,7,8,9};
 int pot=0;                                   //nº de la entrada analógica a la que va conectado el potenciómetro 
 int n=0;
 int m=0;
 int c=0;
 int medida=0;                                //variable que guarda la lectura de la señal en la entrada

 void setup(){
   for(n=0;n<4;n++){
     pinMode(cadenaLeds[n],OUTPUT);
   }
 }
 void lectura(){                              //empaquetamos la medida en un procedimiento
   medida=analogRead(pot);
   if(medida<1024/4){
     m=1;
   }
   if((medida>=1024/4)&&(medida<1024/2)){
     m=2;
   }
   if((medida>=1024/2)&&(medida<1024*3/4)){
     m=3;
   }
   if(medida>=1024*3/4){
     m=4;
   }
 }
 muestra(int m){                              //empaquetamos el encendido y apagado de los LEDs en una función
   for(n=0;n<m;n++){                          //que tiene por argumento el nº de LEDs encendidos
     digitalWrite(cadenaLeds[n],HIGH);
   }
   for(c=4;c>m;c--){
     digitalWrite(cadenaLeds[n],LOW);
   }
 }
 void loop(){
   lectura();
   muestra(m);
 }

Volver?

  Copyright (c) 2006  Juan Carlos Alonso de Mena

  Permission is granted to copy, distribute and/or modify this document under the terms of 
 the GNU Free Documentation License, Version 1.2 or any later version published by the
 Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no
 Back-Cover Texts.  A copy of the license is included in the section entitled 
 GNU Free Documentation License?.