as3-arduino-connector 는 이름 그대로 플래시에서 아두이노에 바로 접속 할 수 있게 해주는 ANE 입니다. 기존에 플래시에서 아두이노를 사용하기 위해서는 serproxy 라는 프록시서버를 사용 하여야 했습니다. 이는 플래시에서 PC의 COM 포트에 직접 연결 할 방법이 없었기 때문입니다. 하지만 이제 as3-arduino-connector 를 통해 COM 포트에 바로 연결 할 수 있고 아두이노의 데이터도 프록시 서버 없이 바로 사용 할 수 있게 되었습니다.
그런데 여기서 재미있는 점은 as3-arduino-connector 가 단지 아두이노에서만 작동하는 ANE 가 아니라는 점입니다. 네이티브코드를 확인해보면 이 ANE 의 실제 구동방식은 COM 포트를 열고 데이터를 주고 받도록 되어있습니다. 이 말인즉슨 꼭 아두이노가 아니여도 COM 포트를 이용하는 각종 장비를 바로 플래시에서 사용 할 수 있게 된다는 의미입니다.
위의 이미지는 제 PC의 장치관리자 입니다. COM4, COM5 에 각각 USB Serial Port 가 잡혀 있는 것을 확인 할 수 있습니다. COM4 는 현재 RFID 리더 장비가 연결되어 있고 COM5 에는 아두이노가 연결 되어 있습니다. 이렇게 연결된 장비에 아래의 코드와 같은 방식으로 데이터를 주고 받을 수 있습니다.
package { import com.bit101.components.*; import com.bit101.utils.MinimalConfigurator; import com.quetwo.Arduino.ArduinoConnector; import com.quetwo.Arduino.ArduinoConnectorEvent; import flash.display.Sprite; import flash.events.MouseEvent; import net.eriksjodin.arduino.Arduino; public class ArduinoConnectorTester extends Sprite { private var _configure:XML = <comps> <Panel x="10" y="10" width="230" height="120"> <Label text="Arduino Connector" x="10" y="10"/> <PushButton id="connectArduino" label="Connect" x="60" y="40"/> <PushButton id="turnOn" label="Turn ON" x="60" y="80"/> </Panel> <Panel x="260" y="10" width="230" height="120"> <Label text="RFID Connector" x="10" y="10"/> <PushButton id="connectRFID" label="Connect" x="60" y="40"/> </Panel> <TextArea id="output" x="10" y="140" width="480" height="210"/> </comps>; public var connectArduino:PushButton; public var turnOn:PushButton; public var connectRFID:PushButton; public var output:TextArea; private var _config:MinimalConfigurator; private var _isConnectedArduino:Boolean = false; private var _isTurnedOn:Boolean = false; private var _isConnectedRFID:Boolean = false; private var _arduino:Arduino; private var _rfid:ArduinoConnector; public function ArduinoConnectorTester() { Component.initStage(stage); _config = new MinimalConfigurator(this); _config.parseXML(_configure); connectArduino.addEventListener(MouseEvent.CLICK, onClickArduino); turnOn.addEventListener(MouseEvent.CLICK, onClickTurnOn); connectRFID.addEventListener(MouseEvent.CLICK, onClickRFID); } protected function onClickArduino(event:MouseEvent):void { if(_isConnectedArduino){ _arduino.dispose(); _arduino = null; connectArduino.label = "Connect"; log("===> disconnect arduino"); } else { _arduino = new Arduino("COM5", 57600); connectArduino.label = "Disconnect"; log("===> connect arduino"); } _isConnectedArduino = !_isConnectedArduino; } protected function onClickTurnOn(event:MouseEvent):void { if(_isConnectedArduino){ if(_isTurnedOn){ _arduino.writeDigitalPin(11, Arduino.LOW); turnOn.label = "Turn ON"; log("turn off pin11"); } else { _arduino.writeDigitalPin(11, Arduino.HIGH); turnOn.label = "Turn OFF"; log("turn on pin11"); } _isTurnedOn = !_isTurnedOn; } } protected function onClickRFID(event:MouseEvent):void { if(_isConnectedRFID){ _rfid.dispose(); _rfid = null; connectRFID.label = "Connect"; log("===> disconnect rfid"); } else { _rfid = new ArduinoConnector(); _rfid.connect("COM4", 9600); connectRFID.label = "Disconnect"; _rfid.addEventListener("socketData", onDataRFID); log("===> connect rfid"); } _isConnectedRFID = !_isConnectedRFID; } protected function onDataRFID(event:ArduinoConnectorEvent):void { log(_rfid.readBytesAsString()); } private function log($message:*, $prop:*="", $tap:String=""):void { if($message is String || $message is Number){ if($prop==""){ output.text += $message + "n"; } else { output.text += $tap + $prop+" : "+$message + "n"; } } else if ($message is Object){ for(var prop:* in $message){ log($message[prop], prop, $tap+" - "); } } } } }
코드는 워낙 단순하니 따로 설명을 하진 않겠습니다. 주의해야 할 점은 연결해야 할 장비가 작동하는 baud 를 정확히 알아야 합니다. 위의 경우 RFID 리더는 9600, 아두이노는 57600 으로 작동합니다.
이렇게 as3-arduino-connector 를 이용하면 시리얼포트를 이용 한 다양한 장비를 플래시에서 쉽게 제어 및 사용 할 수 있습니다. 이를 통해 더욱 멋진 인터렉티브 컨텐츠가 만들어 지길 기대해 봅니다.
안녕하세요.저도 이걸 사용하 봤었는데 문제가 조금 있어서 질문 좀 드리려 합니다.
“readBytesAsByteArray()”로 ByteArray값을 받아와 읽어드리는데서 안되네요. 다른 readByte(), readBytesAsArray(), readBytesAsString()은 잘 됩니다.
아… 그리고 또한가지 32bit win7에서는 “socketData” 이벤트가 잘 들어 오다가 자꾸 죽네요. 이벤트 자체는 살아 있는데 이벤트발생이 안됩니다.
그래서 지금은 다른분이 개발하신 ANE 쓰곤 있는데 편의성 면에선 이 ANE가 더 좋은거 같은데 버그가 있는거 같네요. 혹시 ByteArray 값 읽어 오는것 해보신적 있으신가요?
안녕하세요. 그런 문제가 있나보군요. 저도 아직 자세하게 사용해 보지는 않아서 그런 문제가 있었는지 몰랐네요. 한번 테스트 해보고 결과 알려드리겠습니다.