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);
}
}
}
}
}
|