PWM con CircuitPython

Tu tarjeta tiene soporte de pulseio, lo que significa que puedes controlar la intensidad de un LED por medio de PWM, puedes controlar servo motores, hacer sonar bocinas sencillas, y controlar dispositivos de tipo "pulse train" como DHT22 e infrarojos.

¡Casi todos los pines tienen capacidades de PWM! Por ejemplo, todas las tarjetas con ATSAMD21 tiene un pin A0 el cual es una salida analógica 'verdadera' y no tiene capacidades de PWM.

PWM con Frecuencia Fija

Este ejemplo va a demostrar como utilizar PWM para cambiar la intensidad del LED rojo de tu tarjeta.

Copia y pega el código dentro de code.py utilizando tu editor favorito, y salva el archivo.

import time
import board
import pulseio

led = pulseio.PWMOut(board.D13, frequency=5000, duty_cycle=0)

while True:
    for i in range(100):
        # PWM LED up and down
        if i < 50:
            led.duty_cycle = int(i * 2 * 65535 / 100)  # Up
        else:
            led.duty_cycle = 65535 - int((i - 50) * 2 * 65535 / 100)  # Down
        time.sleep(0.01)

Creando una Salida PWM

led = pulseio.PWMOut(board.D13, frequency=5000, duty_cycle=0)

Como estamos usando el LED que trae la tarjeta, llamamos al objeto led, usamos pulseio.PWMOut para crear la salida y pasarle el pin D13 para que use el LED.

Ciclo Principal

El ciclo principal utiliza range() para recorrer el ciclio. Cuando el rango está en menos de 50, le aumenta el brillo al LED vía PWM, y cuando el rango está por arriba de 50, le baja el brillo por medio de PWM. ¡Así es como transiciona el LED entre brillante y oscuro!

El time.sleep() es necesario para permitirle al proceso de PWM que ocurra en cierta cantidad de tiempo. ¡De otra forma sucedería muy rápido para poderlo observar!

Salida de PWM con Frecuencia Variable

La salida con frecuencias fijas está bien para pulsar LEDs o controlar servos. Pero si quieres realizar sonidos con un parlante tipo piezo, debes variar la frecuencia.

El siguiente ejemplo utiliza pulseio para realizar una serie de tonos sobre un parlante tipo piezo.

Para utilizar con cualquier de las tarjetas con M0, no se necesita realizar cambios al código.

Para utilizar con las Metro M4 Express, ItsyBitsy M4 Express o la Feather M4 Express, debes comentar  piezo = pulseio.PWMOut(board.A2, duty_cycle=0, frequency=440, variable_frequency=True) y descomentar piezo = pulseio.PWMOut(board.A1, duty_cycle=0, frequency=440, variable_frequency=True) . ¡A2 no es un pin con capacidades de PWM en las tarjetas con chips M4!

Recuerda: Para "comentar" una línea, le pones # y un espacio al inicio. Para "descomentar" una línea, le remueves el # y el espacio al inicio de la línea.
import time
import board
import pulseio

# For the M0 boards:
piezo = pulseio.PWMOut(board.A2, duty_cycle=0, frequency=440, variable_frequency=True)

# For the M4 boards:
# piezo = pulseio.PWMOut(board.A1, duty_cycle=0, frequency=440, variable_frequency=True)

while True:
    for f in (262, 294, 330, 349, 392, 440, 494, 523):
        piezo.frequency = f
        piezo.duty_cycle = 65535 // 2  # On 50%
        time.sleep(0.25)  # On for 1/4 second
        piezo.duty_cycle = 0  # Off
        time.sleep(0.05)  # Pause between notes
    time.sleep(0.5)

Si tienes la librería de simpleio cargada en tu tarjeta, tenemos un bonito utilitario para realizar un tono en el parlante de tipo piezo con un solo comando.

Para utilizar tarjetas M0, no es necesario realizar cambios al código.

Para utilizar las Metro M4 Express, ItsyBitsy M4 Express o la Feather M4 Express, debes comentar simpleio.tone(board.A2, f, 0.25) y descomentar simpleio.tone(board.A1, f, 0.25) . ¡A2 no es un pin con capadades PWM en las tarjetas con chipsM4!

import time
import board
import simpleio

while True:
    for f in (262, 294, 330, 349, 392, 440, 494, 523):
        # For the M0 boards:
        simpleio.tone(board.A2, f, 0.25)  # on for 1/4 second
        # For the M4 boards:
        # simpleio.tone(board.A1, f, 0.25)  # on for 1/4 second
        time.sleep(0.05)  # pause between notes
    time.sleep(0.5)

Como puedes observar, ¡es mucho más sencillo!

Cableándolo

Utilice los diagramas a continuación como base para cablear tu parlante de tipo piezo. Conecte una pata del piezo al pin A2 de las tarjetas M0 o A1 para las tarjetas con M4, y la otra pata a tierra. No importa cual pata se conecte al pin. ¡Son intercambiables!

Circuit Playground Express

Utilice clips de lagarto para conectar A2 y uno de las tierras (GND) a diferentes patas del parlante tipo piezo.

CPX tiene PWM en los siguientes pines: A1, A2, A3, A6, RX, LIGHT, A8, TEMPERATURE, A9, BUTTON_B, D5, SLIDE_SWITCH, D7, D13, REMOTEIN, IR_RX, REMOTEOUT, IR_TX, IR_PROXIMITY, MICROPHONE_CLOCK, MICROPHONE_DATA, ACCELEROMETER_INTERRUPT, ACCELEROMETER_SDA, ACCELEROMETER_SCL, SPEAKER_ENABLE.

NO hay NO PWM en: A0, SPEAKER, A4, SCL, A5, SDA, A7, TX, BUTTON_A, D4, NEOPIXEL, D8, SCK, MOSI, MISO, FLASH_CS.

Trinket M0

Nota: ¡A2 en la Trinket está etiquetado como Digital "0"!

Utilice cables para conectar GND y D0 a diferentes patas del parlante tipo piezo.

Las Trinket tienen PWM disponible en los siguientes pines: D0, A2, SDA, D2, A1, SCL, MISO, D4, A4, TX, MOSI, D3, A3, RX, SCK, D13, APA102_MOSI, APA102_SCK.

NO hay PWM en: A0, D1.

Gemma M0

Utilice cables para conectar GND y A2 a diferentes patas del parlante tipo piezo.

Las Gemma tienen PWM disponible en los siguientes pines: A1, D2, RX, SCL, A2, D0, TX, SDA, L, D13, APA102_MOSI, APA102_SCK.

NO hay PWM en: A0, D1.

Feather M0 Express

Utilice cables para conectar GND y A2 a diferentes patas del parlante tipo piezo.

Las Feather M0 Express tienen PWM disponible en los siguientes pines: A2, A3, A4, SCK, MOSI, MISO, D0, RX, D1, TX, SDA, SCL, D5, D6, D9, D10, D11, D12, D13, NEOPIXEL.

NO hay PWM en: A0, A1, A5.

Feather M4 Express

Utilice cables para conectar GND y A1 a diferentes patas del parlante tipo piezo.

Para utilizar A1, descomente la línea que configura el pin, y descomente la línea que etiquetada para las tarjetas M4. ¡Vea los detalles arriba!

Las Feather M4 Express tienen PWM disponible en los siguientes pines: A1, A3, SCK, D0, RX, D1, TX, SDA, SCL, D4, D5, D6, D9, D10, D11, D12, D13.

NO hay PWM en: A0, A2, A4, A5, MOSI, MISO.

ItsyBitsy M0 Express

Utilice cables para conectar G y A2 a diferentes patas del parlante tipo piezo.

Las ItsyBitsy M0 Express tienen PWM disponible en los siguientes pines: D0, RX, D1, TX, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, L, A2, A3, A4, MOSI, MISO, SCK, SCL, SDA, APA102_MOSI, APA102_SCK.

NO hay PWM en: A0, A1, A5.

ItsyBitsy M4 Express

Utilice cables para conectar G y A1 a diferentes patas del parlante tipo piezo.

Para utilizar A1, descomente la línea que configura el pin, y descomente la línea que etiquetada para las tarjetas M4. ¡Vea los detalles arriba!

Las ItsyBitsy M4 Express tienen PWM disponible en los siguientes pines: A1, D0, RX, D1, TX, D2, D4, D5, D7, D9, D10, D11, D12, D13, SDA, SCL.

NO hay PWM en: A2, A3, A4, A5, D3, SCK, MOSI, MISO.

Metro M0 Express

Utilice cables para conectar GND y A2 a diferentes patas del parlante tipo piezo.

Las Metro M0 Express tienen PWM disponible en los siguientes pines: A2, A3, A4, D0, RX, D1, TX, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, SDA, SCL, NEOPIXEL, SCK, MOSI, MISO.

NO hay PWM en: A0, A1, A5, FLASH_CS.

Metro M4 Express

Utilice cables para conectar GND y A1 a diferentes patas del parlante tipo piezo.

Para utilizar A1, descomente la línea que configura el pin, y descomente la línea que etiquetada para las tarjetas M4. ¡Vea los detalles arriba!

Las Metro M4 Express tienen PWM en: A1, A5, D0, RX, D1, TX, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, SDA, SCK, MOSI, MISO

NO hay PWM en: A0, A2, A3, A4, SCL, AREF, NEOPIXEL, LED_RX, LED_TX.

¿Donde si tengo PWM?

¿Quiere revisar cuales pines tienen PWM por ud mismo? ¡Hemos escrito este útil script! Intenta configurar PWM en cualquier pin disponible, y te hace saber en cuales funciona y en cuales no. ¡Pruébalo!

import board
import pulseio

for pin_name in dir(board):
    pin = getattr(board, pin_name)
    try:
        p = pulseio.PWMOut(pin)
        p.deinit()
        print("PWM on:", pin_name)  # Prints the valid, PWM-capable pins!
    except ValueError:  # This is the error returned when the pin is invalid.
        print("No PWM on:", pin_name)  # Prints the invalid pins.
    except RuntimeError:  # Timer conflict error.
        print("Timers in use:", pin_name)  # Prints the timer conflict pins.
    except TypeError:  # Error returned when checking a non-pin object in dir(board).
        pass  # Passes over non-pin objects in dir(board).
This guide was first published on Jun 24, 2020. It was last updated on Jun 24, 2020.
This page (PWM con CircuitPython) was last updated on Jul 15, 2020.