Arduino とフォトレジスタと Adobe AIR

2010/05/03 time: 22:40
Arduino を購入する際、ブレッドボードやら抵抗やらが色々入っているセット「Arduinoをはじめようキット」で購入したので、同梱されていたフォトレジスタを使って実験してみる事に。
センサ値の表示は、Arduinoにはディスプレイが無いので、Arduinoを繋いだPC側のAIR(actionScrip3)で表示させる。

Arduinoとフォトレジスタの繋ぎ方は、「ArduinoでCDSを使ってみる」を参考に。


以下、Arduinoのプログラムと、AIRのプログラムと、serproxyの設定ファイル。

先ずはArduinoのプログラム。
ExampleにあるSimpleAnalogFirmataを改造。
アナログピンの値を読み取って、シリアル経由で送信するだけのプログラム。
#include <Firmata.h>

byte analogPin;

void setup()
{
    Firmata.setFirmwareVersion(0, 1);
    Firmata.begin(115200);
}

void loop()
{
    for(analogPin = 0; analogPin < 6; analogPin++) {
        Firmata.sendAnalog(analogPin, analogRead(analogPin)); 
    }
    delay(1000);
}

次にserproxy.cfgの設定内容。
基本的には、付属のserproxy.cfg.macそのまま。
serial_device1 を修正した位かな。
# Example configuration file for serproxy on Mac OS X
# For use with Firmata 2.0

# Do not Transform newlines coming from the serial port into nils
newlines_to_nils=false

# Comm ports used
comm_ports=1

# Default settings for Firmata 2.0
comm_baud=115200
comm_databits=8
comm_stopbits=1
comm_parity=none

# Idle time out in seconds
timeout=300

# 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-A800eyyB

最後にAIRのプログラム。
serproxyからのデータを受け取って、グラフ表示するプログラム。
グラフは50msec間隔で更新されていく。
Flex 4 SDK からグラフのコンポーネントが入っているから、Flex Builder無くても、
グラフのあるアプリが作れるようになったぽい。
下記プログラムと、net.eriksjodin.arduino.events.ArduinoEventと、net.eriksjodin.arduino.Arduinoを同じフォルダに配置し、amxmlcコマンドで下記プログラムをコンパイルすると、swfファイルが出来る。
それを、adlコマンドで実行すればよし。AIRの実行は、「Adobe AIRメモ」を参考に。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="init()">
  <mx:Script>
    <![CDATA[
      import mx.formatters.SwitchSymbolFormatter;
      import mx.collections.ArrayCollection;
      import net.eriksjodin.arduino.events.ArduinoEvent;
      import net.eriksjodin.arduino.Arduino;
      
      private var timer:Timer;
      private const portNumber:Number = 5331;
      private const hostAddress:String = "127.0.0.1";
      
      private var analog0:Number;
      
      private var timeNum:Number = 0;
      
      [Bindable]
      private var valueArray:ArrayCollection = new ArrayCollection();
      
      private var arduino:Arduino;
      
      private function init():void{
        timer = new Timer(50);
        timer.addEventListener(TimerEvent.TIMER, onTimerUpdate);
        
        arduino = new Arduino(hostAddress, portNumber);
        arduino.addEventListener(ArduinoEvent.ANALOG_DATA, onReceiveAnalogData);
        
        for(var i:int = 0; i<20; i++){
          var tmpItem:Object = new Object();
          tmpItem.x = -i;
          tmpItem.value = 0;
          valueArray.addItem(tmpItem);
          timeNum = -i;
        }
        
        timer.start();
        
        trace("start");
      }
      
      private function onTimerUpdate(event:TimerEvent):void{
        var tmp:Object = new Object();
        --timeNum;
        tmp.x = timeNum;
        tmp.analog0 = analog0;
        valueArray.addItemAt(tmp,0);
        valueArray.removeItemAt(valueArray.length-1);
      }
      
      private function onReceiveAnalogData(event:ArduinoEvent):void{
        switch(event.pin){
          case 0:
            analog0 = event.value;
          break;
        }
      }
      
    ]]>
  </mx:Script>
  

  <mx:LineChart id="analog0Line" dataProvider="{valueArray}">
    <mx:horizontalAxis>
      <mx:CategoryAxis dataProvider="{valueArray}" categoryField="x" />
    </mx:horizontalAxis>
    
    <mx:verticalAxis>
      <mx:LinearAxis maximum="1200" />
    </mx:verticalAxis>
    
    <mx:series>
      <mx:LineSeries displayName="Analog 0" yField="analog0"/>
    </mx:series>
  </mx:LineChart>
  <mx:Legend dataProvider="{analog0Line}"/>
  
</mx:WindowedApplication>


手順は、
1:Arduino SDK 使って、プログラムをArduinoへ書き込み。
2:serproxy.cfg の設定をして、serproxy を実行。
3:AIRを起動。

すると、下図のよう様な画面で、Analog PIN 0 に入力された値を描画してくれる。