bclose

Los pines cuasi analógicos

Los pines analógicos
tienda online prometec

Objetivos

.

 
    • Comprender las diferencias entre analógico y digital.
    • Conocer las salidas cuasi analógicas de Arduino.
    • Modulación PWM

 

Material requerido.

ArduinoUNO Arduino Uno o similarEsta sesión acepta cualquier otro modelo de Arduino
Img_3_4  Una Protoboard.
componente Un diodo LED.
Img_3_5 na resistencia de 330 Ohmios..
Img_3_6 Algunos cables de Protoboard..

 

Analógico y digital

 

Todas las señales que hemos manejado hasta ahora con nuestro Arduino , de entrada o de salida, comparten una característica común: Son digitales, es decir que pueden tomar un valor HIGH o LOW pero no valores intermedios.

Si representamos una el valor de una señal digital a lo largo del tiempo veríamos algo así:

serie de bits

En la vida muchas cosas son así, apruebas o suspendes, enciendes la luz o la apagas, pero muchas otras son variables mensurables continuas y pueden tomar cualquier valor que imaginemos, como el ángulo del reloj o la temperatura, que aun dentro de valores finitos pueden tomar tantos valores intermedios como podamos imaginar,

A esta clase de variables las llamamos analógicas y una representación por contraposición a lo digital, sería algo como esto:

 

Analogico

No es raro que queramos controlar algo del mundo exterior con una señal analógica de forma que el comportamiento del sistema siga esa señal. Podemos por ejemplo querer variar la luminosidad de un diodo LED y no simplemente apagarlo o encenderlo

En esta sesión aprenderemos a enviar señales analógicas a los pines de salida de Arduino.

Salidas cuasi analógicas

.

Hasta ahora hemos visto como activar las salidas digitales de Arduino, para encender y apagar un LED por ejemplo. Pero no hemos visto como modificar la intensidad del brillo de ese LED. Para ello, tenemos que modificar la tensión de salida de nuestro Arduino, o en otras palabras tenemos que poder presentar un valor analógico de salida.

Para empezar tenemos que dejar claro que los Arduino carecen de salidas analógicas puras que puedan hacer esto (con la notable excepción del Arduino DUE).

Pero como los chicos de Arduino son listos, decidieron emplear un truco, para que con una salida digital podamos conseguir que casi parezca una salida analógica.

A este truco se le llama PWM, siglas de Pulse Width Modulation, o modulación de ancho de pulsos. La idea básica es poner salidas digitales que varían de forma muy rápida de modo que  el valor eficaz de la señal de salida sea equivalente a una señal analógica de menor voltaje.

Lo sorprendente es que el truco funciona.

MOdulacion por anchura de pulsos

 

Fijaros en la anchura del pulso cuadrado de arriba. Cuanto mas ancho es, mas tensión promedio hay presente entre los pines, y esto en el mundo exterior es equivalente a un valor analógico de tensión comprendido entre 0 y 5V.  Al 50% es equivalente a una señal analogica del 50% de 5V, es decir 2,5. Si mantenemos los 5V un 75% del tiempo, será el equivalente a una señal analógica de 75% de 5V = 3,75 V.

Para poder usar un pin digital de Arduino como salida analógica, lo declaramos en el Setup() igual que si fuera digital:

pinMode( 9, OUTPUT) ;

La diferencia viene a la hora de escribir en el pin:

digitalWrite(9, HIGH);                        //Pone 5V en la salida
digitalWrite(9, LOW);                         //Pone 0V en la salida
analogWrite( 9, V) ;

analogWrite escribe en el pin de salida un valor entre 0 y 5V, dependiendo de V (que debe estar entre 0 y 255).

De este modo si conectamos un LED a una de estas salidas PWM podemos modificar su brillo sin más que variar el valor que escribimos en el pin.

Pero hay una restricción. No todos los pines digitales de Arduino aceptan poner valores PWM en la salida. Solamente aquellos que tienen un símbolo  ~ delante del número. Fijaros en la numeración de los pines de la imagen:

detalle pines

solo los que llevan simbolo

 
  • Solamente los pines 3, 5, 6, 9, 10 y 11 pueden hacer PWM y simular un valor analógico en su salida.
  • Si intentas hacer esto con un pin diferente, Arduino acepta la orden tranquilamente, sin error, pero para valores de 0 a 127 entiende que es LOW y para el resto pone HIGH y sigue con su vida satisfecho con el deber cumplido.
 

 

Modificando el brillo de un LED

.

Vamos a hacer el típico montaje de una resistencia y un diodo LED, similar al de la sesión 3, pero asegurándonos de usar uno de los pines digitales que pueden dar señales PWM. En la imagen he usado el pin 9.
Podemos escribir un programa parecido a esto:

void setup()                                               //Prog_10_1
   {  
       pinMode( 9, OUTPUT) ;  
   }
void loop()
   {
       for ( int i= 0 ; i<255 ; i++)
           {
                analogWrite (9, i) ;
                delay( 10);
           }
   }

El LED va aumentando el brillo hasta un máximo y vuelve a empezar bruscamente. Podemos modificar un poco el programa  para que la transición sea menos violenta:

void setup()                                      // Prog 10_2
   { 
       pinMode( 9, OUTPUT) ;  
   }

void loop()
{
       for ( int i= -255 ; i<255 ; i++)
             {
                 analogWrite (9, abs(i)) ;
                 delay( 10);
             }
}

Aquí aprovecho ( por pura vagancia) para hacer el ciclo de subir y bajar el brillo del LED con un único bucle. La función abs(num), devuelve el valor absoluto o sin signo de un número num, y por eso mientras que i viaja de -255 a 255, abs(i) va de 255 a 0 y vuelta a subir a 255. ¿Que os parece el truco?

 

Resumen de la sesión

.

 
    • Describimos a grandes rasgos la diferencia ente valores digitales y valores analógicos.
    • Hemos visto como simular valores analógicos en una salida digital de Arduino.
      • Solo con las salidas que lo aceptan: pines 3, 5, 6, 9, 10 y 1.
      • Podemos asignar valores entre 0 y 255.

 

 

 

 

(17) Comments

    • Marcelo v

    Buenos días, una pregunta en el uso de analogWrite y digitalwrite tengo una pequeña confusión, hay un sketch de sensor de temperatura y tiene una entrada análogica A0 que conecta la base del transistor, y tengo un led en el pin 13 digital aquí para prender el led usan digitalWrite.
    En otro sketch que usan una fotocelda también hay una entrada analógica A0 que conecta un pin de la fotocelda y hay un led conectado al pin 13 digital, aquí para prender el led usan analogWrite pq me podrían ayudar cuál es la razón por favor

    • Hola Marcelo, algunos de los pines se pueden usar como salida analógica o digital, son los que tienen un dibujo de una onda al lado. Usamos analogWrite cuando queremos utilizarlos como salida analógica, y digitalWrite cuando los usamos como salidas digitales.

  • Todo ok. Supongo que esto servirá, en caso de poner un motor en lugar del led, y así variar velocidades. Interesante.

  • Supongo que para representar de 0 a 5V , con 1 byte es suficiente……es ese el motivo?

    • El usar 256 niveles es simplemente porque en efecto usamos un byte para representarlo, permitiendonos 2^8 = 256 valores diferentes a la hora de escribir en las puertas PWM

      Pero fijate que cuando usamos las puertas analogicas para leer arduino usa 10 bits y por eso te permite 2^10 = 1024 niveles distintos
      La decision de cuantos bits se usan es bastante arbitraria de diseño del procesador

  • Buenas…..porqué está acotado a valores entre 0 y 255 ? esto es la información de 1 byte… pero porqué a 1 byte?

    • Hola Julio, efectivamente es porque utiliza un byte. Se usan más bytes si necesitas que tener una resolución mayor, es decir si necesitas valores más precisos en la conversión analógico a digital. Con un byte la resolución que tienes 5V/256=19.5mV Un saludo!

    • Es una decision de diseño del fabricante sin una razon especial, podiamos haber usado 10 o 12 bits si hubiera querido

    • Fran

    Primero mi mas sincera enhorabuena, genial la web.
    Ahora una cuestion. ¿Puedo poner un led en un pin de los marcados como analogico y sin cambiarlo a digital, hacer lo mismo con dicho led?, es decir, encenderlo y apagarlo con la intensidad que queramos?

    • Si por un pin de los marcados como analogicos, te refieres a los que tiene capacidad PWM la respuesta es si.
      Pero si te refieres a los pines A0 a A5 que son las entrada sanalogicas la respuesta es no

  • Me gustaría saber por qué así no me escribe en pantalla los voltajes que va obteniendo. Gracias.

    void setup() //Prog_10_1
    {
    pinMode( 9, OUTPUT) ;

    }
    void loop()
    {
    for ( int i= 0 ; i<255 ; i++)
    {
    Serial.print(String(i));
    analogWrite (9, i) ;
    delay( 10);

    }

    }

    • Hola Miguel,
      No puede mostrate el resultado porque no has incializado la puerta serie con: Serial.begin(9600) ;

    • Edgar Cano

    Una pregunta, en el resumen de la sesión indica que podemos asignar valores de 0 a 254, sin embargo leí en el libro de proyectos de Arduino que el valor puede ser de 0 a 255, pero no entiendo porque? solo se que el PWM de la Arduino UNO es de 500Hz

    • Hola Edgar, era un error de esos que causan los duendes de la ecritura. Ya esta corregido, porque naturalmente con 8 bits para codificarlo podemos asignar del 0 al 255. Muchas gracias por indicarmelo

  • Lo mismo mi mas sinceras gracias.

    • Juan Luis

    Gracias!
    Gracias por su dedicación en tiempo y trabajo para lograr estos tutoriales, bien explicados, muy bien estructurados y bien acertados.
    En lo poco que he logrado ver de sus explicaciones, opino que es un excelente trabajo y un gran aporte para los seguidores, usuarios y programadores de dispositivos arduino.

    • David

    Estoy siguiendo tu tutorial, y solo quería agradecerte todo el trabajo que tiene hacer algo así, he visto varios tutoriales pero la verdad ninguno que lo explique para aprender de forma tan sencilla y bien esquematizada, por no hablar de los trucos como el que has puesto de abs, me ha costado un rato comprenderlo XD.

    Lo dicho, muchas gracias por este gran trabajo!

Give a Reply

WordPress Anti-Spam by WP-SpamShield