RGB LED の色をクロス フェードするのにかなり厄介なものがあり、目的の値を取得するのに問題があります。
この例を最小限に抑えましたがStart
、すべて変数になりますEnd
...Steps
これはR
、100 段階で 0 から 255 まで直線的に増加(UInt) する必要があります。ここでは精度についてあまり心配していないので、適切に丸められるか、単にFloor
/を実行するかはあまり気にしませんCeiling
Dim Start As UInteger = 0
Dim [End] As UInteger = 255
Dim Steps = 100
For x = 1 To Steps
Dim Temp = ([End] - Start) / Steps * x + Start
Dim R = CUInt(Temp)
Debug.Print(x.ToString & ": Temp: " & Temp.ToString & ", R:" & R.ToString)
LedR.SetPulse(255, R)
Threading.Thread.Sleep(20)
Next
この出力:
1: Temp: 2.5500, R:196608
2: Temp: 5.1000, R:327680
3: Temp: 7.6500, R:524288
4: Temp: 10.2000, R:655360
5: Temp: 12.7499, R:851968
...
95: Temp: 242.2488, R:15859712
96: Temp: 244.7988, R:16056320
97: Temp: 247.3488, R:16187392
98: Temp: 249.8988, R:16384000
99: Temp: 252.4488, R:16515072
100: Temp: 254.9988, R:16711680
ご覧のとおり、Temp 変数はかなり正確で、わずかな不正確さを許容していますが、 との相関関係がわかりませんR
。
CUint が単に Temp のビットを読み取って をDouble
として扱っている可能性がありますUInt
が、その場合、正しく変換するにはどうすればよいですか?
(ちなみに、これはnetduinoで実行されています)、.Net Micro Framework 4.2
編集:以下に要求されたテスト:
Dim Test As Integer = 2
Debug.Print(Test.ToString)
Debug.Print(CInt(Test).ToString)
Debug.Print(CUInt(Test).ToString)
2
2
2
Dim Test As Double = 2.5
Debug.Print(Test.ToString)
Debug.Print(CInt(Test).ToString)
Debug.Print(CUInt(Test).ToString)
2.5000
131072
131072
次のコードを使用して...
For x = 0 To Steps
Dim Temp As Long = ([End] - Start) \ Steps * x + Start
Dim R = CType(Temp, UInteger)
Debug.Print(x.ToString & ": Temp: " & Temp.ToString & ", R:" & R.ToString)
LedR.SetPulse(255, R)
Threading.Thread.Sleep(20)
Next
私は(Dim Temp
ライン上で)得る:
An unhandled exception of type 'System.Exception' occurred in Netduino_VBTest.exe
内部例外はありませんが、出力のすぐ上に最初の例外があり、これが根本的な原因であると推測しています。
A first chance exception of type 'System.NotImplementedException' occurred in Microsoft.SPOT.Native.dll