前提・実現したいこと
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
1void setup(){ 2 Serial.begin( 57600 ); 3} 4 5void loop(){ 6 int P1,P2,P3,P4,P5,P6,P7,P8; 7 P1 = analogRead( A0 ); 8 P2 = analogRead( A1 ); 9 P3 = analogRead( A2 ); 10 P4 = analogRead( A3 ); 11 12/* 13 P1=map(P1, 0, 1023, 0, 255); 14 P2=map(P2, 0, 1023, 0, 255); 15 P3=map(P3, 0, 1023, 0, 255); 16 P4=map(P4, 0, 1023, 0, 255); 17*/ 18/* 19 P1 = P1 * 5.0 / 1023.0; 20 P2 = P2 * 5.0 / 1023.0; 21 P3 = P3 * 5.0 / 1023.0; 22 P4 = P4 * 5.0 / 1023.0; 23*/ 24 25 if (Serial.available() == 1) { 26 byte inBuf[1]; 27 Serial.readBytes(inBuf, 1); 28 if (inBuf[0] == 's') { 29 //ここに送信処理を記述 30 Serial.println("send"); 31 digitalWrite(8,HIGH); 32 byte outBuf[18]; 33 34 outBuf[0] = 's'; // 1 35 outBuf[1] = (int16_t)(P1) >> 8; // 2 36 outBuf[2] = (int16_t)(P1) & 0xFF; // 3 37 outBuf[3] = (int16_t)(P2) >> 8; // 4 38 outBuf[4] = (int16_t)(P2) & 0xFF; // 5 39 outBuf[5] = (int16_t)(P3) >> 8; // 6 40 outBuf[6] = (int16_t)(P3) & 0xFF; // 7 41 outBuf[7] = (int16_t)(P4) >> 8; // 8 42 outBuf[8] = (int16_t)(P4) & 0xFF; // 9 43 outBuf[9] = (int16_t)(P5) >> 8; // 10 44 outBuf[10] = (int16_t)(P5) & 0xFF; // 11 45 outBuf[11] = (int16_t)(P6) >> 8; // 12 46 outBuf[12] = (int16_t)(P6) & 0xFF; // 13 47 outBuf[13] = (int16_t)(P7) >> 8; // 14 48 outBuf[14] = (int16_t)(P7) & 0xFF; // 15 49 outBuf[15] = (int16_t)(P8) >> 8; // 16 50 outBuf[16] = (int16_t)(P8) & 0xFF; // 17 51 outBuf[17] = 'e'; // 18 52 53 54 Serial.write(outBuf, 18); 55 } 56 else { 57 while (Serial.available() > 0)Serial.read(); 58 Serial.println("wait"); 59 60 } 61 } 62 if (Serial.available() > 1) { 63 while (Serial.available() > 0)Serial.read(); 64 } 65 66 Serial.print("P1: "); 67 Serial.println(P1); 68 /*Serial.print( "P1: " ); 69 Serial.println( P1 ); 70 Serial.print( "P2: " ); 71 Serial.println( P2 ); 72 Serial.print( "P3: " ); 73 Serial.println( P3 ); 74 Serial.print( "P4: " ); 75 Serial.println( P4 ); 76 77 Serial.write(P1); 78 */ 79 //delay( 100 ); 80} 81### 該当のソースコード 82 83```Processing 84import processing.serial.*; 85float P1, P2, P3, P4, P5, P6, P7, P8; 86int serialTimer; 87Serial myPort; 88 89 90int data; 91 92void setup() 93{ 94 size(500, 500); 95 myPort = new Serial(this, Serial.list()[4], 57600); 96} 97 98void draw() { 99 if (millis()-serialTimer > 50) { 100 serialTimer = millis(); 101 byte[] inBuf = new byte[18]; 102 println(myPort.available()); 103 if (myPort.available() == 18) { 104 myPort.readBytes(inBuf); 105 if (inBuf[0]=='s'&& inBuf[17]=='e') { 106 P1 = (inBuf[1]<<8)+(inBuf[2]&0xff);; 107 P2 = (inBuf[3]<<8)+(inBuf[4]&0xff);; 108 P3 = (inBuf[5]<<8)+(inBuf[6]&0xff);; 109 P4 = (inBuf[7]<<8)+(inBuf[8]&0xff);; 110 P5 = (inBuf[9]<<8)+(inBuf[10]&0xff);; 111 P6 = (inBuf[11]<<8)+(inBuf[12]&0xff);; 112 P7 = (inBuf[13]<<8)+(inBuf[14]&0xff);; 113 P8 = (inBuf[15]<<8)+(inBuf[16]&0xff);; 114 115 116 } else { 117 while (myPort.available()>0)myPort.read(); 118 println("missMatch"); 119 } 120 } else if (myPort.available() > 18) { 121 while (myPort.available()>0)myPort.read(); 122 println("overflow"); 123 } 124 byte[] outBuf = new byte[1]; 125 outBuf[0] = 's'; 126 127 myPort.write(outBuf); 128 } 129 130 background(0); 131 fill(240); 132 textSize(24); 133 text(nf(P1, 0, 2), 50, 50); 134 text(nf(P2, 0, 2), 50, 80); 135 text(nf(P3, 0, 2), 50, 110); 136 text(nf(P4, 0, 2), 50, 140); 137 text(nf(P5, 0, 2), 50, 170); 138 text(nf(P6, 0, 2), 50, 200); 139 text(nf(P7, 0, 2), 50, 230); 140 text(nf(P8, 0, 2), 50, 260); 141}
試したこと
Processing側でmy Port .clear()を入れるなど
他ウェブ上の記事も参考にしましたが,分からなくなってきてしまい,質問させていただくことになりました.
参考記事https://garchiving.com/arduino-x-processing-serial-communication/のコードをそのまま使いましたが(ポート周りは設定し直しています),Processingのコンソール上ではoverflowの表示は出ませんでした.
使っているセンサが違うので,Arduino側でセンサ値を適当な定数にして試しましたが,Processing上では0.00の表示のままでした(通信できてない?)
###環境
Arduino1.8.15
Processing3.3.5
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/09 22:46
2021/11/10 02:23
退会済みユーザー
2024/02/10 23:58 編集
2024/02/11 03:13 編集
2024/02/11 12:00