3

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
4

4 に答える 4

2

ここで説明されている Convert.ToUInt32 を使用してみてください: http://msdn.microsoft.com/en-us/library/y3569ft9.aspx

Windows 7 64bit 上の .Net 4.0 (Micro ではない) では、CInt/CUInt で表示されているものが表示されません (私の場合は正しく変換されます)。これは、netduino/マイクロ フレームワークの実装エラーである可能性があります...私がそれを持っていれば、上記をテストします。

于 2012-01-10T15:41:47.120 に答える
1

何が起こっていても、できる限り UInts を避けることをお勧めします (私はそこにいました)。次のようなコードを書きます。

Dim Start As Integer = 0
Dim [End] As Integer = 255
Dim Steps As Integer = 100

For x As Integer = 1 To Steps
    Dim Temp As Integer = ([End] - Start) \ Steps * x + Start
    LedR.SetPulse(255, CType(Temp,UInteger))
    Threading.Thread.Sleep(20)
Next

私はVb.Netコンパイラを利用できず、SOに直接コードを書いたので試すことができません。コンパイルエラーがある場合はご容赦ください。

于 2012-01-10T14:58:37.367 に答える
1

まったく異なる別のアプローチ。問題は double と変換にあるように見えるので、double が減算のみを行うのを避けることができます。

Dim Start As Integer = 0
Dim [End] As Integer = 255
Dim Increment As Integer = 3
Dim Current as Integer = Start

While Current < End
    Current = Current + Increment
    LedR.SetPulse(255, CType(Current ,UInteger))
    Threading.Thread.Sleep(20)
End While

クイック&ダーティですが、うまくいきます。

于 2012-01-10T16:29:01.167 に答える
1

どうですか

Debug.Print(Test.ToString().Split("."c)(0))

私はエッジケースを解決していませんが、これは私が試したいくつかの例で機能しました. これをループで実行する必要がある場合は、うまく機能しないため、このソリューションはお勧めしませんが、より良いものが見つかるまでの応急処置になる可能性があります。

于 2012-01-10T16:29:29.810 に答える