ArduinoIDEからProcessingにデータを送ってリアルタイムでグラフを表示したい

processingのコード

1import processing.serial.*;2import controlP5.*;3 4ControlP5 cp5;5Chart chart_accel;6final int NUM_GRAPH_DATA = 200; /* グラフ1軸あたりのデータ数 */7Serial m_myPort;8SensorData m_sensor_data;9 10void setup()11{12 // 画面の表示サイズ13 size(650, 700);14 15 // シリアル通信の設定16 //println(Serial.list());17 //String portName = Serial.list()[2]; /* USB-Serial(COM9)を選択する */18 //println(portName);19 //m_myPort = new Serial(this, portName, 115200);20 21 println(Serial.list());22 String desiredPort = "COM5"; // 使用したいポート名23 String portName = null;24 String[] ports = Serial.list();25 for (int i = 0; i < ports.length; i++) {26 if (ports[i].equals(desiredPort)) {27 portName = ports[i];28 break;29 }}30 if (portName != null) {31 println("Selected port: " + portName);32 m_myPort = new Serial(this, portName, 115200);33 } 34 else {35 println("Error: Desired port not found.");36 exit(); // プログラムを終了するか、適切なエラーハンドリングを追加37 }38 39 40 // 画面表示の更新レート(Hz) 41 frameRate(200);42 43 // graph by ControlP5 library44 cp5 = new ControlP5(this);45 46 // 加速度のグラフ設定47 chart_accel = cp5.addChart("Accel sensor");48 chart_accel.setView(Chart.LINE) /* グラフの種類(折れ線グラフ) */49 .setRange(-20000, 20000) /* 値の範囲(最小値、最大値) */50 .setSize(600, 200) /* グラフの表示サイズ */51 .setPosition(10, 250) /* グラフの表示位置 */52 .setColorCaptionLabel(color(0,0,255)) /* キャプションラベルの色 */53 .setStrokeWeight(1.5) /* グラフの線の太さを設定する */54 .getColor().setBackground(color(224, 224, 224)) /* グラフの背景色を設定する */55 ;56 57 setupChartAttr(chart_accel, "accel_x", color(0, 0, 192));58 setupChartAttr(chart_accel, "accel_y", color(192, 0, 0));59 setupChartAttr(chart_accel, "accel_z", color(0, 192, 0));60 61}62 63void setupChartAttr(Chart chart, String axis_name, int col)64{65 chart.addDataSet(axis_name);66 chart.setData(axis_name, new float[NUM_GRAPH_DATA]);67 chart.setColors(axis_name, col, color(255,255,128));68}69 70class SensorData71{72 float AcclX, AcclY, AcclZ;73 74 // constructor75 SensorData()76 {77 AcclX = AcclY = AcclZ = 0;78 79 }80 81 //82 void setPacket(int[] packet)83 {84 if (packet.length < 3)85 {86 return;87 }88 89 AcclX = packet[0];90 AcclY = packet[1];91 AcclZ = packet[2];92 93 }94};95 96void serialEvent(Serial myPort) { 97 98 String mystr = myPort.readStringUntil('\n');99 if (mystr != null) {100 mystr = trim(mystr);101 println("Received: " + mystr); // 受信データを表示102 103 String[] str_array = split(mystr, ":");104 if (str_array.length > 1 && str_array[0].equals("@SENSOR")) {105 SensorData s_data = new SensorData();106 int[] sensorValues = int(split(str_array[1], ","));107 if (sensorValues.length >= 3) {108 s_data.setPacket(sensorValues);109 m_sensor_data = s_data;110 } else {111 println("Sensor values length is less than expected: " + sensorValues.length);112 }113 }114 }115}116 117 118 //String[] str_array = split(mystr, ":");119 //if (str_array[0].equals("@SENSOR"))120 //{121 //SensorData s_data = new SensorData();122 //s_data.setPacket(int(split(str_array[1], ",")));123 //m_sensor_data = s_data;124 //}125 //}126 127 128void draw()129{130 background(#EEEEEE);131 132 if (m_sensor_data != null)133 {134 chart_accel.unshift("AccelX", m_sensor_data.AcclX);135 chart_accel.unshift("AccelY", m_sensor_data.AcclY);136 chart_accel.unshift("AccelZ", m_sensor_data.AcclZ);137 138 m_sensor_data = null;139 }140}

コメントを投稿

0 コメント