Skip to content

as3-arduino-connector 의 활용

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"/>

;

    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 를 이용하면 시리얼포트를 이용 한 다양한 장비를 플래시에서 쉽게 제어 및 사용 할 수 있습니다. 이를 통해 더욱 멋진 인터렉티브 컨텐츠가 만들어 지길 기대해 봅니다.

2 thoughts on “as3-arduino-connector 의 활용”

  1. 안녕하세요.저도 이걸 사용하 봤었는데 문제가 조금 있어서 질문 좀 드리려 합니다.

    “readBytesAsByteArray()”로 ByteArray값을 받아와 읽어드리는데서 안되네요. 다른 readByte(), readBytesAsArray(), readBytesAsString()은 잘 됩니다.
    아… 그리고 또한가지 32bit win7에서는 “socketData” 이벤트가 잘 들어 오다가 자꾸 죽네요. 이벤트 자체는 살아 있는데 이벤트발생이 안됩니다.
    그래서 지금은 다른분이 개발하신 ANE 쓰곤 있는데 편의성 면에선 이 ANE가 더 좋은거 같은데 버그가 있는거 같네요. 혹시 ByteArray 값 읽어 오는것 해보신적 있으신가요?

    1. 안녕하세요. 그런 문제가 있나보군요. 저도 아직 자세하게 사용해 보지는 않아서 그런 문제가 있었는지 몰랐네요. 한번 테스트 해보고 결과 알려드리겠습니다.

Comments are closed.