Felix Maocho

Para quien le interese lo que a nosotros nos interesa

Curso de Arduino – Salidas con pines “analogicos”. 2ª Parte Manejo de Pines PWM

tarjeta arduimo_bb

Por Félix Maocho
15/2/2017

.

Objetivo de este capítulo

Conocer la diferencia entre una pin PWM y uno realmente analógico. Comprender los problemas que esta diferencia puede dar lugar en la realidad

Identificar en una Tarjeta Arduino cuales son los pin PWM. Conocer el mandato “analogWrite” y su sintaxis. Controlar la energía que permitimos salir por un pin PWM

Material necesario

Tarjeta Arduino y cable de conexión al PC
Tarjeta de prototipado o “protoboard”
5 Cables de conexiones, (Preferiblemente, no imprescindible, 2 rojos y 3 grises)
2 Resistencia de 220 Ω
2 leda (es indiferente el color con tal que sean iguales)

Conocimientos previos necesarios
Saber escribir, compilar y cargar en la Tarjeta Arduino un programa
Saber utilizar pines digitales Saber que son Pulsos con modulación PWM

En el capítulo anterior del Curso de Arduino acabamos diciendo que existen en la Tarjeta Arduino unos pines que emiten Pulso con Modulaxción, o en inglés “Pulse Width Modulation”, (PWM), que son esas ondas rectangulares que indican que unas veces se permite la salida a 5 voltios y otras a 0 voltios, que se utilizan para bien controlar la cantidad de energía que se emite, o incluso para establecer sistemas de comunicación con otros equipos.

En este capítulo nos centraremos en el primer uso, es decir, como una forma de controlar la energía que damos salida un pin, Como la energía se puede emitir entre nada a el máximo posible de una forma gradual, a estos pines se les llama también “analógicos”, porque la energía que en un lapso de tiempo puede dejarse salir, con bastante aproximación, a la intensidad que deseemos incluso siguiendo una gráfica que evolucione poco a poco.

Posibles problemas

Debe de quedar claro, que esta denominación de “analógicos” no es del todo correcta, porque no podemos emitir voltaje a 0,1 o a 3,7 voltios, sino que emitimos la energía que emitiéramos, si todo el tiempo emitiéramos a esos voltajes, pero en realidad, estamos enviando pequeñas “píldoras” de energia de corta duración, que entregamos a 5 voltios. Por tanto, si por ejemplo queremos alimentar un equipo que funcione a 3, 5V por este sistema, corremos el riesgo de quemarlo, porque la energía eléctrica que recibe llega a 5 voltios, aunque la reciba durante pequeñas fracciones de tiempo ,como se ve en el gráfico, donde a una mayor cantidad de energía enviada corresponde mas tiempo de voltaje a 5 voltios.

pwman

Otros problemas que pueden ocurrir, es que al ser una onda periódica, se acople con otro elemento vibrante y de lugar a imprevistas vibraciones o ruidos, que podemos eliminar, con solo variar un poco en mas o en menos el valor de “value” para que se desacoplen.

Por último, tener en cuenta lo que la constante conexión y desconexión, puede suponer en el dispositivo alimentado. Si solo apretar un pulsador, crea corrientes parásitas, no indico lo que en determinados casos, produce esas conexiones en motores, relés, o electroimanes. Se pueden generar voltaje parásitos, que puede dañar la salida o el dispositivo o la tarjeta, por lo que es necesario tomar las medidas pertinentes.

En cuanto a trabajar con transistores, en general, los de tipo BJT, o bipolar, que son muy comunes, son apropiados para funcionar como amplificación de señales PWM, pero no lo son los transistores MOS, o de efecto campo.

Sin embargo, y pese a estos problemas, los pin PWM valen para múltiples cosas como es alimentar a un led, o hacer sonar un zumbador, etc etc, Los pines PWM se pueden utilizaren muchos casos como si realmente fueran analógicos, pues generalmente el aparato receptor, posee una inercia que hace que aparentemente trabaje de forma continua, pero con la recepción de menos energía, cuando en realidad el aparato funciona a pulsos y la inercia hace que parezca funcione en los momento en que debería dejar de funcionar.

Cuáles son los pins PWM

Pues son algunos de los pines digitales, que con el correspondiente mandato pueden actuar como pines PWM. Concretamente en la Tarjeta Arduino UNO, son los pines 3, 5, 6, 9, 10 y 11 que como observarán en la imagen de la tarjeta, tiene impreso delante un carácter con forma de onda “ ~ “ que indica que son pines con capacidad PWM como por otra parte, señala el texto en vertical que acompaña a los pines digitales DIGITAL(PWM ~)

Cual es el mandato que los maneja

El mandato que los maneja es “analogWriten” que es muy parecido al mandato para manejar los pines digitales “digitalWriten”, con la diferencia que en vez de ser posibles sólo dos niveles “LOW” y “HIGH”, aquí hay 256 niveles posible de 0 al 255. Con 0 no se emite nada, igual que con “LOW” y con 255 se emite igual que con “HIGH” mientras que con el resto de los valores se mandan niveles intermedios de energía.

La sintaxis del mandato es

analogWtite (pin, value)

Donde

  • analogWrite” es el mandato
  • pin” es el numero de pin que vamos a utilizar
  • value” es el nivel de energía entre 0 y 255 que queremos emitir

Hay que tener en cuenta las siguientes cosas, lo mas fundamental es que el pin tenga la posibilidad de ser PWM, o sea, 3, 5, 6, 9, 10 y 11 en Arduino UNO pero otros valores en otras tarjetas Arduino, “value” ha de ser un número positivo entre 0 y 255 en Arduino UNO pero hay tarjetas de Arduino que permiten mas niveles, normalmente hasta 4.096

Por qué estos niveles son números tan arbitrarios

El numero de niveles de niveles posibles esta relacionado, como ya vimos en el caso anterior, con la frecuencia de la onda que se emite, cuantos mas “picos” entren un una fracción de tiempo determinado, mas “picos” podemos hacer planos, por tanto mas niveles de energía podemos alcanzar, sin que se noten los “apagones”.

La Tarjeta Arduino UNO, (y la Mini y la Nano e incluso la Mega), es muy modesta y sólo permite mandar ondas a una frecuencia relativamente baja de 490Hz para los pines 3, 9 10 y11, mientras que para el 5 y 6 cuya frecuencia es de 980Hz. Con esta frecuencia lo mas que podemos hacer, es dividir por la mitad, (mas o menos), por lo que nos tenemos que conformar con 256 pisos o sea, 8 bits, (2 elevado a 8)

En tarjetas mas potentes como Due. La señas PWM tiene mayor frecuencia al menos en algunos de sus pines y admite en estos hasta 4096 niveles es decir, 12 bits. Sin embargo, no preocuparos en exceso, en la mayoría de los proyectos, tendrás sobrado con 256 niveles y solo en proyectos muy sofisticados, precisarás mas frecuencia, pero lo razonable es que para entonces, el problema será que te faltarán pins y tendrás que comprar tarjetas mas poderosas, sobre todo porque necesitaras mas pines.

Ejemplos de uso

Voy a repetir los ejemplos que en el capítulo anterior, solo que ahora, utilizando pines PWM, Utilizaremos para ello los pines 9 y 10.

Hardware

El hardware será como siempre pero por otros pines, el 9 y el 10 con dos circuitos, cada uno con un led y una resistencia de 220Ω

pines-pwm

El problema a resolver es el mismo que hicimos en el capítulo anterior, comparar dos leds uno a plena carga, que abriremos en modo digital y uno a media potencia, que por fuerza tenemos que abrir como PWM.

El problema a resolver es el mismo que hicimos en el capítulo anterior, comparar dos leds uno a plena carga, que abriremos en modo digital y uno a media potencia, que por fuerza tenemos que abrir como PWM.

/* Sketch E7.11 Luz tenue con PWM
* Encender los dos leds en el primer loop
* No hacer nada en los siguientes
* Repetir el ciclo
*/
// Área de definición de variables y parámetros
int pinled1 = 9 ; // pin en OUTPUT para el LED testigo
int pinled2 = 10; // pin en OUTPUT para el LED variable
int primerloop = 0; // Si 0 se ejecuta primer loop 1 en los otros
// Función setup
void setup() {
pinMode( pinled1, OUTPUT);
}
// Función loop
void loop() {
// **************** Primer loop ***************
if ( primerloop == 0) {
digitalWrite(pinled1, HIGH);
analogWrite(pinled2, 128);
primerloop = 1 ; // // Para no volverlo a hacerlo
} // *** Fin lo que hay que hacer en el primer loop ***
} // fin funcion loop

Si copiamos, compilamos y subimos el Sketch a la Tarjeta Arduino, veremos algo como lo que mostré en el vídeo del capítulo anterior. La luz del led de la derecha, es mas tenue que la de la izquierda.

Pueden hacer diferentes pruebas  modificando el valor de “value”. Si en vez de 128 pone 64 se verá aun mas la diferencia y si ponen 192 la diferencia es menor.  Si ponen 0 el led aparecerá apagado y si ponen 255 se verá como el led que actúa como pin digital en HIGH.

Fíjense que los pin PWM que solo funcionan de salida OUPUT pero no de INPUT por ello no se declaran en la función “setup”. Si si se usan, solo hay una forma de hacerlo. En cambio tenemos que declarar como OUTPUT el pin 9 porque siendo PWM lo utilizamos en este caso como digital y como tal puede trabajar en INPUT o en OUPUT.

El utilizar un pin PWM como digital es un derrocha que debemos habitualmente evitar pues estamos utilizando un recurso mas valioso y pudiera ser que en el futuro lo echaremos de menos. De ser posible, deben utilizarse los pines menos valioso entre los disponibles, que lógicamente sean adecuados para lo que queremos realizar con ellos, con el fin de no podar posibilidades futuras. En este caso lo he utilizado, por utilizar el mismo hardware en distintos ejemplos.

Observen que finalizada la orden de emisión por el pin PWM, el pin emite de continuo de forma autónoma e independientemente de lo que se haga a continuación en ese “loop” y sucesivos, En este caso no se hace nada, pero podríamos hacer muchas cosas con la seguridad que el pin emitirla como le hemos mandado hasta nueva orden.

Observarán también que la programación de pines PWM es mucho mas sencilla que generar manualmente Ondas con Modulación. Por lo tanto de forma habitual preferiremos esta solución a la manual. Mas aun pueden comparar lo sencillo que resulta conseguir que una luz suba y baje en comparación a como era hacerlo de forma manual.

A modo de prueba cambie “pinled2” al valor 4  y modifiquen el harware para que el cable salga del pin 4 que no es PWM. Observarán que la compilación no detecta el error pero el pin deja de funcionar  porque el pin4 no es PWM en una Tarjeta Arduino UNO por lo que lógicamente no puede atender al mandato “analogWrite“. Les dejo una fotografías con los distintos niveles de brillos que corresponen a distintos valores de “value”

nivel-0nivel-127
Nivel 0                                                                                                                   Nivel 127

nivel-255nivel-192
Nivel 192                                                                                                         Nivel 255

A continuación vamos a hacer como hicimos en el capítulo anterior que la luz de un pin PWM suba y baje

/* Sketch E7.12 Luz de un led suben y bajan mediante pines PWM
* Contadores j yk a cero
* Si j 0 led1 emite a (225 – k)
* k = k -1
* Si (k == 0) j = 0
* Repetir el ciclo
*/
// Área de definición de variables y parámetros
int pinled2 = 10;
int j = 0 ; // contador de la bajada
int k= 0 ; // contador de las subidas
int pausa = 30000 :
// Función setup
void setup() { }
// Función loop
void loop() {
// si (j <255) baja la luz poco a poco
if (j < 255) { analogWrite(pinled2, j); j = j +1 ; delayMicroseconds (pasusa) ; // frena el loop } if (j==255) { j = 256 ; k= 256 ; } if (k>0) {
analogWrite(pinled2, (256- k)) ;
k = k -1 ;
delayMicroseconds (pausa) ; // frena el loop
}
if (k==1) { j = 0 ; } //
} // fin función loop

Si copiamos, compilamos y subimos el Sketch a la Tarjeta Arduino, veremos parapadear uno de los led.

Pueden hacer diferentes pruebas no modificando el valor de los “delayMicroseconds” con lo que aceleran y retrasan el parpadeo de la luz.

Como ven resulta mas sencillo que en el programa similar anterior, la luz sube y baja. El truco nuevamente es utilizar dos contadores, una ascenderte y otro descendente. Solo hay que tantear un poco los valores de partida y nacionalización de los contadores para que no repitan cosas ni se sega el valor de “value” del rango comprendido entre 0 y 255.

Observen que aquí “setup” excepcionalmente no hace absolutamente nada, pero aun así, hay que declararla, porque el programa interno de Arduino espera encontrarla.

Como son muy sencillos he escrito parte de los “if” en una sola linea. Se puede usar este medio, o no, según resulte cómodo y quede legible el programa para cualquiera que lo lea.

He puesto “delayMicroseconds”, en primer lugar porque siendo nuevo conviene ejercitar un poco y además, porque al manejar una cifra mayor, permite a hacer los ajustes de velocidad con mayor finura que el “delay” normal con el fin de poder frenar un poco la velocidad del “loop” y que la subida y bajada se realice a una velocidad razonable.

Tienen que tener en cuenta que int solo vale para definir números comprendidos entre el rango de  -32,768 to 32,767, por tanto pausa se encuentra cerca del límite . Este límite fien limitado a que para guardar el valor utiliza 16 bits, uno que indica el signo y otros 15 para guardar el número en base 2. Si tuviérramos que guardar un número mas grande pode riamos definir la variable como “long” en u cuyo caso utilizaremos 32 bits pra guardar el valor, lo que permite guardar valores comprendidos entre -2,147,483,648 y 2,147,483,647.

Hagamos ahora el programa que permite que una luz suba mientras la otra baja. Solo tendremos que intercalar en el programa anterior dos instrucciones y retocar los “delayMicroseconds” hasta llegar a tener una velocidad convenientes final.

/* Sketch E7.14 Luz de dos leds uno suben y otro bajan con PWM
* Contadores j yk a cero
* Si j 0 led1 emite a (255-k) y led2 a “k”
* k = k -1
* Si (k == 0) j = 0
* Repetir el ciclo
*/
// Área de definición de variables y parámetros
int pinled1 = 9;
int pinled2 = 10;
int j = 0 ; // contador de la bajada
int k= 0 ; // contador de las subidas
int pausa = 30000 ;
// Función setup
void setup() { }
// Función loop
void loop() {
// si (j <255) baja la luz poco a poco
if (j < 255) { analogWrite(pinled1, j); analogWrite(pinled2, (255 -j)); j = j +1 ; delayMicroseconds(pausa) ; // frena el loop } if (j==255) { j = 256 ; k= 256 ; } if (k>0) {
analogWrite(pinled1, (256- k)) ;
analogWrite(pinled2, k -1) ;
k = k -1 ;
delayMicroseconds (pausa) ; // frena el loop
}
if (k==1) { j = 0 ; } //
} // fin función loop

Queda patente la sencillez que supone el manejo de pines PWM, como indicamos este programa, es exactamente el anterior con tres líneas nuevas, la relacionar de la variable “pinled1” y dos lineas con mandados “analogWrite” que gobierne la energía que se manda a este led.

Observarán que el manejo de pins PWM no platea especiales problemas una vez que se ha comprendido bien que es lo que hacen los led PWM y cómo lo hacen.

Repaso

Como repaso final te diré lo que has aprendido hoy

  • Ver la diferencia entre una pin PWM y unoo realmente analógico
  • Comprender los problemas que esta diferencia puede dar lugar en la realidad
  • Identificar en una Tarjeta Arduino cuales son los pin PWM
  • Mandato “analogWrite” y su sintaxis
  • Controlar la energía que permitimos salir por un pin PWM
  • Rango de las variables definidas como “int” y como “long”

Ejercicios para resolver

Vamos a repetir los mismos ejercicios que hemos hecho con los pines digitales en  OUPUT, pero en este cosa utilizando pin es PWM

Ejercicio 1- Simular un faro auténtico en una maqueta.

Para una maqueta nos proponemos hacer un faro que luzca con la misma cadencia del faro existente en la Ria de Ribadeo

Datos

En la página de Protección civil encontrara los destellos características de cada faro. Viene en la última columna y hay que saber interpretarlo Según el tipo de juego que proporcione la señal, podremos encontrar Grupos de destellos (GpD), que agrupa varios destellos y ocultaciones a un ritmo determinado entre sí, el Destello único (D), que se repite en todo el ciclo), Ocultaciones (Oc) y Grupo de ocultaciones (GpOc), donde los períodos de oscuridad son más frecuentes o duraderos que los de luz), o, simplemente, Luz fija (F). Luego viene un letra que es el color del faro generalmente “blanca” (B) pero a veces “verde” (V) o “roja” (R) y por último la duración del ciclo en segundos seguido de una s (20s)

Nos proponemos simular el faro situado de la Ria de Ribadeo, que tiene el siguiente ciclo GpD(3+1)B 20s o sea MAQUETA-FARO-2-costense-domus-40211un grupo de destellos en el que primero hay tres seguidos luego un espacio sin luz y un destello mas en un ciclo de 20 segundos Todos los destellos son blancos. Como no tengo información exacta de cuanto duran los destellos vamos a suponer que son como siguen:

El faro debe actuar de la siguiente forma

  • Destello de 5 décimas de segundos (500 ms)
  • Apagado 3 décimas de segundo (300 ms)
  • Destello de 5 décimas de segundos (500 ms)
  • Apagado 3 décimas de segundo (300 ms)
  • Destello de 5 décimas de segundos (500 ms)
  • Apagado 9 décimas de segundo (900 ms)
  • Destello de 10 décimas de segundos (1000 ms)
  • Apagado 16 segundo (16000 ms)

=================================================================
Puede encontrar resuelto este ejercicio en:
1º Ejercicio de uso de pines digitales de entrada INPUT – Semáforo utilizando “if”
=================================================================

2 – Luces de emergencia

Ejercicio 2 – Simular un semáforo que regula el paso en un túnel.
semaforoPara una maqueta deseamos simular un semáforo que regule el paso en un corto túnel que no permite el cruce de dos vehículos, no hay el riesgo que los vehículos choquen, porque desde un extremo se ve la salida, por tanto si hay o no un coche en su interior, pero para regular bien el trafico se desea lo siguiente

  • 1º.- En un extremos se acaba de poner la luz en verde mientras que en el otro extremo está en rojo. Así se mantiene 25 segundos.
  • 2º.- Para estimular el paso de los últimos coches, el verde se pone parpadeante cinco veces con periodos de encendido y apagados de un segundo. o sea esta así 10 segundos más, mientras que el otro extremo esta en rojo
  • 3º.- El semáforo se pone en rojo en un extremo, pero para dar tiempo a que salgan los coches que estuvieran dentro del túnel el otro extremo también continua en rojo durante otros 10 segundos
  • Se repite el proceso, pero en este caso el es otro extremo el que se pone en verde y el inicial continúa en rojo.

Proximamente  presentare una solución a estos problemas.

Félix Maocho

indice

Anuncios

15 febrero 2017 - Posted by | Curso de Arduino, Robotica | , ,

2 comentarios »

  1. Estimado Felix: Siempre muy interesates tus tutoriales. Quisiera hacerte una pregunta: Tienes algun tip o me puedes ayudar en un ejercicio que me dejaron orientado y que se trata de encender un led con la intensidad (PWM) y por un tiempo que me llegar desde el monitor serial separados por una coma(,)

    Ejemplo: llega 180,100 esto quiere decir que el led debe iluminar con una intensidad de 180 y por un tiempo de 100 msilisegundos.

    Yo logro leer los valores, incluso como string, pero no logro separar el 180 del 100 para utilizarlos separadamente en el programa, que no es nada complicado como ya hemos estudiado.

    Me puede sugerir algo?

    Desde ya muchas gracias y buen trabajo

    Comentario por Juan Carlos | 15 marzo 2017 | Responder

    • No estoy seguro que funcione, pero puedes probar. Define la variable en la que descargas los dos valores separados por coma que envías por comunicación serial, como un array de dos elementos

      Refiérete al elemento 1 del array,[1] como el valor de la energía que mandas para el pin PWM y al elemento 2 del array [2], como tiempo a tener encendido en led. Tienes un ejemplo (mas o menos) en esta página http://playground.arduino.cc/ArduinoNotebookTraduccion/Datatypes en el parrafo dedicado al Array

      Peleate con ello y a ver si ganas la batalla. Saludos

      Comentario por felixmaocho | 15 marzo 2017 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: