2017-06-11 21 views
2

最近、ArduinoとIRリモートを使用してメディアプレーヤーを制御するプロジェクトを作成し、PC上で動作するPowerScriptを使用してArduinoの情報をシリアルポート経由で受信しました。ArduinoはPowerShellスクリプトを使ってPCと通信します

問題は、Arduinoから何らかの入力があった場合にのみ何かをするためにPowerShellをスクリプト化する方法です。今はPowerShellスクリプトの遅延を伴うループがあり、コードが実行されるたびにArduinoからの入力があるかどうかを読み取り、チェックします。しかし、Arduinoが何かを送ったときだけ待つのではなく、PowerShellスクリプトを起動するにはどうすればいいですか?あなたは、.NETライブラリを使用することによって、私はGPIOデバイスとしてのArduinoと通信するためのPowerShellイベントドリブンインターフェースの例を働いているArduinoの上の固体と呼ばれるFirmataプロトコルを使用している場合

$console = $host.UI.RawUI 
$console.BackgroundColor = "darkgreen" 
$console.ForegroundColor = "black" 
$size = $console.WindowSize 
$size.Width = 15 
$size.Height = 2 
$console.WindowSize = $size 
$buffer = $console.BufferSize 
$buffer.Width = 15 
$buffer.Height = 2 
$console.BufferSize = $buffer 

Write-Host "PC Media Remote" 

function IRinputText { 
    Param([string]$serialread,[string]$combo,[string]$key) 
    Process{If ($IRbuffer -like ("*"+$serialread)) {IRbufferReset;$wshell.SendKeys($combo+"{"+$key+"}")}} 
    } 
function IRinputHEX { 
    Param([string]$serialread,[string]$key) 
    Process{If ($IRbuffer -like ("*"+$serialread)) {IRbufferReset;$wshell.SendKeys([char]+$key)}} 
    } 
function IRbufferReset { 
    $Script:IRbuffer="" 
    $Script:IRbuffer= $Script:IRbuffer.PadLeft(15,'0') 
    } 

IRbufferReset 

$port= new-Object System.IO.Ports.SerialPort COM4,9600,None,8,one 
$wshell = New-Object -ComObject wscript.shell; 
$port.open() 
while($true) 
{ 
    $inputvar= $port.ReadExisting() -replace "`n","" -replace "`r","" 
    If(($inputvar -ne "")){ 
     $IRbuffer= If($IRbuffer.Length -ge $inputvar.Length){$IRbuffer.Substring($inputvar.Length) } 
     $IRbuffer= $IRbuffer + $inputvar 
     } 
    If($IRbuffer.Length -gt 15){$IRbuffer= $IRbuffer.Substring($IRbuffer.Length - 15);} 
    IRinputText -serialread "CH+" -combo "^" -key "UP" 
    IRinputText -serialread "CH-" -combo "^" -key "DOWN" 
    IRinputText -serialread "100+" -combo "^" -key "LEFT" 
    IRinputText -serialread "200+" -combo "^" -key "RIGHT" 
    IRinputText -serialread "CH" -key "f" 
    IRinputHEX -serialread "VOL+" -key "0xAF" 
    IRinputHEX -serialread "VOL-" -key "0xAE" 
    IRinputHEX -serialread "PLAY/PAUSE" -key "0xB3" 
    IRinputHEX -serialread "PREV" -key "0xB1" 
    IRinputHEX -serialread "NEXT" -key "0xB0" 
    IRinputHEX -serialread "EQ" -key "0xAD" 
    If ($IRbuffer -like ("*1532")) {IRbufferReset;Stop-Computer} 

    Start-Sleep -m 20 
} 
+1

あなたは番目によって公開されDataReceivedイベントハンドラにPowerShellをsubscripeすることができますe SerialPortクラス。 (私のArduinosでそれをやっているのです) – bluuf

+0

@bluufもう少し詳しく説明できますか?私はPowerShellの初心者です。ありがとう! – raulx222

答えて

1

は、ここに私のPowerShellスクリプトです。 Arduinoの(https://github.com/SolidSoils/Arduino

add-type -path '.\Documents\WindowsPowerShell\Solid.Arduino.dll' 
$connection = New-Object Solid.Arduino.SerialConnection("COM4",[Solid.Arduino.SerialBaudRate]::Bps_57600) 
$session = New-Object Solid.Arduino.ArduinoSession($connection, 2000) 
$session.SetDigitalPinMode(4,[Solid.Arduino.Firmata.PinMode]::DigitalInput) 
# 
# Define the function that is called when a digitial pin event happens 
# 
function inputevent($event){ 
#Write-Host "Something happened on port $($event.value.port) Type $($event.value.pins)" 
if($event.value.pins -band 4) #using binary AND incase multiple inputs are activated 
{ 
    # put code here to switch ATEM Aux or VideoHub routing 
    Write-host "Cam 1 preview selected" 
} 
} 
# 
# set up the event to montor digital pin state change 
# 
$session.SetDigitalReportMode(0,$true) #enable events for pins on port 0 
Unregister-Event eventBitChange -ErrorAction SilentlyContinue #incase we are re-running the script 
$ArduinoEvent = Register-ObjectEvent -InputObject $session -EventName DigitalStateReceived -SourceIdentifier eventBitChange -Action {inputevent($eventArgs)} 

https://ianmorrish.wordpress.com/category/v-ise/arduino/

+0

リンク先でも関連するコードを投稿してください。コードを持たないアンサーは、低品質であるため削除される傾向があります。 – Graham

関連する問題