動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
Library: ControlP5
Library: Serial
Arduino IDEのSerial Plotterを置き換えるグラフソフトの実装において、COMポートからダミーデータを送信するエミュレータ?が欲しいので作成中。
とりあえず、sine curveを送信できるようにはなった。
- 下記、1列目はソフト起動時からの経過時間(秒)
- 2列目はsine curve (10秒周期)
結果
3,2.99
4,1.85
5,-0.00
6,-1.85
7,-2.99
8,-2.99
9,-1.85
10,0.00
11,1.85
12,2.99
13,2.99
実行環境
- シリアル送信側: processingを動かすPC (Windows 8.1pro)
- シリアル受信側: TeraTermで受信する (Windows 7 pro)
上記の2つの端末をシリアルのケーブル(クロス)で接続する。
こちらではVMイメージ2つにてnamed pipeを使っての動作をした。
受信側のTeraTermでは「設定 > 端末」にて[CR]を[CR+LF]に変更する。LFを終端として認識するため。
code
import processing.serial.*;
import controlP5.*;
/*
* v0.2 2016 Jul. 17
* - add getIntervaledValue()
* v0.1 2016 Jul. 16
* - send text through COM port
* - add sendTestString() to send interval
* - add 1 second interval in draw()
* - add button to open COM port
* - add slider for COM port setting
*/
Serial myPort;
ControlP5 slider;
int sliderValue;
final int numSerial = 5;
int curSerial = -1;
int previousSecond = -1;
ControlP5 btnOpen;
void setup() {
size(500,500);
frameRate(10);
slider = new ControlP5(this);
slider.addSlider("COM")
.setRange(-1, numSerial - 1)
.setValue(-1)
.setPosition(50,40)
.setSize(200, 20)
.setNumberOfTickMarks(numSerial + 1);
btnOpen = new ControlP5(this);
btnOpen.addButton("openPort")
.setLabel("Open")
.setPosition(275, 40)
.setSize(100, 30);
}
void controlEvent(ControlEvent theEvent) {
if (theEvent.isController()) {
if (theEvent.getName() == "COM") {
if (curSerial != slider.getValue("COM")) {
curSerial = (int)slider.getValue("COM");
}
}
}
}
void serialEvent(Serial myPort) {
//String mystr = myPort.readStringUntil('\n');
//mystr = trim(mystr);
//println(mystr);
}
void openPort() {
println("Open Port");
if (myPort != null) {
myPort.stop();
}
myPort = new Serial(this, Serial.list()[(int)curSerial], 9600);
myPort.bufferUntil('\n');
}
float getIntervaledValue(float amplitude, int elapsed_sec)
{
final float pi = acos(-1.0);
final float itvl_sec = 10;
float ret = amplitude * sin(2 * pi * elapsed_sec / itvl_sec);
return ret;
}
void sendTestString()
{
if (myPort == null) {
return;
}
int elapsed_sec = millis() / 1000;
String wrkstr;
if (curSerial >= 0) {
String ret = str(elapsed_sec);
wrkstr = String.format("%.2f", getIntervaledValue(/*amplitude=*/3.14, elapsed_sec) );
ret = ret + "," + wrkstr;
ret = ret + "\r\n";
// ret = ret + ",3.14, 2.71, 6.022, 1023\r\n";
// println(ret);
myPort.write(ret);
}
}
void draw() {
background(0);
// for 1 second interval
int curSec = second();
if (curSec == previousSecond) {
return;
}
previousSecond = curSec;
//
sendTestString();
}
補足
javaは(おそらく)1週間前に始めたばかりなので、文法的によくない部分は色々ありそう。