Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
void setup () {
pinMode (led, OUTPUT); // declaramos el led como salida
/* los pin analogicos se declaran como entrada automaticamente */
}
Arduino tiene integrado un convertidor análogo digital, por el cual podemos recibir voltajes entre o[V] y 5[V] para ser
traducidos en números entre o y 1023. Sin embargo, no contamos con un convertidor digital análogo con el cual enviar
señales de voltaje continuo distinto a 5[V], como para, por ejemplo, controlar la intensidad de un LED.
Para solucionar el problema anteriormente planteado es que se usan los pines que pueden enviar señales con modulación por
Para realizar esto, necesitamos conectar un LED a uno de los pines que permiten señales PWM como salida. En la siguiente
resistencia de 220[ohm] para limitar la corriente de manera que Arduino esté protegida. Luego, se debe compilar y cargar el
siguiente código:
1 /*
2 Programa de prueba para el control de la intensidad de un LED por medio de señales PWM.
3 Se hace parpadear el LED cambiando su intensidad de forma oscilatoria.
4
5 Autor: Arduino UTFSM
6 Fecha: 20 de Mayo 2014
7
8 Materiales utilizados:
9 1 Arduino UNO Rev3
10 1 LED de color azul conectado a salida PWM 9
11 1 Resistencia de 220[ohm]
12 2 Cables de conexión
13 */
14
15 /*------Declaración de variables-----*/
16 int led = 9; //Se escoje la variable donde se conectará el LED
17 int i;//Variable auxiliar para condicionales
18
19 void setup() {
20 pinMode(led, OUTPUT);//Se inicializa como OUTPUT el pin a usar. Debe ser PWM
21 }
22
23 void loop() {
24 //Se recorren los valores desde el 0 al 255 para enviar una señal PWM con ciclo de trabajo de 0% a 100%
25 //aumentando en 2.55% el ciclo de trabajo cada 10 mili segundos.
26 for(i=0; i<256; i++){
27 analogWrite(led,i);
28 delay(10);
29 }
30 //Se recorren los valores del 255 al 0 de mayor a menor igual que el for anterior.
31 for(i=255; i>-1; i--){
32 analogWrite(led,i);
33 delay(10);
34 }
35 }
Con el programa anterior veremos cómo el LED parpadea en su intensidad de manera oscilatoria.
A continuación haremos un juego de intensidades para ayudar ejemplificar las capacidades de las señales PWM en el control
de LEDs. Para esto, conectaremos 3 LED a distintas salidas PWM como muestra la siguiente figura:
Luego de conectar los LED continuamos con la compilación y la carda del siguiente código, con el cual podremos ver dos
1 /*
2 Programa para el control de intensidad de 3 LED por medio de señales PWM.
3 Se controla con dos funciones:
4 funcion wave: Emula una onda de intensidades en ir y venir para los 3 LED
5 funcion random: Enciende de manera aleatoria los LED con un valor de intensidad tambien aleatorio
6
7 Materiales:
8 1 Arduino UNO Rev3
9 3 LED
10 3 Resistencias de 220[ohm]
11 Cables para conexion
12
13 Autor: Arduino UTFSM
14 Fecha: 20 - Mayo - 2014
15
16 */
17
18 /*-----Declaracion de variables-----*/
19 //Variable para controlad LED a controlar
20 int led[3] = {9,10,11}; //Deben ser PWM
21 int i,j; //Variables auxiliares para ciclos repetitivos
22 int repeat = 10; //Variable para controlar repeticion de funcion
23
24 void setup() {
25 // Se inicializan los 3 pines PWM a utilizar como salida
26 for(i=0; i<3; i++)
27 pinMode(led[i], OUTPUT);
28 }
29
30 void loop() {
31
32 wave(repeat);
33 randomLed(repeat);
34
35 }
36
37 void wave(int repeat){
38 for(j=0; j<repeat; j++){ //Se repite la secuencia segun variable repeat
39 for(i=0; i<256; i++){
40 //Se aumenta el primer LED de 0 a 255
41 analogWrite(led[0],i);
42 }
43 for(i=255; i>-1; i--){
44 //Se disminuye el primer LED de 255 a 0
45 //Se aumenta el segundo LED de 0 a 255
46 analogWrite(led[0],i);
47 analogWrite(led[1],255-i);
48 }
49 for(i=0; i<256; i++){
50 //Se disminuye el segundo LED de 255 a 0
51 //Se aumenta el tercer LED de 0 a 255
52 analogWrite(led[1],255-i);
53 analogWrite(led[2],i);
54 }
55 for(i=255; i>-1; i--){
56 //Se disminuye el tercer LED de 255 a 0
57 analogWrite(led[2],i);
58 }
59 //Se realiza el ciclo inverso al anterior
60 for(i=0; i<256; i++){
61 analogWrite(led[2],i);
62 }
63 for(i=255; i>-1; i--){
64 analogWrite(led[2],i);
65 analogWrite(led[1],255-i);
66 }
67 for(i=0; i<256; i++){
68 analogWrite(led[1],255-i);
69 analogWrite(led[0],i);
70 }
71 for(i=255; i>-1; i--){
72 analogWrite(led[0],i);
73 }
74 }
75 }
76
77 void randomLed(int repeat){
78 for(i=0; i<repeat; i++){
79 //Se elige de forma aleatorioa la intensidad de cada LED
80 //Se escoje un retardo entre cada LED aleatoriamente
81 analogWrite(led[0],random(0,256));
82 delay(random(0,501));
83 analogWrite(led[1],random(0,256));
84 delay(random(0,501));
85 analogWrite(led[2],random(0,256));
86 delay(random(0,501));
87 }
88 }
El desafío es que este tipo de juegos de luces está limitado sólo por nuestra creatividad, esperamos puedas inventar
Esta practica consistira en controlar la intensidad de un LED y se usara la luz para demostrarlo.
Material
Arduino UNO
Una Mini fotocelda
LED
Cables
Resistencias 220 y 10K
Protoboard
Montaje de circuito
Enseguida mostrare el codigo del programa que sera subido al Arduino, en donde esta documentado para entender la sintaxis.
Se muestran los ciclos usados en el codigo para recibir los valores de la lectura analoga de la minifotocelda, luego se realiza una conversion y se
muestran los datos obtenidos
1. /*
2. ---------------------------------------------
3. Control de intensidad de un LED
4. ---------------------------------------------
5. */
6.
7. //------------------------------------
8. //Funcion principal
9. //------------------------------------
10. void setup() // Se ejecuta cada vez que el Arduino se inicia
11. {
12. Serial.begin(9600); //Inicia comunicacion
13. pinMode(9,OUTPUT); //Configurar el pin 9 como salida
14. }
15.
16. //------------------------------------
17. //Funcion ciclicla
18. //------------------------------------
19. void loop() // Esta funcion se mantiene ejecutando
20. { // cuando se da energia al Arduino
21.
22. //Variable del valor de la lectura analoga de la mini fotocelda
23. int foto = analogRead(A0);
24.
25. //Verifica el valor máximo y se realiza una conversion
26. int conversion = 780 - foto;
27.
28. //Condicion para establecer un valor absoluto
29. if ( conversion < 0)
30. conversion = conversion * -1; //Multiplicar por -1
31.
32. //Se Imprimen los datos de la mini fotocelda
33. Serial.print("Foto : ");
34. Serial.print(foto);
35. Serial.println("");
36.
37. //Se Imprimen los datos del valor de la conversion
38. Serial.print("Conv : ");
39. Serial.print(conversion);
40. Serial.println("");
41.
42. //Escritura análoga de PWM en el LED de acuerdo a la conversion
43. analogWrite(9, conversion);
44.
45. delay(100);
46.
47. }
48.
49. //Fin programa
A continuación se muestra un video donde se muestra como quedo este pequeño ejemplo en Arduino.
El circuito:
* potenciometro conectado a la entrada analogica A0.
Terminal central del potenciometro a pin A0.
Resto de terminales del potenciometro a +5V y masa
* Circuito de LED verde conectado a D3-PWM.
*/
// pines usados:
const int analogInPin = A0; // Entrada analogica A0 del potenciometro
const int analogOutPin = 3; // Salida PWM
void setup() {
// inicializacion del monitor serie a 9600 bps:
Serial.begin(9600);
}
void loop() {
// lee el valor de la entrada analogica:
potValor = analogRead(analogInPin);
// mapea el rango para la señal de salida PWM:
outputValor = map(potValor, 0, 1023, 0, 255);
// asigna el valor cambiado a pin 3 PWM:
analogWrite(analogOutPin, outputValor);
Componentes
arduino
protoboard
un led
un potenciometro
una resistencia de 220 oms (rojo, rojo, café)
- al inicio
Circuito
El circuito de este proyecto es la combinación de dos de los
circuitos que ya hemos estado utilizando.
Para la entrada, usaremos el circuito para sensar los valores
analógicos que nos da un potenciometro. Y para la salida, que
también será analógica, el circuito para iluminar un led, por lo que
ahora tenemos que poner el led en un pin con salida PWM, el 9
por ejemplo.
- al inicio
Diagrama
- al inicio
Código
En el código de este proyecto vamos a usar la
función analogRead() para leer los valores que nos da el
potenciometro. Y vamos a usar la función analogWrite() para darle
los valores PWM al led e iluminarlo así de acuerdo a los valores
del potenciometro.
Como los valores que obtenemos del potenciometro están en el
rango de 0 a 1023, que son los valores mínimo y máximo que nos
devuelve la función analogRead() y al led sólo podemos darle
valores entre 0 y 255, que son los valores PWM que podemos
usar con la función analogWrite(), tenemos que hacer una
conversión entre estos valores. Para ello usaremos la
función map() que nos permite ajustar un valor entre ambos
rangos.
A esta función map() le tenemos que pasar 5 parámetros. El
primero es el valor que queremos mapear. Después le damos el
rango de valores entre los que está este valor y después el rango
de valores entre los que queremos convertirlo o mapearlo. La
función nos devolverá el valor equivalente, ajustado al nuevo
rango.
/*
En este proyecto leemos el valor de un potenciometro
y con este valorla damos el brillo a un led usando una señal PWM
*/
void setup() {
// Incializa el pin del boton como entrada
pinMode(pinSensor, INPUT);
// Incializa el pin del led como salida, aunque no es necesario
pinMode(pinLed, OUTPUT);
// Inicializa la comunicacion serial
Serial.begin(9600);
}
void loop(){
// Lee el valor del sensor
valorPotenciometro = analogRead(pinSensor);
// Transforma este valor en el valor que usaremos para el led
// Para ello usaremos la funcion map()
brilloLed = map(valorPotenciometro, 0, 1023, 0, 255);
// Utilizamos este valor para iluminar el led
analogWrite(pinLed, brilloLed);
delay(100);
}
- al inicio
Variantes
Prueba a hacer lo mismo con otros sensores analógicos. ¿Que
pasa con los valores máximos y mínimos de estos sensores?
¿Que parametros deberías pasarle entonces a la función map()?
El código anterior muestra por puerto serie los valores de entrada de A0. Usaremos estos valores para calibrar nuestro sensor
LDR. Expondremos la LDR a las condiciones máximas y mínimas de iluminación a las que normalmente será expuesta. Estos
valores serán definidos en las variables max y min.
constrain(valor, a, b);
Esta función normaliza valor a un rango [a,b]. Si valor es menor que a, el resultado de la función será a, si valor es mayor que
b, el resultado de la función es b. De esta forma trabajaremos siempre con el margen de valores establecidos por min y max.
map(valor, min, max, 0, 255);
Re-mapea un número desde un rango hacia otro. Esto significa que valor con respecto al rango min-max será mapeado al
rango 0-255. Esta función es útil para hacer la variación de luminosidad del LED. A medida que el rango entre min y max sea
mayor, mayor serán los valores intermedios de luminosidad del LED, mayor suavidad en los cambios.