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 에는 아두이노가 연결 되어 있습니다. 이렇게 연결된 장비에 아래의 코드와 같은 방식으로 데이터를 주고 받을 수 있습니다.
[as3]
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+" – ");
}
}
}
}
}
[/as3]
코드는 워낙 단순하니 따로 설명을 하진 않겠습니다. 주의해야 할 점은 연결해야 할 장비가 작동하는 baud 를 정확히 알아야 합니다. 위의 경우 RFID 리더는 9600, 아두이노는 57600 으로 작동합니다.
이렇게 as3-arduino-connector 를 이용하면 시리얼포트를 이용 한 다양한 장비를 플래시에서 쉽게 제어 및 사용 할 수 있습니다. 이를 통해 더욱 멋진 인터렉티브 컨텐츠가 만들어 지길 기대해 봅니다.


안녕하세요.저도 이걸 사용하 봤었는데 문제가 조금 있어서 질문 좀 드리려 합니다.
“readBytesAsByteArray()”로 ByteArray값을 받아와 읽어드리는데서 안되네요. 다른 readByte(), readBytesAsArray(), readBytesAsString()은 잘 됩니다.
아… 그리고 또한가지 32bit win7에서는 “socketData” 이벤트가 잘 들어 오다가 자꾸 죽네요. 이벤트 자체는 살아 있는데 이벤트발생이 안됩니다.
그래서 지금은 다른분이 개발하신 ANE 쓰곤 있는데 편의성 면에선 이 ANE가 더 좋은거 같은데 버그가 있는거 같네요. 혹시 ByteArray 값 읽어 오는것 해보신적 있으신가요?
안녕하세요. 그런 문제가 있나보군요. 저도 아직 자세하게 사용해 보지는 않아서 그런 문제가 있었는지 몰랐네요. 한번 테스트 해보고 결과 알려드리겠습니다.