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 에는 아두이노가 연결 되어 있습니다. 이렇게 연결된 장비에 아래의 코드와 같은 방식으로 데이터를 주고 받을 수 있습니다.

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

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

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

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.