You are on page 1of 22

All sections to appear here

Flex :
R ealidade Aum entada e Arduíno

Adobe @ the Museum


Ligação Flex ao Arduíno
http://www.arduino.cc

http://code.google.com/p/arduino/downloads/list
http://www.cote.cc/blog/serialproxy-v014-can-use-com-ports-above-9
http://code.google.com/p/as3glue/downloads/list
Configuração SerialProxy
newlines_to_nils=false
# Comm ports used
comm_ports=10,2,3,4
# Default settings
comm_baud=57600
comm_databits=8
comm_stopbits=1
comm_parity=none
# Idle time out in seconds
timeout=300
# Port 10 settings (ttyS0)
net_port10=5331
# Port 2 settings (ttyS1)
net_port2=5332
# Port 3 settings (ttyS2)
net_port3=5333
# Port 4 settings (ttyS3)
net_port4=5334
• Copie a pasta Arduíno para o seu computador
• Ligue o Arduíno ao seu computador
– Windows Vista
– Windows 7
Windows 7
Windows 7 (cont.)
Windows 7 (cont.)
Windows 7 (drivers)
Flex Builder ®
AS3 Glue
Código AS3 apoiado pela Livraria Glue
+

Ligações do Arduíno a

- c
No Flex Builder®
package examples
{
// importação das bibliotecas do FLARManager cujo autor é Eric Socolofsky http://transmote.com/flar private var marker1:FLARMarker;
import com.transmote.flar.FLARManager; // variáveis para os videos
import com.transmote.flar.marker.FLARMarker; private var v1:Vid;
import com.transmote.flar.marker.FLARMarkerEvent; //Variáveis para modelo dae
import com.transmote.flar.utils.geom.FLARPVGeomUtils; private var pointLight3D:PointLight3D;
import com.transmote.utils.time.FramerateDisplay; private var phong:PhongMaterial;
//importação das bibliotecas de Flash private var modelContainer:DisplayObject3D;
import flash.display.Bitmap; private var model:DAE;
import flash.display.Sprite; private var daeFile:String;
import flash.events.Event; //Variáveis de som
import flash.events.MouseEvent; privatevar myURL:URLRequest = new URLRequest("../resources/assets/Adriana.mp3");
import flash.events.TimerEvent; private varmySong: Sound = new Sound(myURL);
import flash.filters.DropShadowFilter; // variáveis para os modelos mikumikudancee
import flash.media.Sound; public var pmd:MikuMikuDance;
import flash.media.SoundChannel; private var control:VMDController;
import flash.net.URLRequest; // Variáveis para o arduino
import flash.utils.Timer; protected var circuit:Arduino;
// Importação das bibliotecas do Arduino AS3 Glue //Variáveis para controlar a musica
import net.eriksjodin.arduino.Arduino; protected var channel:SoundChannel;
import net.eriksjodin.arduino.events.ArduinoEvent; protected var songTimer:Timer;
//Importação da Biblioteca de particulas que permite fazer nevar criada por Seb Lee-Delisle protected var myDelay:Timer = new Timer(1000);
import net.pluginmedia.pv3d.SnowStorm; protected var Position:Number = 0;
//Importação das bibliotecas que permitem a visualização modelo PMD 3D protected var tocar:Boolean = false;
import org.b2ox.pv3d.MikuMikuDance; protected var ligado:Boolean = false;
import org.b2ox.pv3d.MikuMikuDance.VMDController; // Declaramos a moldura que vai cobrir o écran
//Importação das biblioteca libspark [Embed(source = '../resources/assets/logo.png')] public var logoCls:Class;
import org.libspark.flartoolkit.support.pv3d.FLARCamera3D; //Função principal
//Importação da biblioteca papervision 3D public function StartAdobeAndArduino()
import org.papervision3d.cameras.*; {
import org.papervision3d.lights.PointLight3D; //Criamos as variáveis que vão receber os videos damos o caminho para os videos e paramos os videos
import org.papervision3d.materials.*; //se não os mesmos começavam a tocar mesmo sem os marcadores serem detectados.
import org.papervision3d.materials.shadematerials.PhongMaterial; v1 = new Vid();
import org.papervision3d.materials.utils.MaterialsList; v1.vid.source = "../resources/assets/t-rex.flv";
import org.papervision3d.objects.DisplayObject3D; v1.vid.stop();
import org.papervision3d.objects.parsers.DAE; //Chamamos a função que Carrega os modelos PMD 3D bem com depois inicia a função iniFLAR() que
import org.papervision3d.objects.primitives.*; //inicia o FLARManager que é a biblioteca que permite a utilização de multiplos marcadores
import org.papervision3d.render.LazyRenderEngine; loadingData();
import org.papervision3d.scenes.Scene3D; // inicia o arduino no local host e porta 5331
import org.papervision3d.view.Viewport3D; circuit = new Arduino("127.0.0.1", 5331);
circuit.requestFirmwareVersion();
// A class StartAdobeAndArduino irá estender a classe sprite circuit.addEventListener(ArduinoEvent.FIRMWARE_VERSION, iniciaarduino); // chama esta função para iniciar o
public class StartAdobeAndArduino extends Sprite }
{ private function iniciaarduino(e:ArduinoEvent):void
// criação das variáveis que iremos precisar {
private var fm:FLARManager; circuit.enableDigitalPinReporting(); // activa o relatório dos pinos digitais do arduino
private var scene:Scene3D; circuit.setPinMode(6,Arduino.OUTPUT); // diz ao arduino que este pino é usado como saida
private var view:Viewport3D; circuit.setPinMode(2,Arduino.OUTPUT);
private var camera:FLARCamera3D; circuit.setPinMode(3,Arduino.OUTPUT);
private var lre:LazyRenderEngine; circuit.setPinMode(4,Arduino.OUTPUT);
//Declaramos as variáveis que vão conter os Planos circuit.setPinMode(5,Arduino.OUTPUT);
private var plano:Plane; circuit.writeDigitalPin(2,Arduino.HIGH); // Manda o arduino activar este pino com 5 volts
//Declaramos as variáveis que vão conter os contentores
private var contentor:DisplayObject3D;
//Declaramos a variável das sombras nos objectos
private var dropShadowFilter:DropShadowFilter;
//Declaramos a variável da neve
private var neve:SnowStorm;
// Declaramos as variáveis que vão conter os marcadores
private var marker0:FLARMarker;
private function PiscaLEDs(event:TimerEvent):void{
circuit.writeDigitalPin(3,Arduino.HIGH); if(marker0 == null)
circuit.writeDigitalPin(4,Arduino.HIGH); {
circuit.writeDigitalPin(5,Arduino.HIGH); if (ligado==true){
} circuit.writeDigitalPin(2,Arduino.LOW);
protected function ActualizaLEDS(led1:Boolean, led2:Boolean, led3:Boolean, led4:Boolean):void circuit.writeDigitalPin(3,Arduino.LOW);
{ circuit.writeDigitalPin(4,Arduino.LOW);
circuit.writeDigitalPin(2,int(led1)); //escreve HIGH ou LOW conforme valor da variável led1 circuit.writeDigitalPin(5,Arduino.LOW);
circuit.writeDigitalPin(3,int(led2)); ligado=false;
circuit.writeDigitalPin(4,int(led3)); }else {
circuit.writeDigitalPin(5,int(led4)); ligado=true;
} circuit.writeDigitalPin(2,Arduino.HIGH);
protected function playSong():void circuit.writeDigitalPin(3,Arduino.HIGH);
{ circuit.writeDigitalPin(4,Arduino.HIGH);
if (tocar==false){ circuit.writeDigitalPin(5,Arduino.HIGH);
channel = mySong.play(Position); // continua a tocar apartir do ponto onde ficou }
songTimer = new Timer(25); // faz o update dos LEDS a cada 25ms. }else if (ligado==true){
songTimer.addEventListener(TimerEvent.TIMER, ActualizaSom); // chama a função que vai ver intensidade do som circuit.writeDigitalPin(6,Arduino.LOW);
songTimer.start(); ligado=false;
Position = channel.position; }else {
tocar=true; ligado=true;
} circuit.writeDigitalPin(6,Arduino.HIGH);
} }
private function stopSong():void }
{ // Função que carrega o Modelo PMD 3D
Position = channel.position;// guarda posição da música antes de a parar private function loadingData():void {
channel.stop(); // para a música pmd = new MikuMikuDance();
tocar=false;// actualiza a variável tocar pmd.loadPMD("../Data/nanoha1052.zip://nanoha1052.pmd", 15, afterLoading); // carrega o Mod
songTimer.stop(); // para o relógio da música }
songTimer.removeEventListener(TimerEvent.TIMER, ActualizaSom); // chama a função que vai ver intensidade do som //Carrega os Movimentos do modelo PMD 3D e depois chama a função iniFLAR
circuit.writeDigitalPin(2,Arduino.LOW); // desliga os pinos do Arduino private function afterLoading():void
circuit.writeDigitalPin(3,Arduino.LOW); {
circuit.writeDigitalPin(4,Arduino.LOW); pmd.loadVMD("../Data/motions.zip://popipo.vmd", "popipo");
circuit.writeDigitalPin(5,Arduino.LOW); pmd.loadVMD("../Data/motions.zip://WiM-DIVA.vmd", "test",
} function ():void {
protected function ActualizaSom(e:TimerEvent):void pmd.rotationX = 180;
{ pmd.rotationZ = 90;
// inicializa as variaveis para falso, de modo aos LED ficarem desligados pmd.scale = 1;
var led1:Boolean, led2:Boolean, led3:Boolean, led4:Boolean = false; pmd.looping = true;
var avgVol:Number = ((channel.leftPeak + channel.rightPeak) / 2); // acha a media entre canal esquerdo e direito. pmd.y=-50;
if (avgVol > .1) pmd.play();
{ iniFLAR(); // chamamos a função que inicia biblioteca FLARManager
led1 = true; } );
} }
if (avgVol > .25) //Função que inicia a biblioteca FLARManager que controla os marcadores
{ private function iniFLAR():void
led2 = true; {
} // Passamos o caminho onde está o ficheiro de configuração (xml) do FLARManager para o construt
if (avgVol > .5) // O FLARManager cria e usa uma FLARCameraSource por defeito.
{ // A imagem da primeira camara detectada será usada na detecção dos Marcadores.
led3 = true;
}
if (avgVol > .75)
{
led4 = true;
}
ActualizaLEDS(led1,led2,led3,led4);
}
//Função que faz piscar o LED ligado á porta 6 caso o marcador 0 esteja activo
//ou pisca os leds 2,3,4,5 se o marcador 0 não estiver activo
fm = new FLARManager("../resources/flar/flarConfig.xml"); //Define a quantidade de neve, o tamanho dos flocos de neve, e o tamanho do cubo onde os flocos vão cair
neve=new SnowStorm(100, .4,2000);
// Esperamos que o FLARManager inicialize antes de iniciar os motores 3D. scene.addChild(neve);
fm.addEventListener(Event.INIT, init3D); neve.y=1000;
// iniciamos a procura de eventos relacionados com marcadores (FLARMarkerEvents). neve.visible=false;
}
fm.addEventListener(FLARMarkerEvent.MARKER_ADDED, onAdded);
fm.addEventListener(FLARMarkerEvent.MARKER_REMOVED, onRemoved); // Função que espera que o FLARManager seja iniciado antes de começar os motores 3D (librarias)
fm.addEventListener(FLARMarkerEvent.MARKER_UPDATED, onUpdated); private function init3D(e:Event):void
// adicionamos FLARManager.flarSource á lista que vai ser apresentada por forma {
//uma vez que o FLARManager já foi iniciado retiramos a espera por esse evento
// a apresentar o video. fm.removeEventListener(Event.INIT, init3D);
addChild(Sprite(fm.flarSource)); //Criamos a cena 3D isto é o mundo que desejamos ver
// adicionamos a moldura ao ecrán scene = new Scene3D();
// A Camera utilizada aqui é a mesma que você já conhece do cinema, ela grava o que acontece no mundo
var logo:Bitmap = new logoCls(); // e projeta na tela (View Port).
addChild(logo); camera = new FLARCamera3D(fm.cameraParams);
myDelay.addEventListener(TimerEvent.TIMER, PiscaLEDs); camera.z = -200;
// O Viewport3D, fazendo uma analogia à tela de cinema é onde é projetado o filme para que seja possível assistí-lo.
}
// Portanto, é uma região retangular onde é projetado a Cena 3D.
// Função quando um marcador é encontrado adicionado view = new Viewport3D(stage.stageWidth, stage.stageHeight, true,true,false, false);
private function onAdded(e:FLARMarkerEvent):void //adicionamos ao motor 3D a cena a camara e o viewport que é a tela
{ lre = new LazyRenderEngine(scene, camera, view);
//Cria uma variável que adiciona sombra para o modelo collada
// se o marcador for igual ao padrão definido em flarConfig.xml //dropShadowFilter = new DropShadowFilter(distance, angle, color, alpha, x blur, y blur, strength, quality, inner shadow boolean, knockout boolean, hide object boolean);
// então iniciar o video ou animação correspondente dropShadowFilter = new DropShadowFilter(10, 0, 0x000000, .5, 5, 5, 1, 1,true);
if( e.marker.patternId==0){ //view.filters = [filter1 to apply, filter2 to apply];
view.filters = [dropShadowFilter];
marker0 = e.marker; // Cria o ponto de Luz o coloca o mesmo no espaço 3D
pmd.changeMotion("popipo"); pointLight3D = new PointLight3D(true);
pmd.visible = true; pointLight3D.x = 1000;
pointLight3D.y = 1000;
contentor.visible = true;
pointLight3D.z = -1000;
pmd.play(); //Chama a função que inicia a neve
neve.visible=true; initSnow();
playSong(); // Carrega o modelo Collada (Dae).
// (Os modelos Collada devem ser dimensionados e rodados de modo a ficarem escalados com o marcador;
} // atenção cada modelo é diferente
if( e.marker.patternId==1){ model = new DAE(true, "model", true);
myDelay.start(); model.load("../resources/assets/t-rex.dae");// terra
model.rotationX = 180;
marker1 = e.marker; model.rotationZ = 90;
model.visible=true; model.scale = 0.70;
modelContainer.visible=true; model.x= 0;
model.y= 0;
v1.vid.play();
model.z= 0;
} modelContainer = new DisplayObject3D();
} //adiciona o modelo ao contentor
// Função quando um marcador é removido ou perdido modelContainer.addChild(model);
modelContainer.visible = false;
private function onRemoved(e:FLARMarkerEvent):void // adicionamos o modemo VMD ao contentor
{ contentor = new DisplayObject3D();
// se o marcador for igual ao padrão definido em flarConfig.xml contentor.addChild(pmd);
pmd.visible = false;
// então parar o video ou animação correspondente contentor.visible = false;
if( e.marker.patternId==0){ //Adicionamos os contentores á cena
marker0 = null; scene.addChild(modelContainer);
scene.addChild(contentor);
pmd.visible = false; //Adicionamos a luza á cena
neve.visible=false; scene.addChild(pointLight3D)
stopSong(); //Adicionamos tudo ao Viewport para vermos na cena
} addChild(view);
// mostra o framerate para vermos a preformance pode ser retirado
if( e.marker.patternId==1){ addChild(new FramerateDisplay());
marker1 = null; //Por fim chamamos um evento de entrada em cada frame e a função loop que é onde aplicamos as matrizes de transformação
neve.visible=false; //e efectuamos o rendering da cena completa.
addEventListener(Event.ENTER_FRAME, loop);
model.visible=false; }
modelContainer.visible=false;
myDelay.stop(); // inicializamos a função que se repete para sempre
private function loop(e:Event):void
circuit.writeDigitalPin(6,Arduino.LOW); {
v1.vid.stop(); neve.update();
} if(marker0 != null)
} {
contentor.transform = FLARPVGeomUtils.convertFLARMatrixToPVMatrix(marker0.transformMatrix);//aplica a matriz de transformação
// Função quando um marcador é actualizado não usada }
private function onUpdated(e:FLARMarkerEvent):void if(marker1 != null)
{ {
modelContainer.transform = FLARPVGeomUtils.convertFLARMatrixToPVMatrix(marker1.transformMatrix);
trace("Update!"); }
} // Chamamos o motor de renderização
//Função que inicia a neve lre.render();
}
private function initSnow():void }
{ }
Sites úteis
• Serproxy
• Serialproxy 0.1.4 ( renomeado para Serproxy )
• http://www.cote.cc/blog/serialproxy-v014-can-use-com-ports-above-9
• Jean Philippe
• AS3 Glue
• http://code.google.com/p/as3glue/
• Erik Sjodin, eriksjodin.net
• SnowStorm particles
• Seb Lee-Delisle
• http://www.sebleedelisle.com
• FlarManager
• Eric Socolofsky
• http://transmote.com/flar
• FLARToolKit
• Saqoosha
• http://www.libspark.org/wiki/saqoosha/FLARToolKit/en
• MiKuMiKuDance
• b2ox
• http://www.libspark.org/browser/as3/FLARMMD/trunk/src/org/b2ox/pv3d
• Ferramentas para criar danças dos modelos 3D Miku
• http://www.geocities.jp/higuchuu4/index_e.htm

email: spsantossilva@gmail.com
Site: http://ssweb.org/video