forked from: Arduino WiiNunchuck Demo

by kotobuki forked from Arduino WiiNunchuck Demo (diff: 51)
A simple example of how to connect a Wii Nunchuck to
an Arduino board via a WiiChuck adapter

You have to upload Firmata/I2CFirmata (included in Arduino 0017)
in prior to run this example

Reference
http://todbot.com/blog/2008/02/18/wiichuck-wii-nunchuck-adapter-available/

Hardware
http://www.switch-science.com/products/detail.php?product_id=221
http://store.fungizmos.com/index.php?main_page=product_info&cPath=69&products_id=212
http://www.sparkfun.com/commerce/product_info.php?products_id=9281
♥0 | Line 96 | Modified 2011-08-17 12:10:23 | MIT License
play

ActionScript3 source code

/**
 * Copyright kotobuki ( http://wonderfl.net/user/kotobuki )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/xp9Au
 */

// forked from kotobuki's Arduino WiiNunchuck Demo
// A simple example of how to connect a Wii Nunchuck to
// an Arduino board via a WiiChuck adapter
// 
// You have to upload Firmata/I2CFirmata (included in Arduino 0017)
// in prior to run this example
// 
// Reference
// http://todbot.com/blog/2008/02/18/wiichuck-wii-nunchuck-adapter-available/
// 
// Hardware
// http://www.switch-science.com/products/detail.php?product_id=221
// http://store.fungizmos.com/index.php?main_page=product_info&cPath=69&products_id=212
// http://www.sparkfun.com/commerce/product_info.php?products_id=9281

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.utils.getTimer;

    import org.papervision3d.cameras.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.objects.*;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.scenes.*;
    import org.papervision3d.view.*;

    import funnel.*;
    import funnel.gui.OnScreenController;
    import funnel.i2c.*;

    [SWF(backgroundColor="0x808080")]

    public class ArduinoI2CTest_Nunchuck extends BasicView {
        private var aio:Arduino;
        private var nunchuck:WiiNunchuck;
        private var joystickX:OnScreenController;
        private var joystickY:OnScreenController;
        private var accelX:OnScreenController;
        private var accelY:OnScreenController;
        private var accelZ:OnScreenController;
        private var zButton:OnScreenController;
        private var cButton:OnScreenController;

        // 立方体
        private var cube:Cube;

        public function ArduinoI2CTest_Nunchuck() {
            var config:Configuration = Arduino.FIRMATA;
            config.enablePowerPins();
            aio = new Arduino(config);
            aio.addEventListener(FunnelEvent.I2C_POWER_PINS_READY, onI2CPowerPinsReady);

            createGUI();

            // 立方体のためのマテリアルを準備
            var materialsList:MaterialsList = new MaterialsList();
            materialsList.addMaterial(new ColorMaterial(0xFF0000), "front");
            materialsList.addMaterial(new ColorMaterial(0x00FF00), "back");
            materialsList.addMaterial(new ColorMaterial(0x0000FF), "right");
            materialsList.addMaterial(new ColorMaterial(0xFFFF00), "left");
            materialsList.addMaterial(new ColorMaterial(0xFF00FF), "top");
            materialsList.addMaterial(new ColorMaterial(0x00FFFF), "bottom");

            // 立方体のインスタンスを生成
            cube = new Cube(materialsList, 200, 200, 200);
            scene.addChild(cube);

            // カメラをセット
            camera.x = 0;
            camera.y = 0;
            camera.z = -500;
            camera.focus = 500;
            camera.zoom = 1;

            // レンダリング開始
            startRendering();
        }

        private function onI2CPowerPinsReady(event:Event):void {
            nunchuck = new WiiNunchuck(aio);
            nunchuck.addEventListener(Event.CHANGE, onChange);
            addEventListener(Event.ENTER_FRAME, loop);
        }

        private function loop(event:Event):void {

        }

        private function onChange(e:Event):void {
            joystickX.value = nunchuck.joystickX;
            joystickY.value = nunchuck.joystickY;
            accelX.value = nunchuck.x;
            accelY.value = nunchuck.y;
            accelZ.value = nunchuck.z;
            cButton.value = nunchuck.cButton;
            zButton.value = nunchuck.zButton;
        }

        override protected function onRenderTick(event:Event = null):void {
            // 立方体の角度をセット
            var sensorX:Number = Math.max(Math.min(nunchuck.x, 1), -1);
            var sensorY:Number = Math.max(Math.min(nunchuck.y, 1), -1);
            
            cube.rotationZ = Math.asin(-sensorX) / Math.PI * 180;;
            cube.rotationX = Math.asin(sensorY) / Math.PI * 180;;

            // シーンをレンダリング
            renderer.renderScene(scene, camera, viewport);
        }

        private function createGUI():void {
            joystickX = new OnScreenController("Joy X", 128, OnScreenController.ANALOG, false, -1, 1);
            joystickX.y = 0;
            addChild(joystickX);

            joystickY = new OnScreenController("Joy Y", 128, OnScreenController.ANALOG, false, -1, 1);
            joystickY.y = 20;
            addChild(joystickY);

            accelX = new OnScreenController("Accel X", 128, OnScreenController.ANALOG, false, -1, 1);
            accelX.y = 40;
            addChild(accelX);

            accelY = new OnScreenController("Accel Y", 128, OnScreenController.ANALOG, false, -1, 1);
            accelY.y = 60;
            addChild(accelY);

            accelZ = new OnScreenController("Accel Z", 128, OnScreenController.ANALOG, false, -1, 1);
            accelZ.y = 80;
            addChild(accelZ);

            cButton = new OnScreenController("C", 58, OnScreenController.DIGITAL_TOGGLE, false);
            cButton.y = 100;
            addChild(cButton);

            zButton = new OnScreenController("Z", 58, OnScreenController.DIGITAL_TOGGLE, false);
            zButton.y = 120;
            addChild(zButton);
        }
    }
}