{"id":7193,"date":"2015-05-20T16:09:39","date_gmt":"2015-05-20T07:09:39","guid":{"rendered":"http:\/\/www.moonmile.net\/blog\/?p=7193"},"modified":"2015-05-20T19:10:57","modified_gmt":"2015-05-20T10:10:57","slug":"firmata-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6-xamarin-android-%e3%81%8b%e3%82%89-arduino-%e3%81%ab%e6%8e%a5%e7%b6%9a%ef%bc%88f%e7%89%88%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.moonmile.net\/blog\/archives\/7193","title":{"rendered":"Firmata \u3092\u4f7f\u3063\u3066 Xamarin.Android \u304b\u3089 Arduino \u306b\u63a5\u7d9a\uff08F#\u7248\uff09"},"content":{"rendered":"<p>\nFirmata \u3092\u4f7f\u3063\u3066 Xamarin.Android \u304b\u3089 Arduino \u306b\u63a5\u7d9a\u3059\u308b | Moonmile Solutions Blog<br \/>\n<a href=\"http:\/\/www.moonmile.net\/blog\/archives\/7185\">http:\/\/www.moonmile.net\/blog\/archives\/7185<\/a>\n<\/p>\n<p>\n\u3053\u308c\u306e F# \u7248\u3092\u4f5c\u308a\u307e\u3059\u3002Xamarin.Android \u306f\u4e3b\u306b C# \u3067\u4f5c\u308b\u3053\u3068\u304c\u591a\u3044\u3067\u3057\u3087\u3046\u304c\u3001\u30aa\u30fc\u30eb F# \u3067\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002Visual Studio 2013 \u3067\u306f\u3001Visual F# \u306e Android \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u304c\u3042\u308b\u306e\u3067\u3001\u305d\u306e\u307e\u307e\u4f7f\u3048\u307e\u3059\u3002\n<\/p>\n<p><a href='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2015\/05\/wpid-dworkblogimage20150520_06org.jpg'><img border='0' src='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2015\/05\/wpid-dworkblogimage20150520_06thum.jpg'\/><\/a><\/p>\n<p><h2>Firmata.NET \u3092 F# \u7248\u306b\u66f8\u304d\u76f4\u3059<\/h2>\n<\/p>\n<p>\n\u5c11\u3057\u66f8\u304d\u65b9\u304c\u9055\u3044\u307e\u3059\u304c\u3001\u3056\u3063\u3068\u66f8\u304d\u4e0b\u3057\u305f\u306e\u304c\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3067\u3059\u3002\n<\/p>\n<pre class=\"brush: fsharp; title: ; notranslate\" title=\"\">\r\nnamespace Firmata.NET\r\n\r\nopen System\r\nopen Android.App\r\nopen Android.Content\r\nopen Android.Runtime\r\nopen Android.Views\r\nopen Android.Widget\r\nopen Android.OS\r\n\r\nopen Android.Bluetooth\r\nopen System.Linq\r\nopen Java.Util\r\n\r\nmodule ARDUINO = \r\n    let INPUT = 0\r\n    let OUTPUT = 1\r\n    let LOW = 0\r\n    let HIGH = 1\r\n    \r\n\r\ntype Arduino() as this =\r\n    let INPUT = 0\r\n    let OUTPUT = 1\r\n    let LOW = 0\r\n    let HIGH = 1\r\n\r\n    let DIGITAL_MESSAGE = 0x90uy    \/\/ send data for a digital port\r\n    let ANALOG_MESSAGE = 0xE0uy     \/\/ send data for an analog pin (or PWM)\r\n    let REPORT_ANALOG = 0xC0uy      \/\/ enable analog input by pin #\r\n    let REPORT_DIGITAL = 0xD0uy     \/\/ enable digital input by port\r\n    let SET_PIN_MODE = 0xF4uy       \/\/ set a pin to INPUT\/OUTPUT\/PWM\/etc\r\n    let REPORT_VERSION = 0xF9uy     \/\/ report firmware version\r\n    let SYSTEM_RESET = 0xFFuy       \/\/ reset from MIDI\r\n    let START_SYSEX = 0xF0uy        \/\/ start a MIDI SysEx message\r\n    let END_SYSEX = 0xF7uy          \/\/ end a MIDI SysEx message\r\n\r\n\r\n    let mutable _socket:BluetoothSocket = null\r\n    let mutable autoStart = false\r\n    let mutable delay = 0\r\n\r\n    let mutable digitalOutputData = Array.zeroCreate(16)\r\n    let mutable digitalInputData = Array.zeroCreate(16)\r\n    let mutable analogInputData = Array.zeroCreate(16)\r\n\r\n    do\r\n        if autoStart = true then\r\n            delay &lt;- 0 \r\n            this.Connect()\r\n            this.Open()\r\n\r\n    \/\/\/ Connect Bluetooth on Arduino.\r\n    member this.Connect() =\r\n        let adapter = BluetoothAdapter.DefaultAdapter\r\n        if adapter = null then\r\n            raise (Exception(&amp;quot;No Bluetooth adapter found.&amp;quot;))\r\n        if adapter.IsEnabled = false then\r\n            raise (Exception(&amp;quot;Bluetooth adapter is not enabled.&amp;quot;))\r\n        let device = adapter.BondedDevices.FirstOrDefault( fun x -&gt; x.Name = &amp;quot;HC-06&amp;quot; )\r\n        if device = null then\r\n            raise (Exception(&amp;quot;Named device not found.&amp;quot;))\r\n        _socket &lt;- device.CreateRfcommSocketToServiceRecord(UUID.FromString(&amp;quot;00001101-0000-1000-8000-00805f9b34fb&amp;quot;))\r\n        _socket.Connect()\r\n\r\n    member this.Open() =\r\n        \/\/ let mutable command = Array.create&lt;byte&gt;(2)\r\n        for i=0 to 5 do\r\n            let command = &#x5B;|\r\n                REPORT_ANALOG ||| byte(i)\r\n                1uy\r\n            |]\r\n            _socket.OutputStream.Write( command, 0, command.Length )\r\n        for i=0 to 1 do\r\n            let command = &#x5B;|\r\n                REPORT_DIGITAL ||| byte(i)\r\n                1uy\r\n            |]\r\n            _socket.OutputStream.Write( command, 0, command.Length )\r\n\r\n    member this.Close() = \r\n        _socket.Close()\r\n        _socket &lt;- null\r\n\r\n    member this.digitalRead(pin:int):int =\r\n        (digitalInputData.&#x5B;pin &gt;&gt;&gt; 3] &gt;&gt;&gt; (pin &amp;&amp;&amp; 0x07)) &amp;&amp;&amp; 0x01\r\n    member this.analogRead(pin:int):int =\r\n        analogInputData.&#x5B;pin]\r\n\r\n    member this.pinMode(pin,mode) =\r\n        let message = &#x5B;|\r\n            SET_PIN_MODE\r\n            byte(pin)\r\n            byte(mode)\r\n        |]\r\n        _socket.OutputStream.Write( message, 0, message.Length )\r\n\r\n    member this.digitalWrite(pin,value) =\r\n        let portNumber = (pin &gt;&gt;&gt; 3) &amp;&amp;&amp; 0xFF\r\n        digitalOutputData.&#x5B;portNumber] &lt;-\r\n            if value = 0 then\r\n                digitalOutputData.&#x5B;portNumber] &amp;&amp;&amp; ~~~(1 &lt;&lt;&lt; (pin &amp;&amp;&amp; 0x07))\r\n            else \r\n                digitalOutputData.&#x5B;portNumber] ||| (1 &lt;&lt;&lt; (pin &amp;&amp;&amp; 0x07)) \r\n        let message = &#x5B;|\r\n            DIGITAL_MESSAGE ||| byte(portNumber) \r\n            byte(digitalOutputData.&#x5B;portNumber] &amp;&amp;&amp; 0x7F)\r\n            byte(digitalOutputData.&#x5B;portNumber] &gt;&gt;&gt; 7)\r\n        |]\r\n        _socket.OutputStream.Write(message, 0, message.Length);\r\n            \r\n    member this.analogWrite(pin,value) = \r\n        let message = &#x5B;|\r\n            ANALOG_MESSAGE ||| (byte(pin) &amp;&amp;&amp; 0x0Fuy)\r\n            byte(value &amp;&amp;&amp; 0x7F)\r\n            byte(value &gt;&gt;&gt; 7)\r\n        |]\r\n        _socket.OutputStream.Write(message, 0, message.Length);\r\n\r\n    member this.setDigitalInputs( portNumber, portData ) =\r\n        digitalInputData.&#x5B;portNumber] &lt;- portData\r\n\r\n    member this.setAnalogInput( pin, value ) =\r\n        analogInputData.&#x5B;pin] &lt;- value\r\n<\/pre>\n<p>\n\u5b9a\u6570\u304c module \u3092\u4f7f\u3063\u3066\u3044\u308b\u306e\u306f\u611b\u5b0c\u3068\u3057\u3066\u3001\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u914d\u5217\u3092\u4f5c\u308b\u3068\u3053\u308d\u306f\u3001\u76f4\u63a5\u4f5c\u308c\u308b\u306e\u3067\u82e5\u5e72\u697d\u3067\u3059\u306d\u3002\u30d3\u30c3\u30c8\u6f14\u7b97\u5b50\u304c\u300c&amp;&amp;&amp;\u300d\u3084\u300c|||\u300d\u3092\u4f7f\u308f\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u306e\u3067\u3001\u6587\u5b57\u6570\u7684\u306b\u5197\u9577\u306a\u306e\u306f\u6b8b\u5ff5\u306a\u611f\u3058\u304c\u3057\u307e\u3059\u304c\u3001\u307e\u3042\u3001\u3053\u308c\u306f\u3053\u308c\u3067\u826f\u3057\u3068\u3044\u3046\u3053\u3068\u3067\u3002<br \/>\nint \u304b\u3089 byte \u3078\u306e\u30ad\u30e3\u30b9\u30c8\u304c\u983b\u767a\u3059\u308b\u306e\u306f\u3001F# \u306e\u5bbf\u547d\u3067\u3059\u3002\u578b\u3092\u5408\u308f\u305b\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u306e\u3067\u3001\u30a2\u30c3\u30d7\u30ad\u30e3\u30b9\u30c8\u3060\u3051\u3067\u306a\u304f\u30c0\u30a6\u30f3\u30ad\u30e3\u30b9\u30c8\u306b\u5bfe\u3057\u3066\u3082\u3001\u660e\u793a\u7684\u306a\u578b\u306e\u30ad\u30e3\u30b9\u30c8\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002\u3053\u306e\u3042\u305f\u308a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u3092\u3057\u3066\u3044\u308b\u3068\u3061\u3087\u3063\u3068\u5197\u9577\u306a\u611f\u3058\u306b\u306a\u308a\u307e\u3059\u3002\n<\/p>\n<p><h2>\u30de\u30cb\u30d5\u30a7\u30b9\u30c8\u3092\u8a2d\u5b9a\u3059\u308b<\/h2>\n<\/p>\n<p>\nBluetooth \u3092\u6271\u3046\u305f\u3081\u306e\u3001\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306e\u8a2d\u5b9a\u306f C# \u3068\u540c\u3058\u3067\u3059\u3002\n<\/p>\n<p><a href='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2015\/05\/wpid-dworkblogimage20150520_02org1.jpg'><img border='0' src='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2015\/05\/wpid-dworkblogimage20150520_02thum1.jpg'\/><\/a><\/p>\n<p><h2>MainActivity<\/h2>\n<\/p>\n<p>\n\u3056\u3063\u3068\u66f8\u3044\u305f\u306e\u3067\u3001\u30dc\u30bf\u30f3\u306e\u30af\u30ea\u30c3\u30af\u30a4\u30d9\u30f3\u30c8\u306e\u3068\u3053\u308d\u304c\u96d1\u3067\u306f\u3042\u308a\u307e\u3059\u304c\u3001C# \u3088\u308a\u3082\u77ed\u304f\u304b\u3051\u307e\u3059\u3002\u30d5\u30a3\u30eb\u30bf\u3092\u591a\u7528\u3059\u308b\u5834\u5408\u3084\u30d5\u30ed\u30fc\u30c1\u30e3\u30fc\u30c8\u7684\u306b\u72b6\u614b\u9077\u79fb\u3059\u308b\u5834\u5408\u306f\u3001\u95a2\u6570\u578b\u8a00\u8a9e F# \u3092\u4f7f\u3046\u3068\u3059\u3093\u306a\u308a\u3068\u66f8\u3051\u308b\u306f\u305a\u306a\u3093\u3067\u3059\u3051\u3069\u306d\u3002\u3053\u306e\u3042\u305f\u308a\u306f\u3001Arduino \u6226\u8eca\u306b\u8ddd\u96e2\u30bb\u30f3\u30b5\u30fc\u3092\u4ed8\u3051\u3066\u81ea\u5f8b\u5316\u3057\u305f\u3068\u304d\u306b\u8a66\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\n<\/p>\n<pre class=\"brush: vb; title: ; notranslate\" title=\"\">\r\ntype MainActivity () =\r\n    inherit Activity ()\r\n\r\n    let mutable buttonConnect:Button = null\r\n    let mutable buttonOpen:Button = null\r\n    let mutable buttonLedOn:Button = null\r\n    let mutable buttonLedOff:Button = null\r\n    let mutable arduino:Arduino = new Arduino()\r\n\r\n    override this.OnCreate (bundle) =\r\n\r\n        base.OnCreate (bundle)\r\n\r\n        \/\/ Set our view from the &amp;quot;main&amp;quot; layout resource\r\n        this.SetContentView (Resource_Layout.Main)\r\n\r\n        \/\/ Get our button from the layout resource, and attach an event to it\r\n        buttonConnect &lt;- this.FindViewById&lt;Button&gt;(Resource_Id.buttonConnect)\r\n        buttonOpen &lt;- this.FindViewById&lt;Button&gt;(Resource_Id.buttonOpen)\r\n        buttonLedOn &lt;- this.FindViewById&lt;Button&gt;(Resource_Id.buttonLEDon)\r\n        buttonLedOff &lt;- this.FindViewById&lt;Button&gt;(Resource_Id.buttonLEDoff)\r\n\r\n\r\n        buttonConnect.Click.Add( fun args -&gt; \r\n            arduino.Connect();\r\n            buttonConnect.Text &lt;- &amp;quot;connected.&amp;quot;;\r\n        )\r\n        buttonOpen.Click.Add( fun args -&gt; \r\n            arduino.Open();\r\n            buttonConnect.Text &lt;- &amp;quot;Firmata opend.&amp;quot;;\r\n            arduino.pinMode(5, ARDUINO.OUTPUT );\r\n            arduino.digitalWrite(5, ARDUINO.LOW);\r\n        )\r\n        buttonLedOn.Click.Add( fun e -&gt; this.OnClickLedOn(buttonLedOn,e) )\r\n        buttonLedOff.Click.Add( fun e -&gt; this.OnClickLedOff(buttonLedOff,e) )\r\n\r\n    member this.OnClickLedOn(sender,e) =\r\n        arduino.digitalWrite(5, ARDUINO.HIGH)\r\n    member this.OnClickLedOff(sender,e) =\r\n        arduino.digitalWrite(5, ARDUINO.LOW)\r\n<\/pre>\n<p><h2>\u52d5\u304b\u3059<\/h2>\n<\/p>\n<p>\n\u898b\u305f\u76ee\u306f C# \u7248\u3068\u5909\u308f\u308a\u307e\u305b\u3093\u304c\u3001F# \u306e\u30a2\u30d7\u30ea\u304c\u52d5\u3044\u3066\u3044\u307e\u3059\u3002\n<\/p>\n<p><a href='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2015\/05\/wpid-dworkblogimage20150520_07org.jpg'><img border='0' src='http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2015\/05\/wpid-dworkblogimage20150520_07thum.jpg'\/><\/a><\/p>\n<p>\nWindows \u306b\u4e57\u305b\u63db\u3048\u3066\uff08\u5b9f\u306f\u3001\u30b9\u30c8\u30a2\u30a2\u30d7\u30ea\u7248\u306e Firmata \u30e9\u30a4\u30d6\u30e9\u30ea\u3082\u4f5c\u3063\u3066\u3042\u308b\uff09\u3001F# \u304b\u3089\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u7684\u306b\u4f7f\u3048\u308b\u3068\u3001Ruby \u3084 Node.js \u306e\u3088\u3046\u306b\u30b9\u30af\u30ea\u30d7\u30c8\u8a00\u8a9e\u306e\u3088\u3046\u306b\u4f7f\u3046\u3053\u3068\u304c\u53ef\u80fd\u3067\u3059\u3002\u3053\u306e\u3042\u305f\u308a\u3001\u5148\u306e firmata \u306e\u30b5\u30a4\u30c8\u306b Haskell \u304c\u3042\u308b\u306e\u3067\u3001\u6bd4\u8f03\u3059\u308b\u306e\u3082\u9762\u767d\u3044\u304b\u306a\u3068\uff08\u79c1\u306f Haskell \u306f\u5168\u7136\u30c0\u30e1\u306a\u3093\u3067\u3059\u3051\u3069\uff09\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Firmata \u3092\u4f7f\u3063\u3066 Xamarin.Android \u304b\u3089 Arduino \u306b\u63a5\u7d9a\u3059\u308b | Moonmile Solutions Blog http:\/\/www.moonmile.net\/blog\/archives\/ &hellip; <a href=\"https:\/\/www.moonmile.net\/blog\/archives\/7193\">\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":[64,71,59,62],"tags":[],"class_list":["post-7193","post","type-post","status-publish","format-standard","hentry","category-android","category-arduino","category-f","category-xamarin"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/7193","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/comments?post=7193"}],"version-history":[{"count":2,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/7193\/revisions"}],"predecessor-version":[{"id":7195,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/7193\/revisions\/7195"}],"wp:attachment":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/media?parent=7193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/categories?post=7193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/tags?post=7193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}