LoginSignup
0
0

More than 5 years have passed since last update.

Processing > uartSender (v0.2) > ダミーデータ送信プログラム

Last updated at Posted at 2016-07-16
動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
Library: ControlP5
Library: Serial

Arduino IDEのSerial Plotterを置き換えるグラフソフトの実装において、COMポートからダミーデータを送信するエミュレータ?が欲しいので作成中。

v0.2 @ github

とりあえず、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週間前に始めたばかりなので、文法的によくない部分は色々ありそう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0