ラズパイマウスの前方の距離を測定する

測定するモジュールを作る



ADConモジュール(ADCon.fs)
module ADcon
open System
open System.Threading
open RaspberryPiDotNet

type ADcon() =
    static let SPICLK = new GPIOMem(GPIOPins.V2_Pin_P1_23)
    static let SPIMISO = new GPIOMem (GPIOPins.V2_Pin_P1_21)
    static let SPIMOSI = new GPIOMem (GPIOPins.V2_Pin_P1_19)
    static let SPICS = new GPIOMem (GPIOPins.V2_Pin_P1_24)
    static let mutable distance: int array = Array.zeroCreate 4
    static let IrLED : GPIOMem array = 
        [| new GPIOMem(GPIOPins.V2_Pin_P1_07);
            new GPIOMem (GPIOPins.V2_Pin_P1_11);
            new GPIOMem (GPIOPins.V2_Pin_P1_13);
            new GPIOMem (GPIOPins.V2_Pin_P1_15) |]
    do 
        for i =0 to IrLED.Length-1 do
            IrLED.[i].PinDirection = GPIODirection.Out |> ignore

        SPICLK.PinDirection <- GPIODirection.Out
        SPIMISO.PinDirection <- GPIODirection.In
        SPIMOSI.PinDirection <- GPIODirection.Out
        SPICS.PinDirection <- GPIODirection.Out

    member public this.adGet=
        for adcnum=0 to 3 do
            IrLED.[adcnum].Write(true)
            let mcp3208 = new MCP3008(adcnum, SPICLK,SPIMOSI,SPIMISO,SPICS)
            distance.[adcnum] <- mcp3208.AnalogToDigital
            IrLED.[adcnum].Write(false)
    member public this.Distance(i:int)=
        distance.[i]
 1 
 2 
 3 
 4 
 5 
 6 
 7 SPIのプロトコルに対応した
 8 ピンのオブジェクトを作る
 9 
10 
11 4つの距離測定値を入れる配列
12 
13 LEDのオブジェクトの配列
14 
15 
16 
17 
18 
19 LEDを出力に設定する
20 
21 SPIの各々のピンの入出力を設定
22 
23 
24 
25 
26 
27 
28 LED点灯
29 
30 反射光測定
31 LED消灯
32 距離値を返す関数
33 


メインプログラム

各LEDを光らせ、反射光のレベルをADコンバータで測定します。
main.fs
open ADcon
open System
open System.Timers
open System.Threading
open RaspberryPiDotNet

let timer3 = new Timers.Timer()

let runTimerAsync (t : System.Timers.Timer) s =
    async {
        t.Start()
        // Async workflow needs to do something (basically block here)
        do! Async.Sleep s
        t.Stop()        
    }

let Ad = new ADcon()

timer3.Elapsed.Add
    (fun _ -> 
        Ad.adGet
        printf "%A " (Ad.Distance 0)
        printf "%A " (Ad.Distance 1)
        printf "%A " (Ad.Distance 2)
        printfn "%A" (Ad.Distance 3) 
    )
let mutable count =5000
timer3.Interval <- 300.
Async.Parallel [(runTimerAsync timer3 count)]
|>Async.RunSynchronously |> ignore
 1 ADConモジュールを使う
 2 
 3 
 4 
 5 
 6 
 7 タイマーオブジェクト
 8 
 9 
10 
11 タイマースタート
12 
13 
14 タイマーストップ
15 
16 
17 ADConオブジェクト
18 
19 タイムアウトした時に
20 各センサーの値を表示
21 
22 
23 
24 
25 
26 
27 
28 
29 300ms間隔で距離を測定する
30