Ejercicio 19: Sensor de ángulo
El nº de LEDs iluminados indica cuánto ha girado el potenciómetro.
| Novedades hardware | Novedades 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?.