実現したいこと
ArduinoIDEからProcessingにデータを送ってリアルタイムでグラフを表示したいです。
具体的には、M5stickCPlus2で取得した三軸加速度データをArduinoIDEで取得し、そのデータをProcessingを使ってグラフ表示させたいです。
https://qiita.com/TK303/items/7ddd816efac248e7a248
このサイトを参考にしました。
発生している問題・分からないこと
Processing側にエラーが出ます。
エラーが出るものの、まっすぐの線のグラフはなぜか出てきます。
エラーメッセージ
error
1NullPointerException 2
該当のソースコード
arduinoのコード
1/** 2 * @file imu.ino 3 * @author SeanKwok (shaoxiang@m5stack.com) 4 * @brief M5StickCPlus2 get IMU data 5 * @version 0.1 6 * @date 2023-12-19 7 * 8 * 9 * @Hardwares: M5StickCPlus2 10 * @Platform Version: Arduino M5Stack Board Manager v2.0.9 11 * @Dependent Library: 12 * M5GFX: https://github.com/m5stack/M5GFX 13 * M5Unified: https://github.com/m5stack/M5Unified 14 * M5StickCPlus2: https://github.com/m5stack/M5StickCPlus2 15 */ 16 17#include "M5StickCPlus2.h" 18 19//class MPU6886 { 20 //public: 21 //enum Ascale { AFS_2G = 0, AFS_4G, AFS_8G, AFS_16G }; 22 23 24 //Ascale Acscale = AFS_16G; 25 26//}; 27 28void setup() { 29 Serial.begin(115200); 30 auto cfg = M5.config(); 31 StickCP2.begin(cfg); 32 StickCP2.Display.setRotation(0); 33 StickCP2.Display.setTextColor(GREEN); 34 StickCP2.Display.setTextDatum(middle_center); 35 StickCP2.Display.setFont(&fonts::FreeSansBold9pt7b); 36 StickCP2.Display.setTextSize(1); 37} 38 39void loop(void) { 40 auto imu_update = StickCP2.Imu.update(); 41 if (imu_update) { 42 StickCP2.Display.setCursor(0, 40); 43 StickCP2.Display.clear(); // Delay 100ms 延迟100ms 44 45 auto data = StickCP2.Imu.getImuData(); 46 47 // The data obtained by getImuData can be used as follows. 48 float accel_x = data.accel.x; // accel x-axis value. 49 float accel_y = data.accel.y; // accel y-axis value. 50 float accel_z = data.accel.z; // accel z-axis value. 51 // data.accel.value; // accel 3values array [0]=x / [1]=y / [2]=z. 52 53 // data.gyro.x; // gyro x-axis value. 54 // data.gyro.y; // gyro y-axis value. 55 // data.gyro.z; // gyro z-axis value. 56 // data.gyro.value; // gyro 3values array [0]=x / [1]=y / [2]=z. 57 58 // data.value; // all sensor 9values array [0~2]=accel / [3~5]=gyro / 59 // // [6~8]=mag 60 61 //Serial.printf("ax:%f\r\n", accel_x); 62 //Serial.printf("ay:%f\r\n", accel_y); 63 //Serial.printf("az:%f\r\n", accel_z); 64 //Serial.printf("ax:%f ay:%f az:%f\r\n", accel_x, accel_y, accel_z); 65 //Serial.printf("gx:%f gy:%f gz:%f\r\n", data.gyro.x, data.gyro.y, data.gyro.z); 66 //ジャイロはいらないから消す 67 68 StickCP2.Display.printf("IMU:\r\n"); 69 StickCP2.Display.printf("X:%0.2f\r\n", accel_x); //数字を小数点第 1 位まで切り上げる 70 StickCP2.Display.printf("Y:%0.2f\r\n", accel_y); 71 StickCP2.Display.printf("Z:%0.2f\r\n", accel_z); 72 //StickCP2.Display.printf("%0.2f %0.2f %0.2f\r\n", accel_x, accel_y, accel_z); 73 //StickCP2.Display.printf("%0.2f %0.2f %0.2f\r\n", data.gyro.x, data.gyro.y, data.gyro.z); 74 75 Serial.print("@SENSOR:"); 76 Serial.print(accel_x); Serial.print(","); 77 Serial.print(accel_y); Serial.print(","); 78 Serial.print(accel_z); Serial.println(""); 79 80 delay(20); 81 } 82 delay(100); 83} 84
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 library 44 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 SensorData 71{ 72 float AcclX, AcclY, AcclZ; 73 74 // constructor 75 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}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
解決法が分かりませんでした。
補足
特になし