センサ値の表示は、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 に入力された値を描画してくれる。



0 Comment:
コメントを投稿