PWMを使ってみよう

Cosメソッド

sin,cosなどの三角関数にはSystem.Math.Cos()とMicrosoft.SPOT.Math.Cos()の2種類があります。以下のようなプログラムのようにSystemとMicrosoft.SPOTをusingで併記するとどちらのクラスのMath.Cos()なのか区別が出来ないのでフルネームで記述します。
この2つがどのように異なるのか調べることから始めます。

Cosメソッドのチェック
using System;
using System.Threading;         // Thread.Sleep使用のため追加
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;  // OutputPort使用のため追加、参照設定にも追加
using GHI.OSHW.Hardware;        // FEZCerberus使用のため追加、参照設定にも追加

namespace ledCos
{
    public class Program
    {
        public static void Main()
        {
            double theta = System.Math.PI / 180.0;
            for (int i = 0; i < 90; i += 5)
                Debug.Print("Cos" + i + " = " + System.Math.Cos(i * theta) + 
                    " ," + Microsoft.SPOT.Math.Cos(i) / 1000.0);
        }
    }
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 1度あたりのラジアンを計算する
14 0度から90度まで5度刻み
15 System.Math.Cosと
16 Microsoft.SPOT.Math.Cosとの
17 違いを調べてみる
18 
19 


実行結果
Microsoft.SPOT.Math.Cosは実行スピードとコード量を減らすためにかなり誤差を生じています。 LEDを光らせるような正確な値が必要でない場合には有効なメソッドでしょう。
Cos0 = 1 ,1
Cos5 = 0.99619469809174555 ,1
Cos10 = 0.98480775301220802 ,0.995
Cos15 = 0.96592582628906831 ,0.97799999999999998
Cos20 = 0.93969262078590843 ,0.95099999999999996
Cos25 = 0.90630778703664994 ,0.91400000000000003
Cos30 = 0.86602540378443871 ,0.86599999999999999
Cos35 = 0.8191520442889918 ,0.86599999999999999
Cos40 = 0.76604444311897801 ,0.80900000000000005
Cos45 = 0.70710678118654757 ,0.74299999999999999
Cos50 = 0.64278760968653936 ,0.66900000000000004
Cos55 = 0.57357643635104616 ,0.58799999999999997
Cos60 = 0.50000000000000011 ,0.5
Cos65 = 0.42261826174069944 ,0.5
Cos70 = 0.34202014332566882 ,0.40699999999999997
Cos75 = 0.25881904510252074 ,0.309
Cos80 = 0.17364817766693041 ,0.20799999999999999
Cos85 = 0.087155742747658124 ,0.105

LEDをふわふわ光らせる

cosの計算はMicrosoft.SPOT.Math.Cos()を用いることにします。
Microsoft.SPOT.Math.Cos()の引数はラジアンでなく角度であることに注意します。また、答えは1000倍の整数値であることに注意します。
光量を変化させるためにPWMクラスを用います。

LEDをふわふわ光らせる
using System;
using System.Threading;         // Thread.Sleep使用のため追加
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;  // OutputPort使用のため追加、参照設定にも追加
using GHI.OSHW.Hardware;        // FEZCerberus使用のため追加、参照設定にも追加

namespace LEDCos
{
    public class Program
    {
        public static void Main()
        {
            Microsoft.SPOT.Hardware.PWM pwm =
                new Microsoft.SPOT.Hardware.PWM(Cpu.PWMChannel.PWM_1,
                    20000, 1500, PWM.ScaleFactor.Microseconds, false);
            pwm.Start();
            while (true)
            {
                for (int i = 0; i < 360; i += 4)
                {
                    pwm.Duration = (uint)(Microsoft.SPOT.Math.Cos(i) + 1000) * 10;
                    Thread.Sleep(40);
                }
            }
        }
    }
}