{"id":5953,"date":"2014-06-23T09:01:23","date_gmt":"2014-06-23T00:01:23","guid":{"rendered":"http:\/\/www.moonmile.net\/blog\/?p=5953"},"modified":"2014-06-23T09:53:06","modified_gmt":"2014-06-23T00:53:06","slug":"f-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6raspberrypibrickpilogo-mindstorms-ev3-%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99","status":"publish","type":"post","link":"http:\/\/www.moonmile.net\/blog\/archives\/5953","title":{"rendered":"F# \u3092\u4f7f\u3063\u3066RaspberryPi+BrickPi+LOGO Mindstorms EV3 \u3092\u52d5\u304b\u3059"},"content":{"rendered":"<p>\nF# \u306b\u9650\u3089\u306a\u3044\u306e\u3067\u3059\u304c\u3001\u8a66\u3057\u306b\u30e2\u30fc\u30bf\u30fc\u5236\u5fa1\u306e\u90e8\u5206\u3060\u3051 .NET \u7248\u306e BrickPi \u3092\u4f5c\u308a\u307e\u3057\u305f\u3002\n<\/p>\n<p>\n<a href=\"https:\/\/github.com\/moonmile\/BrickPiNet\">https:\/\/github.com\/moonmile\/BrickPiNet<\/a>\n<\/p>\n<p><a href='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2014\/06\/wpid-dworkblogimage20140623_01org.jpg'><img border='0' src='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2014\/06\/wpid-dworkblogimage20140623_01thum.jpg'\/><\/a><\/p>\n<p>\n&#8211; BrickPi.h \u3068 brickpinet.c \u3067 .NET \u306b\u516c\u958b\u53ef\u80fd\u306a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3092\u4f5c\u308b<br \/>\n&#8211; BrickPi.cs \u3068 BPi.cs \u3067 .NET \u3067\u5305\u3080<br \/>\n&#8211; sample.cs\u3001sampleF.fs \u306e\u3088\u3046\u306b C#\/F# \u3067\u5236\u5fa1\u3059\u308b\n<\/p>\n<p>\n\u3068\u3044\u3046\u30d1\u30bf\u30fc\u30f3\u3067\u3059\u3002BrickPi_Python \u306a\u3069\u3092\u898b\u308b\u3068\u3001\u305d\u308c\u305e\u308c\u306e\u8a00\u8a9e\u3067\u30b7\u30ea\u30a2\u30eb\u30dd\u30fc\u30c8\u306b\u76f4\u63a5\u30a2\u30af\u30bb\u30b9\u3057\u3066\u3044\u308b\u306e\u3067\u3059\u304c\u3001C# \u304b\u3089\u30dd\u30fc\u30c8\u30a2\u30af\u30bb\u30b9\u306f\u9762\u5012\u3060\u3057\u3001BlickPi.h \u81ea\u4f53\u3067\u5341\u5206\u306a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306b\u306a\u3063\u3066\u3044\u308b\u306e\u3067\u3053\u308c\u3092\u305d\u306e\u307e\u307e\u4f7f\u3044\u307e\u3059\u3002BrickPi.h \u81ea\u4f53\u306f C\u8a00\u8a9e\u3067\u639b\u304b\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u305d\u306e\u307e\u307e shared \u3067\u516c\u958b\u3057\u3066\u3001\u3053\u308c\u3092 BrickPi.cs \u3067 DllImport \u3059\u308b\u3068\u3044\u3046\u30b9\u30bf\u30a4\u30eb\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\n<\/p>\n<p>\nsample.cs \u3068 sampleF.fs \u306e\u5834\u5408\u306f\u3001\u307b\u3068\u3093\u3069\u751f\u306e BrickPi \u30af\u30e9\u30b9\u3092\u4f7f\u3063\u3066\u3044\u308b\u306e\u3067\u4ed6\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u8a00\u8a9e\u3068\u306e\u5bfe\u5fdc\u304c\u53d6\u308a\u3084\u3059\u304f\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u304c\u3001\u305d\u306e\u307e\u307e\u3067\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u7684\u306b\u6271\u3044\u306b\u304f\u3044\u306e\u3067\u3001BPi \u30af\u30e9\u30b9\u3092\u4f5c\u3063\u3066\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u5316\u3057\u3066\u3044\u307e\u3059\u3002\u8907\u6570\u306e\u30e2\u30fc\u30bf\u30fc\u5236\u5fa1\u306e\u3068\u3053\u308d\u3067 MVVM \u30d1\u30bf\u30fc\u30f3\u3092\u4f7f\u3063\u3066\u3044\u308b\u306e\u306f\u304a\u8a66\u3057\u3067\u3059\u3002BrickPi \u306e\u5834\u5408\u306f\u3001\u30dd\u30fc\u30c8\u547c\u3073\u51fa\u3057\u306e\u5f8c\u306b\u623b\u308a\u304c\u306a\u3044\u306e\u3067\u3001INotifyPropertyChanged \u3068\u76f8\u6027\u304c\u3088\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\u6b21\u306f\u30bb\u30f3\u30b5\u30fc\u304b\u3089\u5165\u3063\u3066\u6765\u308b\u64cd\u4f5c\u306a\u306e\u3067\u3001event \u7684\u306b\u4f5c\u308b\u304b\u3001reactive \u7684\u306b\u4f5c\u308b\u304b\u3001\u3068\u3044\u3063\u305f\u3068\u3053\u308d\u3067\u3059\u3002\n<\/p>\n<p>\n\u4ee5\u4e0b\u3001\u3056\u3063\u3068\u30d5\u30a1\u30a4\u30eb\u306e\u89e3\u8aac\u3092\u3002\n<\/p>\n<p>\n\u25a0Makefile\n<\/p>\n<p>\nRaspberry Pi \u4e0a\u3067\u30d3\u30eb\u30c9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u306e\u3067\u3001Makefile \u3092\u4f5c\u3063\u3066\u3044\u307e\u3059\u3002\u5148\u306e\u30d6\u30ed\u30b0\u306b\u3082\u66f8\u304d\u307e\u3057\u305f\u304c\u3001RasPi \u306e\u73fe\u72b6\u306e\u30ec\u30dd\u30b8\u30c8\u30ea\u306b\u3042\u308b mono \u3067\u306f F# 3.1 \u304c\u52d5\u304b\u306a\u3044\u306e\u3067\u3001mono \u306e\u30d3\u30eb\u30c9\u304c\u5fc5\u9808\u306b\u306a\u308a\u307e\u3059\u3002\u305d\u308c\u3060\u3068\u76f8\u5f53\u5927\u5909\u306a\u306e\u3067\u3001\u5358\u306b\u8a66\u3057\u305f\u3044\u65b9\u306f\u3001F# \u306e\u307b\u3046\uff08fshaprc\u306e\u3068\u3053\u308d\uff09\u306f\u524a\u9664\u3057\u3066\u3001apt-get install mono-complete \u306e\u5f8c\u3001\u30d3\u30eb\u30c9\u3092\u8a66\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002\n<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nall: sample.exe \r\n\tsampleF.exe \r\n\tlibbrickpinet.so \r\n\tsampleCs.exe \r\n\tsampleF2.exe\r\n\r\nsample.exe: libbrickpinet.so BrickPi.dll sample.cs\r\n\tgmcs \/out:sample.exe -sdk:4.5 \/r:BrickPi.dll sample.cs \r\nsampleCs.exe: libbrickpinet.so BrickPi.dll sampleCs.cs\r\n\tgmcs \/out:sampleCs.exe -sdk:4.5 \/r:BrickPi.dll sampleCs.cs \r\nsampleF.exe: libbrickpinet.so BrickPi.dll\r\n\tfsharpc \/out:sampleF.exe \/r:BrickPi.dll sampleF.fs \r\nsampleF2.exe: libbrickpinet.so BrickPi.dll\r\n\tfsharpc \/out:sampleF.exe \/r:BrickPi.dll sampleF2.fs \r\n\r\nlibbrickpinet.so: brickpinet.o \r\n\tgcc -fPIC -shared -o libbrickpinet.so brickpinet.c -lrt -lm -L\/usr\/local\/lib -lwiringPi\r\nBrickPi.dll: BrickPi.cs \r\n\tgmcs \/target:library \/out:BrickPi.dll \r\n\t-sdk:4.5 \r\n\tBindableBase.cs  \r\n\tBrickPi.cs \r\n\tBPi.cs\r\n<\/pre>\n<p>\n\u25a0brickpinet.c\n<\/p>\n<p>\nlibbrickpinet.so \u3067 BrickPi API \u3092\u516c\u958b\u3055\u305b\u3066\u3044\u307e\u3059\u3002BrickPi \u69cb\u9020\u4f53\u3078\u306e\u30a2\u30af\u30bb\u30b9\u304c\u3044\u3061\u3044\u3061\u66f8\u3044\u3066\u308b\u306e\u306f\u3001C# \u304b\u3089 C\u8a00\u8a9e\u306e\u69cb\u9020\u4f53\u306e\u624b\u9593\u3092\u7701\u304f\u305f\u3081\u3067\u3059\u3002box \u3057\u3066\u3082\u3088\u3044\u306e\u3067\u3059\u304c\u3001Mono \u306e\u5834\u5408 box \u306f\u4f7f\u3048\u308b\u306e\u304b\uff1f\u3068\u304b\u8abf\u3079\u308b\u306e\u304c\u9762\u5012\u3060\u3063\u305f\u306e\u3067\u3002\n<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/*\r\n * BrickPi Interface for .NET \r\n *\/\r\n#include &quot;tick.h&quot;\r\n#include &quot;BrickPi.h&quot;\r\n\r\nvoid SetTimeout(int time) {\r\n\tBrickPi.Timeout = time;\r\n}\r\nint GetTimeout() {\r\n\treturn BrickPi.Timeout;\r\n}\r\n\/*\r\n  Motors\r\n*\/\r\nvoid SetMotorSpeed(int motor, int speed) {\r\n\tBrickPi.MotorSpeed&#x5B;motor] = speed;\r\n}\r\nint GetMotorSpeed(int motor) {\r\n\treturn BrickPi.MotorSpeed&#x5B;motor];\r\n}\r\nvoid SetMotorEnable(int motor, int b) {\r\n\tBrickPi.MotorEnable&#x5B;motor] = b == 0 ? 0 : 1;\r\n}\r\nint GetMotorEnable(int motor) {\r\n\treturn BrickPi.MotorEnable&#x5B;motor] == 0 ? 0 : 1;\r\n}\r\n...\r\n<\/pre>\n<p>\n\u25a0BrickPi.cs\n<\/p>\n<p>\n\u5358\u7d14\u306a.NET\u7248\u306e\u30e9\u30c3\u30d1\u30fc\u30af\u30e9\u30b9\u3067\u3059\u3002\u4ed6\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u8a00\u8a9e\u3068\u306e\u5bfe\u5fdc\u304c\u3068\u308a\u3084\u3059\u3044\u5f62\u306b\u3057\u307e\u3059\u3002\n<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nnamespace BrickPiNet\r\n{\r\n    public class BrickPi\r\n    {\r\n        public const int PORT_A = 0;\r\n        public const int PORT_B = 1;\r\n        public const int PORT_C = 2;\r\n        public const int PORT_D = 3;\r\n\r\n        public const int PORT_1 = 0;\r\n        public const int PORT_2 = 1;\r\n        public const int PORT_3 = 2;\r\n        public const int PORT_4 = 3;\r\n\r\n        public const int MASK_D0_M = 0x01;\r\n        public const int MASK_D1_M = 0x02;\r\n        public const int MASK_9V = 0x04;\r\n        public const int MASK_D0_S = 0x08;\r\n        public const int MASK_D1_S = 0x10;\r\n\r\n\uff5e\uff5e\uff5e\r\n        &#x5B;DllImport(&quot;libbrickpinet&quot;, EntryPoint = &quot;BrickPiSetup&quot;)]\r\n        public static extern int Setup();\r\n        &#x5B;DllImport(&quot;libbrickpinet&quot;, EntryPoint = &quot;BrickPiSetupSensors&quot;)]\r\n        public static extern int SetupSensors();\r\n        &#x5B;DllImport(&quot;libbrickpinet&quot;, EntryPoint = &quot;BrickPiUpdateValues&quot;)]\r\n        public static extern void UpdateValues();\r\n        &#x5B;DllImport(&quot;libbrickpinet&quot;, EntryPoint = &quot;BrickPiSetTimeout&quot;)]\r\n        public static extern void InitTimeout();\r\n<\/pre>\n<p>\n\u25a0BPi.cs\n<\/p>\n<p>\n\u3044\u3061\u3044\u3061\u95a2\u6570\u3092\u547c\u3073\u51fa\u3059\u306e\u306f\u9762\u5012\u306a\u306e\u3067\u3001\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u3063\u307d\u304f\u76f4\u3057\u305f\u306e\u304c BPi \u30af\u30e9\u30b9\u3067\u3059\u3002<br \/>\n\u5024\u3092\u8a2d\u5b9a\u3057\u305f\u5f8c\u306b\u3001BrickPi.UpdateValues() \u3092\u547c\u3073\u51fa\u3055\u306a\u304f\u3066\u3082\u3088\u3044\u3088\u3046\u306b\u3057\u3066\u3042\u308a\u307e\u3059\u3002\u305f\u3060\u3001\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u5909\u66f4\u306b\u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u306e\u306f MVVM \u306e\u6b20\u70b9\u3067\u3001\u3053\u306e\u3042\u305f\u308a\u306f\u5225\u306a\u3068\u3053\u308d\u3067\u56de\u907f\u3057\u3088\u3046\u304b\u306a\u3068\u601d\u3063\u3066\u307e\u3059\u3002\u4f8b\u3048\u3070\u30012\u3064\u306e\u30e2\u30fc\u30bf\u30fc\u306e\u5411\u304d\u3092\u540c\u6642\u306b\u5909\u3048\u308b\u3001\u3068\u3044\u3046\u3088\u3046\u306a\u30d1\u30bf\u30fc\u30f3\u304c\u305d\u308c\u306b\u76f8\u5f53\u3057\u307e\u3059\u3002\n<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\npublic class BPi\r\n{\r\n    public ObservableCollection&lt;BPiMotor&gt; Motors;\r\n    public bool AutoUpdate { get; set; }\r\n\r\n    private int _timeout = 3000;\r\n    public int Timeout\r\n    {\r\n        get { return _timeout; }\r\n        set\r\n        {\r\n            if (_timeout != value)\r\n            {\r\n                _timeout = value;\r\n                BrickPi.SetTimeout(value);\r\n                BrickPi.InitTimeout();\r\n            }\r\n        }\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ Constructor\r\n    \/\/\/ &lt;\/summary&gt;\r\n    public BPi()\r\n    {\r\n        this.Motors = new ObservableCollection&lt;BPiMotor&gt;();\r\n        this.Motors.CollectionChanged += Motors_CollectionChanged;\r\n        this.AutoUpdate = false;\r\n    }\r\n    public void Setup()\r\n    {\r\n        int res = BrickPi.Setup();\r\n        if (res != 0)\r\n        {\r\n            Console.WriteLine(&amp;quot;&amp;quot;);\r\n            throw new Exception(string.Format(&amp;quot;Error: BrickPi.Setup: {0}&amp;quot;, res ));\r\n        }\r\n    }\r\n\r\n    void Motors_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)\r\n    {\r\n        \/\/ var m = sender as BPiMotor;\r\n        switch ( e.Action ) {\r\n            case NotifyCollectionChangedAction.Add:\r\n                foreach (BPiMotor it in e.NewItems)\r\n                {\r\n                    it.PropertyChanged += it_PropertyChanged;\r\n                    BrickPi.SetMotorEnable(it.Port, it.Enabled);\r\n                }\r\n                break;\r\n            case NotifyCollectionChangedAction.Remove:\r\n                foreach (BPiMotor it in e.OldItems)\r\n                {\r\n                    it.PropertyChanged -= it_PropertyChanged;\r\n                    BrickPi.SetMotorEnable(it.Port, false);\r\n                }\r\n                break;\r\n            case NotifyCollectionChangedAction.Reset:\r\n                break;\r\n        }\r\n        int res = BrickPi.SetupSensors();\r\n        if (res != 0)\r\n        {\r\n            Console.WriteLine(&amp;quot;&amp;quot;);\r\n            throw new Exception(string.Format(&amp;quot;Error: BrickPi.SetupSensors: {0}&amp;quot;, res));\r\n        }\r\n    }\r\n\r\n    void it_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\r\n    {\r\n        if (this.AutoUpdate == true) \r\n            Update();\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ call UpdateValues\r\n    \/\/\/ &lt;\/summary&gt;\r\n    public void Update()\r\n    {\r\n        BrickPi.UpdateValues();\r\n        System.Threading.Thread.Sleep(10);\r\n    }\r\n}\r\npublic class BPiMotor : BindableBase\r\n{\r\n    public int Port { get; set; }\r\n\r\n    private bool _enabled = false;\r\n    public bool Enabled\r\n    {\r\n        get { return _enabled; }\r\n        set\r\n        {\r\n            BrickPi.SetMotorEnable(this.Port, value);\r\n            this.SetProperty(ref this._enabled, value);\r\n        }\r\n    }\r\n\r\n    private int _speed = 0;\r\n    public int Speed\r\n    {\r\n        get { return _speed; }\r\n        set\r\n        {\r\n            BrickPi.SetMotorSpeed(this.Port, value);\r\n            this.SetProperty(ref this._speed, value );\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>\n\u5b9f\u969b\u306b\u5236\u5fa1\u3059\u308b\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3067\u3059\u3002\n<\/p>\n<p>\n\u25a0sampleCs.cs\n<\/p>\n<p>\n\u8a2d\u5b9a\u90e8\u5206\u304c\u3061\u3087\u3063\u3068\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u3063\u307d\u3044\u611f\u3058\u3067\u3059\u306d\u3002\u6700\u7d42\u7684\u306b\u306f\u3001Xamarin.iOS\/Android \u3092\u4f7f\u3063\u3066\u3001iPad \u304b\u3089\u5236\u5fa1\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002\u901a\u4fe1\u90e8\u5206\u306f\u3001.NET \u3067\u7c21\u6613HTTP\u30b5\u30fc\u30d0\u30fc\u4f5c\u3063\u3066REST\u3067\u3084\u308a\u53d6\u308a\u3059\u308b\u3068\u3044\u3046\u611f\u3058\u3067\u3059\u3002\n<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nclass Program2\r\n{\r\n    void main()\r\n    {\r\n        int speed = 200;\r\n        var bpi = new BPi();\r\n        \/\/ initialize \r\n        bpi.Setup();\r\n        bpi.AutoUpdate = true;\r\n        var motor1 = new BPiMotor() { Port = BrickPi.PORT_B, Enabled = true };\r\n        var motor2 = new BPiMotor() { Port = BrickPi.PORT_C, Enabled = true };\r\n        bpi.Motors.Add(motor1);\r\n        bpi.Motors.Add(motor2);\r\n        bpi.Timeout = 3000;\r\n\r\n        Console.WriteLine(&quot;start&quot;);\r\n        bool loop = true;\r\n        while (loop)\r\n        {\r\n            var k = Console.ReadKey();\r\n            switch (k.Key)\r\n            {\r\n                case ConsoleKey.W:\r\n                    motor1.Speed = speed;\r\n                    motor2.Speed = speed;\r\n                    break;\r\n                case ConsoleKey.A:\r\n                    motor1.Speed = speed;\r\n                    motor2.Speed = -speed;\r\n                    break;\r\n                case ConsoleKey.D:\r\n                    motor1.Speed = -speed;\r\n                    motor2.Speed = speed;\r\n                    break;\r\n                case ConsoleKey.S:\r\n                    motor1.Speed = -speed;\r\n                    motor2.Speed = -speed;\r\n                    break;\r\n                case ConsoleKey.X:\r\n                    motor1.Speed = 0;\r\n                    motor2.Speed = 0;\r\n                    break;\r\n                case ConsoleKey.Q:\r\n                    loop = false;\r\n                    break;\r\n            }\r\n            \/\/ bpi.Update();\r\n        }\r\n    }\r\n    static void Main(string&#x5B;] args)\r\n    {\r\n        var pro = new Program2();\r\n        pro.main();\r\n    }\r\n}\r\n<\/pre>\n<p>\n\u25a0sampleF2.fs\n<\/p>\n<p>\nF# \u306e\u5834\u5408\u3082 C# \u3068\u307b\u307c\u540c\u3058\u3067\u3059\u304c\u3001\u62ec\u5f27\u304c\u306a\u3044\u5206\u3060\u3051\u82e5\u5e72\u77ed\u304f\u66f8\u3051\u307e\u3059\u3002\u3053\u308c\u3082 HTTP \u7d4c\u7531\u3067\u5236\u5fa1\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b\u4e88\u5b9a\u3067\u3059\u3002\n<\/p>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\nmodule sampleF2\r\nopen System\r\nopen BrickPiNet \r\n\r\nlet speed = 200\r\n\/\/ main\r\nlet bpi = new BPi()\r\nbpi.Setup()\r\nbpi.AutoUpdate &lt;- true\r\nlet motor1 = new BPiMotor( Port = BrickPi.PORT_B, Enabled = true )\r\nlet motor2 = new BPiMotor( Port = BrickPi.PORT_B, Enabled = true )\r\nbpi.Motors.Add(motor1)\r\nbpi.Motors.Add(motor2)\r\nbpi.Timeout &lt;- 3000 \r\nConsole.WriteLine(&amp;quot;start&amp;quot;)\r\nlet mutable loop = true\r\nwhile loop do\r\n    let key = Console.ReadKey()\r\n    match key.Key with\r\n        | ConsoleKey.W -&gt; \r\n            motor1.Speed &lt;- speed \r\n            motor2.Speed &lt;- speed \r\n        | ConsoleKey.A -&gt; \r\n            motor1.Speed &lt;- speed \r\n            motor2.Speed &lt;- -speed \r\n        | ConsoleKey.D -&gt; \r\n            motor1.Speed &lt;- -speed \r\n            motor2.Speed &lt;- speed \r\n        | ConsoleKey.S -&gt; \r\n            motor1.Speed &lt;- -speed \r\n            motor2.Speed &lt;- -speed \r\n        | ConsoleKey.X -&gt; \r\n            motor1.Speed &lt;- 0\r\n            motor2.Speed &lt;- 0\r\n        | ConsoleKey.Q -&gt; \r\n            loop &lt;- false\r\n        | _ -&gt; ()\r\n<\/pre>\n<p>\nF# \u306e\u5834\u5408\u3001\u9762\u767d\u3044\u306e\u306f\u30a4\u30f3\u30bf\u30fc\u30d7\u30ea\u30bf\uff08fsharpi\uff09\u3067\u3082\u52d5\u304f\u3053\u3068\u3067\u3059\u3002Raspberry Pi \u4e0a\u306e\u30bf\u30fc\u30df\u30ca\u30eb\u3067\u3001fsharpi \u3067\u30a4\u30f3\u30bf\u30fc\u30d7\u30ea\u30bf\u3092\u8d77\u52d5\u3057\u305f\u5f8c\u3067\u3001\u4ee5\u4e0b\u3092\u4e00\u6c17\u306b\u901a\u3057\u307e\u3059\u3002\u30b7\u30ea\u30a2\u30eb\u30dd\u30fc\u30c8\u30a2\u30af\u30bb\u30b9\u306e\u305f\u3081 sudo \u3067 root \u6a29\u9650\u3067\u52d5\u304b\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n<\/p>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\n#r &amp;quot;BrickPi.dll&amp;quot; ;;\r\nopen System ;;\r\nopen BrickPiNet ;;\r\nlet speed = 200 ;;\r\n\/\/ main\r\nlet bpi = new BPi() ;;\r\nbpi.Setup() ;;\r\nbpi.AutoUpdate &lt;- true ;;\r\nlet motor1 = new BPiMotor( Port = BrickPi.PORT_B, Enabled = true ) ;;\r\nlet motor2 = new BPiMotor( Port = BrickPi.PORT_B, Enabled = true ) ;;\r\nbpi.Motors.Add(motor1) ;;\r\nbpi.Motors.Add(motor2) ;;\r\nbpi.Timeout &lt;- 3000 ;;\r\n<\/pre>\n<p>\n\u305d\u306e\u5f8c\u3001\n<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nmotor1.Speed &lt;- 200 ;;\r\n<\/pre>\n<p>\n\u306e\u3088\u3046\u306b F# \u306e\u30b3\u30fc\u30c9\u3092\u66f8\u304f\u3068\u305d\u306e\u307e\u307e\u8eca\u8f2a\u304c\u52d5\u304d\u51fa\u3057\u307e\u3059\u3002\u3053\u306e\u3042\u305f\u308a\u306e\u6d41\u308c\u306f F# \u30a4\u30f3\u30bf\u30fc\u30d7\u30ea\u30bf\u306a\u3089\u3067\u306f\u306e\u3068\u3053\u308d\u3067\u3059\u3002\u5236\u5fa1\u30b3\u30de\u30f3\u30c9\u3063\u307d\u3044\u5f62\u3067\u52d5\u304b\u305b\u308b\u306e\u3067\u3001\u30c6\u30b9\u30c8\u3068\u304b\u8a66\u884c\u932f\u8aa4\u306e\u3068\u304d\u306b\u4fbf\u5229\u305d\u3046\u3067\u3059\u3002\n<\/p>\n<p><a href='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2014\/06\/wpid-dworkblogimage20140623_02org.jpg'><img border='0' src='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2014\/06\/wpid-dworkblogimage20140623_02thum.jpg'\/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>F# \u306b\u9650\u3089\u306a\u3044\u306e\u3067\u3059\u304c\u3001\u8a66\u3057\u306b\u30e2\u30fc\u30bf\u30fc\u5236\u5fa1\u306e\u90e8\u5206\u3060\u3051 .NET \u7248\u306e BrickPi \u3092\u4f5c\u308a\u307e\u3057\u305f\u3002 https:\/\/github.com\/moonmile\/BrickPiNet &#8211; BrickPi.h \u3068 &hellip; <a href=\"http:\/\/www.moonmile.net\/blog\/archives\/5953\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[23,59,67],"tags":[],"class_list":["post-5953","post","type-post","status-publish","format-standard","hentry","category-csharp","category-f","category-raspberrypi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/5953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/comments?post=5953"}],"version-history":[{"count":6,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/5953\/revisions"}],"predecessor-version":[{"id":5959,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/5953\/revisions\/5959"}],"wp:attachment":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/media?parent=5953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/categories?post=5953"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/tags?post=5953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}