質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

1回答

320閲覧

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

hina20021009

総合スコア0

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2024/05/29 10:49

実現したいこと

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等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

解決法が分かりませんでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2024/05/29 21:52

「試したこと、調べたこと」は「調べた」という行為についてのあなたの頑張ったアピールではありません。どういうキーワードで検索したらなにが引っかかった、それが理解出来たできなかった、等など書いてください。 とりあえず"NullPointerException"について調べてその内容について考えたことを書いてみましょう。
TN8001

2024/05/30 09:39

デバイスがないので未確認ですが、こちらと同じ事象ではないでしょうか。 [Arduinoとprocessingシリアル通信。NullPointerExceptionの解決方法を教えてください!!](https://teratail.com/questions/231988) --- float値を送っているように見えますが、intにしてしまう(106行目)とグラフがガタガタになりそうな...
thkana

2024/06/01 08:11

「試したこと、調べたこと」は「調べた」という行為についてのあなたの頑張ったアピールではありません。どういう情報を得て どういうキーワードで検索したらなにが引っかかった、それが理解出来たできなかった、等など書いてください。 とりあえず"NullPointerException"について調べてその内容について考えたことを書いてみましょう。
guest

回答1

0

自分が何を間違ったかを探そうとせずに漠然と検索しても何かが見付かることはないと思います。

NullPointerExceptionで止まっている行は
chart_accel.unshift("AccelX", m_sensor_data.AcclX);
ですね?
では、まずやることはいきなり「検索」ではなく、その行の精査でしょう。
登場するオブジェクトはchart_accelとm_sensor_dataですが、これらはnullではありませんか? それらがnullでないとすれば、処理の内部でnullPointerへのアクセスが発生していることになります。その切り分けをします。
まさにエラーの発生している呼び出し、Chart.unshiftに与えるパラメータは適切ですか? ドキュメントを調べましょう。unshiftの第一パラメータはオブジェクトのラベル(名前)のはずです。オブジェクトを生成したときのラベルと正確に一致していますか? こういうところはそれぞれバラバラにリテラル(定数)を書き込むのではなく、何らかの変数に(できれば定数/finalとして)値を与えて、その変数を共通に使うことで一致を確保すべきです。

その先もまだ色々ありそうですが、違うことを聞くなら質問を新しくしてくださいね。

投稿2024/06/01 10:11

thkana

総合スコア7681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問