Con esta última entrada que publico terminare con los tutoriales de NetDuino sin que haga falta usar ningún elemento externo, a partir de las siguientes ya hará falta algo más que solo la placa.
En la entrada que nos ocupa hablare de la modulación por ancho de pulsos o PWM con NetDuino, que se complica un poco en comparación con Arduino, no todo iba a ser bueno 😉
La idea es poder cambiar el brillo del Led del NetDuino para que se encienda y vaya aumentando su brillo hasta el máximo y después vaya bajando hasta apagarse, ese ciclo se repetirá una y otra vez.
A continuación 3 ejemplos que hacen casi lo mismo pero con código de distinta forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using System.Threading; using Microsoft.SPOT.Hardware; using SecretLabs.NETMF.Hardware.Netduino; namespace com.giltesa.netduino.ejemplos { public class MyPWM { public static void Main() { PWM led = new PWM(PWMChannels.PWM_ONBOARD_LED, 1000, 0.5, false); // PWMChannel , frequency_Hz , dutyCycle , invert led.Start(); while (true) { // Se aumenta el brillo en pasos de 0.01 for (int i = 0; i < 100; i++) { led.DutyCycle = (double)i / 100; Thread.Sleep(10); } // Se disminuye el brillo: for (int i = 100; i > 0; i--) { led.DutyCycle = (double)i / 100; Thread.Sleep(10); } Thread.Sleep(1000); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using System.Threading; using Microsoft.SPOT.Hardware; using SecretLabs.NETMF.Hardware.Netduino; namespace com.giltesa.netduino.ejemplos { public class MyPWM { public static void Main() { PWM led = new PWM(PWMChannels.PWM_ONBOARD_LED, 1000, 0.5, false); led.Start(); while (true) { // Lo mismo que el ejemplo anterior pero trabajando directamente con números decimales. // Es más peligroso porque las operaciones pueden pasar de 0.1, 0.2, 0.3... y de repente 0.39999999999 for (double i = 0.0; i < 1.0; i = i + 0.01) { led.DutyCycle = i; Thread.Sleep(10); } for (double i = 1.0; i >= 0.0; i = i - 0.01) { led.DutyCycle = i; Thread.Sleep(10); } Thread.Sleep(1000); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// Fuente: http://forums.netduino.com/index.php?/topic/6875-anyone-have-a-good-pwm-example-for-netduino-plus-2/ using System.Threading; using Microsoft.SPOT.Hardware; using SecretLabs.NETMF.Hardware.Netduino; namespace com.giltesa.netduino.ejemplos { public class MyPWM { public static void Main() { PWM led = new PWM(PWMChannels.PWM_ONBOARD_LED, 1000, 0.5, false); led.Start(); while (true) { // Con operaciones matemáticas más complejas se puede reducir el código haciendo que el bucle sirva tanto para aumentar como para disminuir el brillo al mismo tiempo: for (double startValue = 4.712; startValue < 10.995; startValue = startValue + 0.1) { double value = System.Math.Sin(startValue) * 0.5 + 0.5; led.DutyCycle = value; Thread.Sleep(30); if (startValue == 4.712) Thread.Sleep(1000); } } } } } |
En ese segundo ejemplo el brillo aumenta por cada pulsación realizada en el pulsador del NetDuino, cuando llega al máximo se apaga por completo y vuelta a empezar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
using System; using Microsoft.SPOT.Hardware; using SecretLabs.NETMF.Hardware.Netduino; namespace com.giltesa.netduino.ejemplos { public class MyPWM { private static OutputPort led; private static InterruptPort boton; private static int brillo; public static void Main() { PWM led = new PWM(PWMChannels.PWM_ONBOARD_LED, 1000, 0.5, false); led.Start(); boton = new InterruptPort(Pins.ONBOARD_BTN, false, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeLow); boton.OnInterrupt += new NativeEventHandler(botonPulsado); while (true) { brillo = 0; while (brillo < 100) led.DutyCycle = (double)brillo / 100; } } public static void botonPulsado(UInt32 data1, UInt32 data2, DateTime time) { boton.DisableInterrupt(); brillo += 10; boton.EnableInterrupt(); } } } |
Luego hay muchos códigos por internet, por no decir la mayoría, que usan el constructor: PWM PWM_R = new PWM(Pins.PWM_ONBOARD_LED); pero a mi sin embargo no ha habido forma de hacerlo funcionar, mas que nada porque solo hay dos disponibles y ese no es uno de ellos… tengo que mirar si eso solo iba con NetDuino 1 o si es por usar un software/firmware distintos.