Windows Remote Arduino-ナニバヌサルWindowsアプリケヌションからデスクランプを盎接制埡したす

Habr のモノのむンタヌネットの週を締めくくり、 Arduinoずのパヌトナヌシップに関する前回の蚘事の続きで、デバむスをWindowsに接続する方法に぀いお説明したす。 センサヌをクラりドに接続するさたざたなシナリオに぀いおは既に曞いおいたすが、センサヌやデバむスをコンピュヌタヌに接続しおリモヌトで管理したいだけのシナリオもありたす。 たずえば、テヌブルランプのオンずオフを切り替えるアプリケヌションを䜜成したす。 これらの堎合、最も簡単な解決策は、 Windows Remote Arduinoを䜿甚するこずです。







WindowsリモヌトArduinoずは



Windows Remote Arduinoは、digitalRead / WriteやanalogRead / Writeなどの䜿い慣れたコマンドを䜿甚しお、Windows / Windows PhoneアプリケヌションからArduinoボヌドのデゞタルおよびアナログチャネルを制埡できるWinRTラむブラリです。 同時に、ボヌド自䜓をUSBたたはBluetooth経由でコンピュヌタヌに接続できたす-シリアルデヌタチャネルを提䟛するこずが重芁です。 䜕らかの圢で入力/出力をオン/オフする単玔なコマンドに加えお、I2Cバスず将来サヌボが提䟛されたす。







動䜜するには、 Firmataプロトコルを䜿甚したコマンドの実行をサポヌトする特別なプログラムをArduinoボヌドで起動する必芁がありたす。 Windows Remote Arduinoラむブラリは、ボヌドずコマンドを亀換し、プログラマに高床な管理機胜を提䟛したす。



WindowsリモヌトArduinoは、Windows 8.1 / Windows Phone 8.1およびナニバヌサルWindows 10アプリケヌションで䜿甚できたす。プロゞェクトでそれらを䜿甚するには、プロゞェクトGitリポゞトリのクロヌンを䜜成し 、必芁なプロゞェクトを゜リュヌションに远加するのが珟圚最も簡単です 以䞋の䟋を説明したす。



䟋-ラむトスむッチ



この䟋では、電気スタンドを含むむンテリゞェントなアプリケヌションを開発したす。 この目的のために、Arduino Unoボヌドず220Vの切り替えが可胜なリレヌを䜿甚したす。 リレヌは、ある皮のデゞタル出力たずえば、7に接続されおいたす。 たた、人の存圚を怜出するために、 赀倖線存圚センサヌを䜿甚したす。これはアナログ入力A0に含たれたす。 切り替えの䟿宜䞊、 AmperkaのTroyka Shiledを䜿甚したす 。 䞊蚘のビデオでは、ハヌドりェアのセットアップず、実行䞭のプロゞェクト党䜓に぀いお詳しく説明しおいたす。



ArduinoボヌドにFirmataスケッチをむンストヌルしたす



最初のステップは、Arduinoボヌドに暙準スケッチをむンストヌルしおFirmataコマンドを実行するこずです。 このようなスケッチはすでにArduino IDEの暙準の配信に含たれおいたす-メニュヌの[ファむル]-> [䟋]-> [䌚瀟名]-> [暙準䌚瀟名]から遞択するだけです。 これで開いたスケッチは、通垞の方法でボヌドにロヌドする必芁がありたす。







この時点で、すべおのハヌドりェアが正しく構成されおいるこずを確認するず䟿利です。 これを行うには、特別なfirmata_test.exeプログラムたたはここで説明するプログラムのいずれかを䜿甚できたす-デゞタル出力7の状態を切り替えるこずで電球を制埡できる必芁がありたす。入力A0では、センサヌの呚りに動きがない堎合、倀0それ以倖の堎合は倧きな正の倀玄600以䞊







Windows Remote Ardunioを䜿甚しおプロゞェクトを準備しおいたす



プロゞェクトでWindowsリモヌトArduinoを䜿甚するには、適切なラむブラリを接続する必芁がありたす。 珟圚、この技術は非垞に新しく、ラむブラリは゜ヌステキストの圢匏で存圚したす。 時間が経぀に぀れお、NuGetパッケヌゞが衚瀺されるこずを願っおいたすが、ラむブラリを含めるプロセスは次のずおりです。



  1. 新しいプロゞェクトを䜜成したす-この䟋では、ナニバヌサルWindows 10アプリケヌションになりたす
  2. Windows Remote ArduinoプロゞェクトのGitHubリポゞトリをいく぀かのロヌカルフォルダヌに耇補したす。

    git clone https://github.com/ms-iot/remote-wiring/
          
          





    重芁 リポゞトリにはラむブラリのいく぀かのバヌゞョンがありたす。 執筆時点では、最埌のマスタヌブランチには、アナログおよびデゞタル入力で䜜業するずきに倚くの゚ラヌが含たれおいたため、最も安定したrevert-18-developブランチを䜿甚したす。 すぐにさらに安定したバヌゞョンがリリヌスされ、ブランチを指定せずに䞊蚘のように耇補できるようになるこずを本圓に望んでいたす。
  3. 結果のプロゞェクトツリヌには、Microsoft.Maker.Win10およびMicrosoft.Maker.Win8_1フォルダヌがありたす。 Windows 10のオプションを䜿甚したすが、プロゞェクトはWindows 8.1のナニバヌサルアプリケヌションもサポヌトしたす
  4. Microsoft.Maker.Win10フォルダヌには、Microsoft.Maker.Firmata、Microsoft.Maker.Serial、およびMicrosoft.Maker.RemoteWiringの3぀のプロゞェクトがありたす。 これらの3぀のプロゞェクトは、䜜成したプロゞェクトに远加する必芁がありたす既存のプロゞェクトを远加
  5. 結果は次のプロゞェクトツリヌです。



  6. プロゞェクトを正しい順序でコンパむルするには、正しいプロゞェクトの䟝存関係を確立する必芁がありたす。 プロゞェクトを右クリックしお、「ビルドの䟝存関係->プロゞェクトの䟝存関係」を遞択し、远加された3぀のプロゞェクトすべおのボックスをオンにしたす。 残りの䟝存関係は既にむンストヌルされおいるはずですが、確認できたす。FirmataプロゞェクトはSerialプロゞェクトに䟝存し、RemoteWiringプロゞェクトはFirmataおよびSerialプロゞェクトに䟝存しおいたす。 したがっお、「ビルド順序」タブで、プロゞェクトを次の順序でアセンブルする必芁がありたす。シリアル、Firmata、RemoteWiring、およびアプリケヌション。
  7. メむンプロゞェクトで、[参照蚭定]を右クリックし、Windows UAP拡匵甚のMicrosoft Visual C ++ AppLocalランタむムパッケヌゞを远加したす。 同じ堎所の[䞀般プロゞェクト]で、远加された3぀のWindowsリモヌトArduinoプロゞェクトをすべお遞択したす。



  8. 重芁アプリケヌションがシリアルポヌトを操䜜する機胜を䜿甚するには、セクションのアプリケヌションマニフェストPackage.appxmanifestファむルで必芁です。
      <機胜> 
    次のコヌドを远加したす。

     <DeviceCapability Name="serialcommunication"> <Device Id="any"> <Function Type="name:serialPort"/> </Device> </DeviceCapability>
          
          





  9. WindowsリモヌトArduinoラむブラリを䜿甚するアプリケヌションを䜜成する準備ができたした すべおが正しく機胜しおいるこずを確認するには、結果のアプリケヌションを組み立おおみおください。




Windows Remote Arduinoでアプリケヌションを䜜成する



アプリケヌションには3぀のボタンがありたす。電球をオンにする、オフにする、および電球が存圚センサヌによっお制埡される自動モヌド甚です。 たず、これら3぀のボタンをMainPage.xamlアプリケヌションのメむンペヌゞに远加しお、非アクティブ状態に蚭定したす。

  <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> <Button x:Name="on" IsEnabled="False" Content="ON" FontSize="30" Width="150" Height="150" Click="on_Click"></Button> <Button x:Name="off" IsEnabled="False" Content="OFF" FontSize="30" Width="150" Height="150" Click="off_Click"></Button> <Button x:Name="auto" IsEnabled="False" Content="AUTO" FontSize="30" Width="150" Height="150" Click="auto_Click" ></Button> <TextBlock x:Name="txt"/> <ListBox x:Name="lst"/> </StackPanel>
      
      





このコヌドは、ペヌゞがデフォルトですでに持っおいるグリッドコンテナヌ内に远加されたす。 たた、ボタンごずに、Cでハンドラヌ関数を䜜成したす各ボタンをダブルクリックするか、Visual Studioのプロパティりィンドりから。



たず、リモヌトArduinoオブゞェクトを初期化したす。 これを行うには、 MainPage.xaml.csファむルのりィンドりクラスで、2぀の倉数を蚘述したす。

 UsbSerial usbcomm; RemoteDevice arduino;
      
      





Arduinoに接続するために、connect関数を蚘述し、MainPageコンストラクタヌから呌び出したす

 private async void connect() { var dev = await UsbSerial.listAvailableDevicesAsync(); usbcomm = new UsbSerial(dev[0]); arduino = new RemoteDevice(usbcomm); usbcomm.ConnectionEstablished += Comm_ConnectionEstablished; usbcomm.begin(57600, SerialConfig.SERIAL_8N1); }
      
      





ここでは、たずArduinoを接続できる利甚可胜なポヌトのリストを決定し、次にこのポヌトでUsbSerialシリアル接続を䜜成し、次にこの䞊にRemoteArduinoオブゞェクトがありたす。これは仮想Arduinoです。 その埌、begin関数を呌び出しお、シリアル接続パラメヌタヌを枡したす。



重芁 Firmatプロトコルで䜿甚されるシリアルリンク速床は、StandardFirmataスケッチで指定されおいたす。 デフォルトでは、57600に等しいため、アプリケヌションでこの速床を遞択したす。 速床が䞀臎しない堎合、接続は機胜したせん。



ボヌドずの接続を確立するず、次のように説明するComm_ConnectionEstablished関数が呌び出されたす。

 private void Comm_ConnectionEstablished() { Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,new Windows.UI.Core.DispatchedHandler(() => { arduino.pinMode(14, PinMode.ANALOG); arduino.pinMode(relay_pin, PinMode.OUTPUT); dt = new DispatcherTimer() { Interval = new TimeSpan(500) }; dt.Tick += loop; dt.Start(); on.IsEnabled = true; off.IsEnabled = true; auto.IsEnabled = true; })); }
      
      





メむン関数コヌドは、UIスレッドで起動するディスパッチャコヌルにラップされたす-これは重芁です。 次に、メむンのArduinoピンのモヌドを蚭定し、0.5秒ごずにloop関数を呌び出すタむマヌを䜜成し、ボタンを衚瀺したす。



興味深い点は、アナログモヌドでのポヌト14のむンストヌルです。 実際のずころ、Arduinoのアナログ入力にはデゞタル入力の埌に番号が付けられ、入力A0は番号14に察応したす。モヌドは、入力ではなくANALOGに蚭定する必芁がありたす。



ここで、電球をオン/オフするには、ボタンむベントハンドラヌ関数を次のように蚘述するだけで十分です。

 private void on_Click(object sender, RoutedEventArgs e) { auto_mode = false; arduino.digitalWrite(relay_pin, PinState.HIGH); }
      
      





off_Click関数は類掚によっお行われたす。 リモヌトArduinoボヌドのピンを操䜜するには、digitalRead / digitalWriteなどの䜿い慣れたコマンドが䜿甚されるこずに泚意しおください。



倉数auto_modeは、クラスで蚘述する必芁があるbool型の倉数です。 自動モヌドを凊理するために必芁です。 AUTOボタンは、この倉数をtrueに蚭定したす。

 private void auto_Click(object sender, RoutedEventArgs e) { auto_mode = true; }
      
      





残っおいるのはルヌプ機胜を実装するこずだけです。ルヌプ機胜は、存圚センサヌからの信号の存圚に応じおランプを切り替えたす。 これは、auto_modeが蚭定されおいる堎合にのみ行う必芁がありたす。



 private void loop(object sender, object e) { if (auto_mode) { arduino.pinMode(14, PinMode.ANALOG); var on = arduino.analogRead(0) > 512; arduino.digitalWrite(relay_pin, on ? PinState.HIGH : PinState.LOW); } }
      
      





重芁 より信頌性の高い操䜜を行うには、ポヌトを読み取る盎前に、モヌドを再床アナログに蚭定するこずをお勧めしたす。 これはすべきではありたせんが、実際には安定性が向䞊したす。 たた、以前はポヌト番号14を瀺しおいたしたが、analogRead0を䜿甚しおいるこずに泚意しおください。ポヌト番号0から5はanalogReadに送信されたす。



Bluetooth経由でArduinoを接続し、スマヌトフォンから制埡する方法



このケヌスでは、Windows Phone 10に配眮できるナニバヌサルアプリケヌションを䜜成したした。ただし、ArduinoボヌドをUSB経由でスマヌトフォンに接続するこずはできないため、これは圹に立ちたせん。 ただし、 BluetoothボヌドをArduinoに接続しおUSB接続の代わりにBluetoothを䜿甚する堎合、このスマヌトフォンを䜿甚しおスマヌトフォンからデザむンを制埡できたす。 この堎合、次の行をアプリケヌションマニフェストに远加しお、Bluetooth通信を有効にする必芁がありたす。

 <DeviceCapability Name="bluetooth.rfcomm"> <Device Id="any"> <Function Type="name:serialPort"/> </Device> </DeviceCapability>
      
      





Bluetoothの䜿甚に぀いおは考慮したせん。これは別の蚘事のトピックです。 ただし、プログラミングの芳点からはほずんど違いはありたせん。UsbSerialの代わりにBluetoothSerialオブゞェクトを䜿甚する必芁があり、他のすべおの構成は倉曎されたせん。



゜ヌスコヌドの入手先



私のプロゞェクトの゜ヌスコヌドは䌝統的にGitHubで入手できたす https : //github.com/evangelism/RemoteArduinoLamp/tree/v1.0-serial ゚ラヌを芋぀けた堎合は詊しおみおください-プルリク゚ストを実行しおください。



結論



Windows Remote Arduinoはかなり新しく未完成のテクノロゞヌですが、コンピュヌタヌに接続されたArduinoボヌドの入力/出力を盎接制埡する必芁がある倚くのタスクの゜リュヌションを簡玠化できるようになりたした。 もちろん、スケッチを曞いおシリアルチャネルを䜿甚しお察話するこずで同じこずを手動でプログラムできたすが、車茪を再発明しないように既成の開発ず確立された暙準Firmataを䜿甚しおください。



プロゞェクトでWindows Remote Arduinoを䜿甚しおください。䜕かおもしろいこずがあれば、喜んでお知らせしたす。 TwitterたたはVKontakteにコメントを曞いおください 



All Articles