Warning: opendir(/var/www/html/wp-content/mu-plugins): Failed to open directory: Permission denied in /var/www/html/wp-includes/load.php on line 981
그런데 여기서 재미있는 점은 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 를 이용하면 시리얼포트를 이용 한 다양한 장비를 플래시에서 쉽게 제어 및 사용 할 수 있습니다. 이를 통해 더욱 멋진 인터렉티브 컨텐츠가 만들어 지길 기대해 봅니다.
]]>아두이노를 사용하기 위해서는 스케치라는 아두이노용 언어를 아두이노에 올려야 하는데 Fio 의 경우 유선으로 하기 위해서는 USB 시리얼 변환기가 필요합니다. 그런데 제가 한국에서 이 변환기를 사오지 않았을 뿐아니라 Fio 의 경우 무선으로 스케치를 올리는게 훨씬 편리합니다. 그러므로 간단히 Fio 를 무선으로 프로그래밍 하는 방법을 알아 보겠습니다.
XBee를 사용하기 전에 설정을 해줘야 합니다. XBeeConfigTool 를 사용해서 아래의 이미지와 같이 설정해 줍니다.
Serial Port 를 연결된 포트로 선택하고 PC 에 연결된 XBee 는 Programming radio, Fio 에 연결 될 XBee는 Arduino Fio radio 를 선택 해 줍니다. Fio 는 ATmega328 칩을 사용하므로 Baud rate 를 57600 으로 선택합니다. PAN ID 는 두 XBee 모두 동일하게 설정합니다. 여러 XBee 가 있을 때 구분하기 위한 ID 이므로 서로 통신 할 XBee 끼리 맞혀 주시면 됩니다. MY ID 는 PC용은 0, Fio 용은 1로 설정 하면 됩니다. 이건 radio 설정시 자동으로 설정됩니다.
설정을 다했으면 Configure 버튼을 눌러서 실제 XBee에 세팅 해 줍니다.
무선으로 스케치를 올리기 위해서는 RTS핀과 D3핀을 연결 해 줘야 합니다. 아래 이미지와 같이 간단하게 연결해 줍니다. 다른 분들은 납땜을 많이 하는데 저 같은 경우 스케치를 자주 올리지 않으므로 그냥 종이테이프로 붙혀 두었습니다. 납땜을 하셔도 무방합니다.
이후 과정은 제가 이전에 올린 post 와 동일 합니다. 모든 준비가 되었으면 이제 아두이노를 무선으로 사용 할 수 있습니다.
http://arduino.cc/en/Main/ArduinoBoardFioProgramming
아두이노 FIO 무선프로그래밍 + Nunchuk 연동 시연
첫번째로 as3glue 를 다운 받습니다. 아두이노와 플래시를 연동하기 위해서는 정확하게 3가지가 필요합니다. 아두이노에 올릴 스케치, 플래시와 아두이노를 이어줄 프록시서버 그리고 플래시를 만들기 위한 클라이언트 입니다. as3glue 프로젝트는 위에 언급한 3가지가 패키지로 모두 들어있습니다. 특히 플래시클라이언트가 as3 로 작성되어있어 사용하기 매우 편리합니다. 우선 위의 준비물에 있는 링크로 가서 as3Glue_v2_beta2.zip 파일을 다운 받습니다.

(이미지를 클릭하면 크게 볼 수 있습니다.) 압축을 풀면 위와 같은 폴더 구조입니다. 순서대로 applications 폴더에 있는 Serproxy-0.1.3-3 가 프록시 arduino 폴더에 있는 Firmata2 가 스케치 마지막으로 as3 폴더에 있는게 플래시용 클라이언트 입니다.
아두이노 IDE를 실행시키고 Firmata2 폴더에 있는 StandardFirmata.pde 를 열어서 아두이노에 올립니다.

serproxy 를 자신의 상황에 맞게 설정합니다. 아래는 제 serproxy.cfg 입니다.
# Config file for serproxy # See serproxy's README file for documentation # Transform newlines coming from the serial port into nils # true (e.g. if using Flash) or false newlines_to_nils=true # Default settings comm_baud=57600 comm_databits=8 comm_stopbits=1 comm_parity=none # Idle time out in seconds timeout=300 # Comm ports used comm_ports=1 # Set TCP port and serial port # you will have to change serial_device to reflect your configuration # use "ls /dev/cu.usb*" to look for your Arduino serial port. net_port1=5331 serial_device1=/dev/cu.usbserial-A700e17j
serproxy.cfg 를 메모장이나 vi 로 열어서 위와 같이 수정합니다. glue를 받아서 처음 serproxy.cfg 를 열었다면 위의 예제와 상당히 다를 수 있습니다. 그냥 위의 중요한 부분은 몇군데 안되므로 크게 걱정 할 필요 없습니다. 아 참고로 위의 설정은 MacOS 기준입니다. 윈도우의 경우 테스트는 해보지 않았지만 크게 다르지 않은 것 같습니다. 확인해야 하는 곳은 4군데 입니다. 우선 newlines_to_nils 값이 true 인지 확인 확인합니다. 다음 comm_baud 를 57600 을 설정합니다. net_port1은 플래시와 통신할 포트입니다. 기본은 5331 입니다. 마지막으로 serial_device1 값을 설정합니다. 이 값은 사용자 환경마다 다르니 자신의 /dev 폴더에서 확인하셔야 합니다. 윈도우의 경우 요 값만 없는 것 같습니다. 그러므로 윈도우사용자는 신경 안써도 될 것 같습니다.
설정은 완료하였으면 serproxy를 실행해 줍니다. 윈도우의 경우 serproxy.exe 맥사용자는 serproxy 를 실행합니다.

자 이제 아두이노와 플래시를 연동할 거의 모든 준비가 되었습니다. 위에서 준비한 플래시용 클라이언트를 이용해서 화면의 픽셀 컬러값을 아두이노에 설치한 3개의 LED 로 보내보도록 하겠습니다. glue 에 있는 examples 를 이용해서 바로 확인 할 수도 있습니다. ColorSelect 의 소스는 위의 준비물에서 받을 수 있습니다.
package
{
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.ColorTransform;
import net.eriksjodin.arduino.Arduino;
import net.eriksjodin.arduino.events.ArduinoEvent;
public class colorselect extends Sprite
{
private var a:Arduino;
private var _sheet:BitmapData;
private var _colorTransform:ColorTransform;
public function colorselect()
{
_colorTransform = new ColorTransform();
_sheet = new BitmapData(550, 400, false, 0);
_sheet.draw(this["mc_sheet"]);
// Arduion
a = new Arduino("127.0.0.1", 5331);
// listen for connection
a.addEventListener(Event.CONNECT,onSocketConnect);
a.addEventListener(Event.CLOSE,onSocketClose);
// listen for firmware (sent on startup)
a.addEventListener(ArduinoEvent.FIRMWARE_VERSION, onReceiveFirmwareVersion);
addEventListener(MouseEvent.MOUSE_MOVE, handleMouse);
}
private function handleMouse(e:MouseEvent):void
{
_colorTransform.color = _sheet.getPixel(mouseX, mouseY);
//trace(_colorTransform.redOffset, _colorTransform.greenOffset, _colorTransform.blueOffset);
a.writeAnalogPin(9, _colorTransform.redOffset);
a.writeAnalogPin(10, _colorTransform.greenOffset);
a.writeAnalogPin(11, _colorTransform.blueOffset);
}
// triggered when a serial socket connection has been established
private function onSocketConnect(e:Object):void {
trace("Socket connected!");
// request the firmware version
a.requestFirmwareVersion();
}
// triggered when a serial socket connection has been closed
private function onSocketClose(e:Object):void {
trace("Socket closed!");
}
// the firmware version is requested when the Arduino class has made a socket connection.
// when we receive this event we know that the Arduino has been successfully connected.
private function onReceiveFirmwareVersion(e:ArduinoEvent):void {
trace("Firmware version: " + e.value);
if(int(e.value)!=2) {
trace("Unexpected Firmware version encountered! This Version of as3glue was written for Firmata2.");
}
// the port value of an event can be used to determine which board the event was dispatched from
// this is one way of dealing with multiple boards, another is to add different listener methods
trace("Port: " + e.port);
// do some stuff on the Arduino...
initArduino();
}
private function initArduino():void {
trace("Initializing Arduino");
// set a pin to PWM
a.setPinMode(9, Arduino.PWM);
a.setPinMode(10, Arduino.PWM);
a.setPinMode(11, Arduino.PWM);
a.writeAnalogPin(9, 0);
a.writeAnalogPin(10, 0);
a.writeAnalogPin(11, 0);
}
}
}
뭐가 엄청 길어보이지만 이것 역시 중요한 부분은 몇군데 없습니다. a = new Arduino(“127.0.0.1”, 5331); 우선 아두이노 객체를 생성합니다. 127.0.0.1은 자신컴을 가리키는 ip 입니다. 5331은 아까 Serproxy에서 설정한 net_port1 입니다. 그리고 사용할 Pin을 설정합니다. 이번 예제의 경우 아날로그 출력을 할 것이므로 setPinMode 함수로 9, 10, 11 번을 PWM 으로 설정했습니다. 그리고 플래시에서 마우스 이동시 마다 각 픽셀의 RGB 값을 writeAnalogPin 함수로 3개의 LED를 세팅합니다. 이제 플래시를 퍼블리싱 해보도록 하겠습니다.

위와 같은 메세지가 출력되었다면 정상적으로 아두이노와 연결 된 것입니다.
아두이노와 플래시를 연동하면 무엇이 좋을까요? 우선 천번째로는 스케치를 새로 작성해서 아두이노에 올릴 필요가 없어 집니다. 두번째는 어려운 C가 아니라 AS3로 코드를 작성 할 수 있습니다. 세번째는 플래시의 다양한 인터렉티브 요소를 접목 할 수 있습니다. 아두이노로 플래시 애니메이션을 컨트롤 할 수 있고 반대도 가능합니다. 물론 인터넷 연결도 가능해 집니다. 아직은 제가 아두이노에 대해서 많이 모르기 때문에 더 큰 가능성에 대해 설명 할 수 없는게 아쉽네요. 하지만 이 정도로도 충분히 아두이노의 “생각하고, 실험하고 즐겨라!” 에 동참 할 수 있었지 않나 싶습니다.
]]>