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

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

新規登録して質問してみよう
ただいま回答率
87.20%
シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Processing

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

解決済

ArduinoとProcessingのシリアル通信

Aizawasan
Aizawasan

総合スコア1

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Processing

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

3回答

0評価

0クリップ

1260閲覧

投稿2021/11/09 13:43

編集2021/11/09 13:58

前提・実現したいこと

Arduinoで計測したデータをProcessing上で表示したい
ArduinoからSerial.writeで送ったデータはProcessing上で見ることができました.

今回は複数センサ(現状8個,将来的には倍)からの情報をProcessingで表示したいと考えています.
マイコンの入力の都合で現在はセンサ4つのみ(P1~P4)実装しています.

シリアル通信では,取得したセンサ値を8ビット二つに分けて送信し,通信の前後で符牒を入れる形にしたいと思っています.

参考にしたサイト https://garchiving.com/arduino-x-processing-serial-communication/
のコードを元に改変しています.

Processingのコンソール

Processing上のコンソールではoverflowと表示される
myPort.available()の数字が1000などすごい数字になっている(そもそもこれの意味がよく分かりません)

overflow 984 overflow 834 overflow

該当のソースコード

Arduino

void setup(){ Serial.begin( 57600 ); } void loop(){ int P1,P2,P3,P4,P5,P6,P7,P8; P1 = analogRead( A0 ); P2 = analogRead( A1 ); P3 = analogRead( A2 ); P4 = analogRead( A3 ); /* P1=map(P1, 0, 1023, 0, 255); P2=map(P2, 0, 1023, 0, 255); P3=map(P3, 0, 1023, 0, 255); P4=map(P4, 0, 1023, 0, 255); */ /* P1 = P1 * 5.0 / 1023.0; P2 = P2 * 5.0 / 1023.0; P3 = P3 * 5.0 / 1023.0; P4 = P4 * 5.0 / 1023.0; */ if (Serial.available() == 1) { byte inBuf[1]; Serial.readBytes(inBuf, 1); if (inBuf[0] == 's') { //ここに送信処理を記述 Serial.println("send"); digitalWrite(8,HIGH); byte outBuf[18]; outBuf[0] = 's'; // 1 outBuf[1] = (int16_t)(P1) >> 8; // 2 outBuf[2] = (int16_t)(P1) & 0xFF; // 3 outBuf[3] = (int16_t)(P2) >> 8; // 4 outBuf[4] = (int16_t)(P2) & 0xFF; // 5 outBuf[5] = (int16_t)(P3) >> 8; // 6 outBuf[6] = (int16_t)(P3) & 0xFF; // 7 outBuf[7] = (int16_t)(P4) >> 8; // 8 outBuf[8] = (int16_t)(P4) & 0xFF; // 9 outBuf[9] = (int16_t)(P5) >> 8; // 10 outBuf[10] = (int16_t)(P5) & 0xFF; // 11 outBuf[11] = (int16_t)(P6) >> 8; // 12 outBuf[12] = (int16_t)(P6) & 0xFF; // 13 outBuf[13] = (int16_t)(P7) >> 8; // 14 outBuf[14] = (int16_t)(P7) & 0xFF; // 15 outBuf[15] = (int16_t)(P8) >> 8; // 16 outBuf[16] = (int16_t)(P8) & 0xFF; // 17 outBuf[17] = 'e'; // 18 Serial.write(outBuf, 18); } else { while (Serial.available() > 0)Serial.read(); Serial.println("wait"); } } if (Serial.available() > 1) { while (Serial.available() > 0)Serial.read(); } Serial.print("P1: "); Serial.println(P1); /*Serial.print( "P1: " ); Serial.println( P1 ); Serial.print( "P2: " ); Serial.println( P2 ); Serial.print( "P3: " ); Serial.println( P3 ); Serial.print( "P4: " ); Serial.println( P4 ); Serial.write(P1); */ //delay( 100 ); } ### 該当のソースコード ```Processing import processing.serial.*; float P1, P2, P3, P4, P5, P6, P7, P8; int serialTimer; Serial myPort; int data; void setup() { size(500, 500); myPort = new Serial(this, Serial.list()[4], 57600); } void draw() { if (millis()-serialTimer > 50) { serialTimer = millis(); byte[] inBuf = new byte[18]; println(myPort.available()); if (myPort.available() == 18) { myPort.readBytes(inBuf); if (inBuf[0]=='s'&& inBuf[17]=='e') { P1 = (inBuf[1]<<8)+(inBuf[2]&0xff);; P2 = (inBuf[3]<<8)+(inBuf[4]&0xff);; P3 = (inBuf[5]<<8)+(inBuf[6]&0xff);; P4 = (inBuf[7]<<8)+(inBuf[8]&0xff);; P5 = (inBuf[9]<<8)+(inBuf[10]&0xff);; P6 = (inBuf[11]<<8)+(inBuf[12]&0xff);; P7 = (inBuf[13]<<8)+(inBuf[14]&0xff);; P8 = (inBuf[15]<<8)+(inBuf[16]&0xff);; } else { while (myPort.available()>0)myPort.read(); println("missMatch"); } } else if (myPort.available() > 18) { while (myPort.available()>0)myPort.read(); println("overflow"); } byte[] outBuf = new byte[1]; outBuf[0] = 's'; myPort.write(outBuf); } background(0); fill(240); textSize(24); text(nf(P1, 0, 2), 50, 50); text(nf(P2, 0, 2), 50, 80); text(nf(P3, 0, 2), 50, 110); text(nf(P4, 0, 2), 50, 140); text(nf(P5, 0, 2), 50, 170); text(nf(P6, 0, 2), 50, 200); text(nf(P7, 0, 2), 50, 230); text(nf(P8, 0, 2), 50, 260); }

試したこと

Processing側でmy Port .clear()を入れるなど
他ウェブ上の記事も参考にしましたが,分からなくなってきてしまい,質問させていただくことになりました.

参考記事https://garchiving.com/arduino-x-processing-serial-communication/のコードをそのまま使いましたが(ポート周りは設定し直しています),Processingのコンソール上ではoverflowの表示は出ませんでした.
使っているセンサが違うので,Arduino側でセンサ値を適当な定数にして試しましたが,Processing上では0.00の表示のままでした(通信できてない?)

###環境
Arduino1.8.15
Processing3.3.5

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Processing

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