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 arduino – sewonist.com https://sewonist.com sewonist = sewon + artist Fri, 10 Apr 2020 03:41:26 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 https://sewonist.com/wp-content/uploads/2015/08/cropped-sewonist-32x32.png arduino – sewonist.com https://sewonist.com 32 32 as3-arduino-connector 의 활용 https://sewonist.com/as3-arduino-connector-%ec%9d%98-%ed%99%9c%ec%9a%a9/ https://sewonist.com/as3-arduino-connector-%ec%9d%98-%ed%99%9c%ec%9a%a9/#comments Wed, 08 Aug 2012 07:05:55 +0000 https://sewonist.com/?p=2931 Read More »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"/>
</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 를 이용하면 시리얼포트를 이용 한 다양한 장비를 플래시에서 쉽게 제어 및 사용 할 수 있습니다. 이를 통해 더욱 멋진 인터렉티브 컨텐츠가 만들어 지길 기대해 봅니다.

]]>
https://sewonist.com/as3-arduino-connector-%ec%9d%98-%ed%99%9c%ec%9a%a9/feed/ 2
Arduino Fio & XBee Programming https://sewonist.com/arduino-fio-xbee-programming/ https://sewonist.com/arduino-fio-xbee-programming/#respond Sun, 03 Jul 2011 03:29:52 +0000 https://sewonist.com/?p=2427 Read More »Arduino Fio & XBee Programming]]> Arduion Fio 는 휴대형태의 아두이노 입니다. 기존의 아두이노보다 경량화 되어있고 배터리를 장착해서 전원케이블 없이 사용 할 수 있습니다. 자세한 정보는 링크 에서 확인 할 수 있습니다. 그리고 XBee 는 무선통신 모듈입니다. 이 두개를 조합하면 아두이노를 무선으로 사용 할 수 있게 됩니다.

아두이노를 사용하기 위해서는 스케치라는 아두이노용 언어를 아두이노에 올려야 하는데 Fio 의 경우 유선으로 하기 위해서는 USB 시리얼 변환기가 필요합니다. 그런데 제가 한국에서 이 변환기를 사오지 않았을 뿐아니라 Fio 의 경우 무선으로 스케치를 올리는게 훨씬 편리합니다. 그러므로 간단히 Fio 를 무선으로 프로그래밍 하는 방법을 알아 보겠습니다.

1. 준비물

2. XBee Config

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에 세팅 해 줍니다.

3. XBee explorer

무선으로 스케치를 올리기 위해서는 RTS핀과 D3핀을 연결 해 줘야 합니다. 아래 이미지와 같이 간단하게 연결해 줍니다. 다른 분들은 납땜을 많이 하는데 저 같은 경우 스케치를 자주 올리지 않으므로 그냥 종이테이프로 붙혀 두었습니다. 납땜을 하셔도 무방합니다.

이후 과정은 제가 이전에 올린 post 와 동일 합니다. 모든 준비가 되었으면 이제 아두이노를 무선으로 사용 할 수 있습니다.

참고

http://arduino.cc/en/Main/ArduinoBoardFioProgramming
아두이노 FIO 무선프로그래밍 + Nunchuk 연동 시연

]]>
https://sewonist.com/arduino-fio-xbee-programming/feed/ 0
Arduino + Flash = Fun https://sewonist.com/arduino-flash-fun/ https://sewonist.com/arduino-flash-fun/#comments Sun, 27 Jun 2010 12:25:20 +0000 https://sewonist.com/?p=1037 Read More »Arduino + Flash = Fun]]> 아두이노란? 아두이노는 매우 쉽고 간단한 피지컬 컴퓨터 플랫폼입니다. 하지만 아주 강력하지요. 주말동안 가지고 놀아 본 아두이노는 아주 약간의 전자 지식만 있으면 매우 흥미있고 재밌는 것들을 만들 수 있을 것 같았습니다. 기본적으로 아두이노는 독립적으로 작동할 수 있지만 저는 항상 뭐든 플래시와 연관시키므로 이번에도 플래시와의 연동을 알아보겠습니다.

0. 준비물

1. as3glue

첫번째로 as3glue 를 다운 받습니다. 아두이노와 플래시를 연동하기 위해서는 정확하게 3가지가 필요합니다. 아두이노에 올릴 스케치, 플래시와 아두이노를 이어줄 프록시서버 그리고 플래시를 만들기 위한 클라이언트 입니다. as3glue 프로젝트는 위에 언급한 3가지가 패키지로 모두 들어있습니다. 특히 플래시클라이언트가 as3 로 작성되어있어 사용하기 매우 편리합니다. 우선 위의 준비물에 있는 링크로 가서 as3Glue_v2_beta2.zip 파일을 다운 받습니다.

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

2. Firmata2

아두이노 IDE를 실행시키고 Firmata2 폴더에 있는 StandardFirmata.pde 를 열어서 아두이노에 올립니다.

3. Serproxy

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 를 실행합니다.

4. Flash

자 이제 아두이노와 플래시를 연동할 거의 모든 준비가 되었습니다. 위에서 준비한 플래시용 클라이언트를 이용해서 화면의 픽셀 컬러값을 아두이노에 설치한 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를 세팅합니다. 이제 플래시를 퍼블리싱 해보도록 하겠습니다.

위와 같은 메세지가 출력되었다면 정상적으로 아두이노와 연결 된 것입니다.

5. Result

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

]]>
https://sewonist.com/arduino-flash-fun/feed/ 4